1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-01-19 05:52:11 +01:00

[d3d9] Implement D3DTOP_BUMPENVMAP

This commit is contained in:
Joshua Ashton 2020-02-08 23:00:32 +00:00
parent 4291bc9dfb
commit 302aed256b

View File

@ -607,6 +607,7 @@ namespace dxvk {
uint32_t m_uint32Type;
uint32_t m_vec4Type;
uint32_t m_vec3Type;
uint32_t m_vec2Type;
uint32_t m_mat3Type;
uint32_t m_mat4Type;
@ -647,6 +648,7 @@ namespace dxvk {
m_uint32Type = m_module.defIntType(32, 0);
m_vec4Type = m_module.defVectorType(m_floatType, 4);
m_vec3Type = m_module.defVectorType(m_floatType, 3);
m_vec2Type = m_module.defVectorType(m_floatType, 2);
m_mat3Type = m_module.defMatrixType(m_vec3Type, 3);
m_mat4Type = m_module.defMatrixType(m_vec4Type, 4);
@ -1530,6 +1532,31 @@ namespace dxvk {
bool processedTexture = false;
auto DoBumpmapCoords = [&](uint32_t baseCoords) {
uint32_t stage = i - 1;
uint32_t coords = baseCoords;
for (uint32_t i = 0; i < 2; i++) {
std::array<uint32_t, 4> indices = { 0, 1, 2, 3 };
uint32_t tc_m_n = m_module.opCompositeExtract(m_floatType, coords, 1, &i);
uint32_t offset = m_module.constu32(D3D9SharedPSStages_Count * stage + D3D9SharedPSStages_BumpEnvMat0 + i);
uint32_t bm = m_module.opAccessChain(m_module.defPointerType(m_vec2Type, spv::StorageClassUniform),
m_ps.sharedState, 1, &offset);
bm = m_module.opLoad(m_vec2Type, bm);
uint32_t t = m_module.opVectorShuffle(m_vec2Type, texture, texture, 2, indices.data());
uint32_t dot = m_module.opDot(m_floatType, bm, t);
uint32_t result = m_module.opFAdd(m_floatType, tc_m_n, dot);
coords = m_module.opCompositeInsert(m_vec4Type, result, coords, 1, &i);
}
return coords;
};
auto GetTexture = [&]() {
if (!processedTexture) {
SpirvImageOperands imageOperands;
@ -1555,13 +1582,30 @@ namespace dxvk {
else
projIdx--;
uint32_t projValue = 0;
if (m_fsKey.Stages[i].Contents.Projected) {
uint32_t projValue = m_module.opCompositeExtract(m_floatType, m_ps.in.TEXCOORD[i], 1, &projIdx);
projValue = m_module.opCompositeExtract(m_floatType, m_ps.in.TEXCOORD[i], 1, &projIdx);
uint32_t insertIdx = texcoordCnt - 1;
texcoord = m_module.opCompositeInsert(texcoord_t, projValue, texcoord, 1, &insertIdx);
}
if (m_fsKey.Stages[i].Contents.Projected)
bool shouldProject = m_fsKey.Stages[i].Contents.Projected;
if (i != 0 && (
m_fsKey.Stages[i - 1].Contents.ColorOp == D3DTOP_BUMPENVMAP ||
m_fsKey.Stages[i - 1].Contents.ColorOp == D3DTOP_BUMPENVMAPLUMINANCE)) {
if (shouldProject) {
uint32_t projRcp = m_module.opFDiv(m_floatType, m_module.constf32(1.0), projValue);
texcoord = m_module.opVectorTimesScalar(m_vec4Type, texcoord, projRcp);
}
texcoord = DoBumpmapCoords(texcoord);
shouldProject = false;
}
if (shouldProject)
texture = m_module.opImageSampleProjImplicitLod(m_vec4Type, imageVarId, texcoord, imageOperands);
else
texture = m_module.opImageSampleImplicitLod(m_vec4Type, imageVarId, texcoord, imageOperands);
@ -1749,12 +1793,10 @@ namespace dxvk {
dst = Saturate(dst);
break;
case D3DTOP_BUMPENVMAP:
Logger::warn("D3DTOP_BUMPENVMAP: not implemented");
break;
case D3DTOP_BUMPENVMAPLUMINANCE:
Logger::warn("D3DTOP_BUMPENVMAPLUMINANCE: not implemented");
case D3DTOP_BUMPENVMAP:
// Load texture for the next stage...
texture = GetTexture();
break;
case D3DTOP_DOTPRODUCT3: {