XenosRecomp/ShaderRecomp/shader_recompiler.h
Skyth (Asilkan) f936ed2212
Specialization constants, reverse Z and smol-v implementation. (#2)
* Specialization constant & DXIL library implementation.

* Fix alpha to coverage.

* Add reverse Z implementation.

* Avoid dynamic branches when loading array constants.

* Remove "has bone" specialization constant.

* Integrate smol-v.
2024-11-29 23:14:08 +03:00

53 lines
1.6 KiB
C++

#pragma once
#include "shader.h"
#include "shader_code.h"
struct StringBuffer
{
std::string out;
template<class... Args>
void print(std::format_string<Args...> fmt, Args&&... args)
{
std::vformat_to(std::back_inserter(out), fmt.get(), std::make_format_args(args...));
}
template<class... Args>
void println(std::format_string<Args...> fmt, Args&&... args)
{
std::vformat_to(std::back_inserter(out), fmt.get(), std::make_format_args(args...));
out += '\n';
}
};
struct ShaderRecompiler : StringBuffer
{
uint32_t indentation = 0;
bool isPixelShader = false;
const uint8_t* constantTableData = nullptr;
std::unordered_map<uint32_t, VertexElement> vertexElements;
std::unordered_map<uint32_t, std::string> interpolators;
std::unordered_map<uint32_t, const ConstantInfo*> float4Constants;
std::unordered_map<uint32_t, const char*> boolConstants;
std::unordered_map<uint32_t, const char*> samplers;
std::unordered_map<uint32_t, uint32_t> ifEndLabels;
uint32_t specConstantsMask = 0;
bool hasMtxProjection = false;
bool hasMtxPrevInvViewProjection = false;
void indent()
{
for (uint32_t i = 0; i < indentation; i++)
out += '\t';
}
void printDstSwizzle(uint32_t dstSwizzle, bool operand);
void printDstSwizzle01(uint32_t dstRegister, uint32_t dstSwizzle);
void recompile(const VertexFetchInstruction& instr, uint32_t address);
void recompile(const TextureFetchInstruction& instr, bool bicubic);
void recompile(const AluInstruction& instr);
void recompile(const uint8_t* shaderData, const std::string_view& include);
};