mirror of
https://github.com/hedge-dev/XenosRecomp.git
synced 2025-10-30 07:12:17 +00:00
Separate texture dimensions to multiple descriptor indices.
This commit is contained in:
parent
25b4f604af
commit
5f6a8e6c2a
3 changed files with 48 additions and 28 deletions
|
|
@ -26,6 +26,10 @@ target_link_libraries(ShaderRecomp PRIVATE
|
||||||
|
|
||||||
target_precompile_headers(ShaderRecomp PRIVATE pch.h)
|
target_precompile_headers(ShaderRecomp PRIVATE pch.h)
|
||||||
|
|
||||||
add_compile_definitions(ShaderRecomp _CRT_SECURE_NO_WARNINGS)
|
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||||
|
target_compile_options(ShaderRecomp PRIVATE -Wno-switch -Wno-unused-variable)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
target_compile_definitions(ShaderRecomp PRIVATE _CRT_SECURE_NO_WARNINGS)
|
||||||
|
|
||||||
file(COPY ${PACKAGE_PREFIX_DIR}/bin/dxil.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
|
file(COPY ${PACKAGE_PREFIX_DIR}/bin/dxil.dll DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
|
||||||
|
|
|
||||||
|
|
@ -14,22 +14,22 @@ struct PushConstants
|
||||||
|
|
||||||
[[vk::push_constant]] ConstantBuffer<PushConstants> g_PushConstants;
|
[[vk::push_constant]] ConstantBuffer<PushConstants> g_PushConstants;
|
||||||
|
|
||||||
#define g_AlphaTestMode vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 128)
|
#define g_AlphaTestMode vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 256)
|
||||||
#define g_AlphaThreshold vk::RawBufferLoad<float>(g_PushConstants.SharedConstants + 132)
|
#define g_AlphaThreshold vk::RawBufferLoad<float>(g_PushConstants.SharedConstants + 260)
|
||||||
#define g_Booleans vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 136)
|
#define g_Booleans vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 264)
|
||||||
#define g_SwappedTexcoords vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 140)
|
#define g_SwappedTexcoords vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 268)
|
||||||
#define g_InputLayoutFlags vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 144)
|
#define g_InputLayoutFlags vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + 272)
|
||||||
#define g_EnableGIBicubicFiltering vk::RawBufferLoad<bool>(g_PushConstants.SharedConstants + 148)
|
#define g_EnableGIBicubicFiltering vk::RawBufferLoad<bool>(g_PushConstants.SharedConstants + 276)
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
#define DEFINE_SHARED_CONSTANTS() \
|
#define DEFINE_SHARED_CONSTANTS() \
|
||||||
uint g_AlphaTestMode : packoffset(c8.x); \
|
uint g_AlphaTestMode : packoffset(c16.x); \
|
||||||
float g_AlphaThreshold : packoffset(c8.y); \
|
float g_AlphaThreshold : packoffset(c16.y); \
|
||||||
uint g_Booleans : packoffset(c8.z); \
|
uint g_Booleans : packoffset(c16.z); \
|
||||||
uint g_SwappedTexcoords : packoffset(c8.w); \
|
uint g_SwappedTexcoords : packoffset(c16.w); \
|
||||||
uint g_InputLayoutFlags : packoffset(c9.x); \
|
uint g_InputLayoutFlags : packoffset(c17.x); \
|
||||||
bool g_EnableGIBicubicFiltering : packoffset(c9.y)
|
bool g_EnableGIBicubicFiltering : packoffset(c17.y)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -117,6 +117,13 @@ static constexpr std::pair<DeclUsage, size_t> INTERPOLATORS[] =
|
||||||
{ DeclUsage::Color, 1 }
|
{ DeclUsage::Color, 1 }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr std::string_view TEXTURE_DIMENSIONS[] =
|
||||||
|
{
|
||||||
|
"2D",
|
||||||
|
"3D",
|
||||||
|
"Cube"
|
||||||
|
};
|
||||||
|
|
||||||
static FetchDestinationSwizzle getDestSwizzle(uint32_t dstSwizzle, uint32_t index)
|
static FetchDestinationSwizzle getDestSwizzle(uint32_t dstSwizzle, uint32_t index)
|
||||||
{
|
{
|
||||||
return FetchDestinationSwizzle((dstSwizzle >> (index * 3)) & 0x7);
|
return FetchDestinationSwizzle((dstSwizzle >> (index * 3)) & 0x7);
|
||||||
|
|
@ -254,7 +261,7 @@ void ShaderRecompiler::recompile(const TextureFetchInstruction& instr, bool bicu
|
||||||
if (instr.constIndex == 0 && instr.dimension == TextureDimension::Texture2D)
|
if (instr.constIndex == 0 && instr.dimension == TextureDimension::Texture2D)
|
||||||
{
|
{
|
||||||
indent();
|
indent();
|
||||||
print("pixelCoord = getPixelCoord({}_ResourceDescriptorIndex, ", constNamePtr);
|
print("pixelCoord = getPixelCoord({}_Texture2DDescriptorIndex, ", constNamePtr);
|
||||||
printSrcRegister(2);
|
printSrcRegister(2);
|
||||||
out += ");\n";
|
out += ");\n";
|
||||||
}
|
}
|
||||||
|
|
@ -274,31 +281,34 @@ void ShaderRecompiler::recompile(const TextureFetchInstruction& instr, bool bicu
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string_view dimension;
|
||||||
uint32_t componentCount = 0;
|
uint32_t componentCount = 0;
|
||||||
|
|
||||||
switch (instr.dimension)
|
switch (instr.dimension)
|
||||||
{
|
{
|
||||||
case TextureDimension::Texture1D:
|
case TextureDimension::Texture1D:
|
||||||
out += "1D";
|
dimension = "1D";
|
||||||
componentCount = 1;
|
componentCount = 1;
|
||||||
break;
|
break;
|
||||||
case TextureDimension::Texture2D:
|
case TextureDimension::Texture2D:
|
||||||
out += "2D";
|
dimension = "2D";
|
||||||
componentCount = 2;
|
componentCount = 2;
|
||||||
break;
|
break;
|
||||||
case TextureDimension::Texture3D:
|
case TextureDimension::Texture3D:
|
||||||
out += "3D";
|
dimension = "3D";
|
||||||
componentCount = 3;
|
componentCount = 3;
|
||||||
break;
|
break;
|
||||||
case TextureDimension::TextureCube:
|
case TextureDimension::TextureCube:
|
||||||
out += "Cube";
|
dimension = "Cube";
|
||||||
componentCount = 3;
|
componentCount = 3;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out += dimension;
|
||||||
if (bicubic)
|
if (bicubic)
|
||||||
out += "Bicubic";
|
out += "Bicubic";
|
||||||
|
|
||||||
print("({0}_ResourceDescriptorIndex, {0}_SamplerDescriptorIndex, ", constNamePtr);
|
print("({0}_Texture{1}DescriptorIndex, {0}_SamplerDescriptorIndex, ", constNamePtr, dimension);
|
||||||
printSrcRegister(componentCount);
|
printSrcRegister(componentCount);
|
||||||
|
|
||||||
switch (instr.dimension)
|
switch (instr.dimension)
|
||||||
|
|
@ -1073,8 +1083,8 @@ void ShaderRecompiler::recompile(const uint8_t* shaderData)
|
||||||
|
|
||||||
if (constantInfo->registerCount > 1)
|
if (constantInfo->registerCount > 1)
|
||||||
{
|
{
|
||||||
println("#define {}(INDEX) vk::RawBufferLoad<float4>(g_PushConstants.{}ShaderConstants + ({} + INDEX) * 16, 0x10)",
|
println("#define {}(INDEX) ((INDEX) < {} ? vk::RawBufferLoad<float4>(g_PushConstants.{}ShaderConstants + ({} + (INDEX)) * 16, 0x10) : 0.0)",
|
||||||
constantName, shaderName, constantInfo->registerIndex.get());
|
constantName, constantInfo->registerCount.get(), shaderName, constantInfo->registerIndex.get());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
@ -1090,11 +1100,14 @@ void ShaderRecompiler::recompile(const uint8_t* shaderData)
|
||||||
|
|
||||||
case RegisterSet::Sampler:
|
case RegisterSet::Sampler:
|
||||||
{
|
{
|
||||||
println("#define {}_ResourceDescriptorIndex vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + {})",
|
for (size_t j = 0; j < std::size(TEXTURE_DIMENSIONS); j++)
|
||||||
constantName, constantInfo->registerIndex * 4);
|
{
|
||||||
|
println("#define {}_Texture{}DescriptorIndex vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + {})",
|
||||||
|
constantName, TEXTURE_DIMENSIONS[j], j * 64 + constantInfo->registerIndex * 4);
|
||||||
|
}
|
||||||
|
|
||||||
println("#define {}_SamplerDescriptorIndex vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + {})",
|
println("#define {}_SamplerDescriptorIndex vk::RawBufferLoad<uint>(g_PushConstants.SharedConstants + {})",
|
||||||
constantName, 64 + constantInfo->registerIndex * 4);
|
constantName, std::size(TEXTURE_DIMENSIONS) * 64 + constantInfo->registerIndex * 4);
|
||||||
|
|
||||||
samplers.emplace(constantInfo->registerIndex, constantName);
|
samplers.emplace(constantInfo->registerIndex, constantName);
|
||||||
break;
|
break;
|
||||||
|
|
@ -1125,7 +1138,7 @@ void ShaderRecompiler::recompile(const uint8_t* shaderData)
|
||||||
println(" : packoffset(c{});", constantInfo->registerIndex.get());
|
println(" : packoffset(c{});", constantInfo->registerIndex.get());
|
||||||
|
|
||||||
if (constantInfo->registerCount > 1)
|
if (constantInfo->registerCount > 1)
|
||||||
println("#define {0}(INDEX) {0}[INDEX]", constantName);
|
println("#define {0}(INDEX) ((INDEX) < {1} ? {0}[INDEX] : 0.0)", constantName, constantInfo->registerCount.get());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1143,11 +1156,14 @@ void ShaderRecompiler::recompile(const uint8_t* shaderData)
|
||||||
{
|
{
|
||||||
const char* constantName = reinterpret_cast<const char*>(constantTableData + constantInfo->name);
|
const char* constantName = reinterpret_cast<const char*>(constantTableData + constantInfo->name);
|
||||||
|
|
||||||
println("\tuint {}_ResourceDescriptorIndex : packoffset(c{}.{});",
|
for (size_t j = 0; j < std::size(TEXTURE_DIMENSIONS); j++)
|
||||||
constantName, constantInfo->registerIndex / 4, SWIZZLES[constantInfo->registerIndex % 4]);
|
{
|
||||||
|
println("\tuint {}_Texture{}DescriptorIndex : packoffset(c{}.{});",
|
||||||
|
constantName, TEXTURE_DIMENSIONS[j], j * 4 + constantInfo->registerIndex / 4, SWIZZLES[constantInfo->registerIndex % 4]);
|
||||||
|
}
|
||||||
|
|
||||||
println("\tuint {}_SamplerDescriptorIndex : packoffset(c{}.{});",
|
println("\tuint {}_SamplerDescriptorIndex : packoffset(c{}.{});",
|
||||||
constantName, 4 + constantInfo->registerIndex / 4, SWIZZLES[constantInfo->registerIndex % 4]);
|
constantName, 4 * std::size(TEXTURE_DIMENSIONS) + constantInfo->registerIndex / 4, SWIZZLES[constantInfo->registerIndex % 4]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue