1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-02 01:24:11 +01:00

[dxbc] Implement pixel shader output component mapping

This commit is contained in:
Philip Rebohle 2018-09-01 17:56:01 +02:00
parent 70786aeee8
commit 05e505a844
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
2 changed files with 37 additions and 0 deletions

View File

@ -5202,6 +5202,41 @@ namespace dxvk {
}
}
}
void DxbcCompiler::emitOutputMapping() {
// For pixel shaders, we need to swizzle the
// output vectors using some spec constants.
for (uint32_t i = 0; i < m_oRegs.size(); i++) {
if (m_oRegs[i].id == 0 || m_oRegs[i].type.ccount < 2)
continue;
DxbcRegisterValue vector = emitValueLoad(m_oRegs[i]);
uint32_t specTypeId = getScalarTypeId(DxbcScalarType::Uint32);
uint32_t compTypeId = getScalarTypeId(vector.type.ctype);
std::array<uint32_t, 4> scalars;
for (uint32_t c = 0; c < vector.type.ccount; c++) {
const char* components = "rgba";
uint32_t specId = m_module.specConst32(specTypeId, c);
m_module.decorateSpecId(specId, uint32_t(DxvkSpecConstantId::ColorComponentMappings) + 4 * i + c);
m_module.setDebugName(specId, str::format("omap", i, ".", components[c]).c_str());
scalars[c] = m_module.opVectorExtractDynamic(compTypeId, vector.id, specId);
}
vector.id = m_module.opCompositeConstruct(
getVectorTypeId(vector.type),
vector.type.ccount,
scalars.data());
emitValueStore(m_oRegs[i], vector,
DxbcRegMask::firstN(vector.type.ccount));
}
}
DxbcRegisterValue DxbcCompiler::emitVsSystemValueLoad(
@ -6114,6 +6149,7 @@ namespace dxvk {
}
this->emitOutputSetup();
this->emitOutputMapping();
this->emitFunctionEnd();
}

View File

@ -947,6 +947,7 @@ namespace dxvk {
void emitInputSetup(uint32_t vertexCount);
void emitOutputSetup();
void emitOutputMapping();
//////////////////////////////////////////
// System value load methods (per shader)