From 827fae3a672ae1e85c7d4390dff8fb717d889ae5 Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 13 May 2014 22:40:59 +0100 Subject: [PATCH] Fix shader debugging always reading from pixel resources. Closes #59 Instead of assuming that we can sample straight from the bound resource, we save what's bound on PS slot 0, always sample from that slot, and bind whatever resource & sampler onto PS slot 0 for the sampling draw. --- renderdoc/driver/d3d11/shaders/dxbc_debug.cpp | 71 +++++++++++++++++-- 1 file changed, 65 insertions(+), 6 deletions(-) diff --git a/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp b/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp index 35d5dae27..ef302c8b5 100644 --- a/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp +++ b/renderdoc/driver/d3d11/shaders/dxbc_debug.cpp @@ -2859,12 +2859,15 @@ State State::GetNext(GlobalState &global, State quad[4]) const string vsProgram = "float4 main(uint id : SV_VertexID) : SV_Position {\n"; vsProgram += "return float4((id == 2) ? 3.0f : -1.0f, (id == 0) ? -3.0f : 1.0f, 0.5, 1.0);\n"; vsProgram += "}"; + + UINT texSlot = (UINT)op.operands[2].indices[0].index; + UINT sampSlot = op.operands.size() >= 4 ? (UINT)op.operands[3].indices[0].index : 0U; if(op.operation == OPCODE_SAMPLE || op.operation == OPCODE_SAMPLE_B || op.operation == OPCODE_SAMPLE_D) { - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n" + sampler + " : register(s" + op.operands[3].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n" + sampler + " : register(s0);\n\n"; sampleProgram += funcRet + " main() : SV_Target0\n{\nreturn "; sampleProgram += "t.SampleGrad(s, " + texcoords + ", " + ddx + ", " + ddy + offsets + ")" + swizzle + ";"; sampleProgram += "\n}\n"; @@ -2874,7 +2877,7 @@ State State::GetNext(GlobalState &global, State quad[4]) const // lod selection StringFormat::snprintf(buf, 63, "%f", srcOpers[1].value.f.x); - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n" + sampler + " : register(s" + op.operands[3].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n" + sampler + " : register(s0);\n\n"; sampleProgram += funcRet + " main() : SV_Target0\n{\nreturn "; sampleProgram += "t.SampleLevel(s, " + texcoords + ", " + buf + offsets + ")" + swizzle + ";"; sampleProgram += "\n}\n"; @@ -2912,7 +2915,7 @@ State State::GetNext(GlobalState &global, State quad[4]) const // comparison value StringFormat::snprintf(buf, 63, "%f", srcOpers[3].value.f.x); - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n" + sampler + " : register(s" + op.operands[3].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n" + sampler + " : register(s0);\n\n"; sampleProgram += funcRet + " main(float4 pos : SV_Position, float" + uvDim + " uv : uvs) : SV_Target0\n{\n"; sampleProgram += "return t.SampleCmpLevelZero(s, uv, " + string(buf) + offsets + ").xxxx;"; sampleProgram += "\n}\n"; @@ -2922,21 +2925,21 @@ State State::GetNext(GlobalState &global, State quad[4]) const // comparison value StringFormat::snprintf(buf, 63, "%f", srcOpers[3].value.f.x); - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n" + sampler + " : register(s" + op.operands[3].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n" + sampler + " : register(s0);\n\n"; sampleProgram += funcRet + " main() : SV_Target0\n{\nreturn "; sampleProgram += "t.SampleCmpLevelZero(s, " + texcoords + ", " + buf + offsets + ")" + swizzle + ";"; sampleProgram += "\n}\n"; } else if(op.operation == OPCODE_LD) { - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n\n"; sampleProgram += funcRet + " main() : SV_Target0\n{\nreturn "; sampleProgram += "t.Load(" + texcoords + offsets + ")" + swizzle + ";"; sampleProgram += "\n}\n"; } else if(op.operation == OPCODE_LD_MS) { - sampleProgram = texture + " : register(t" + op.operands[2].indices[0].str + ");\n\n"; + sampleProgram = texture + " : register(t0);\n\n"; sampleProgram += funcRet + " main() : SV_Target0\n{\nreturn "; sampleProgram += "t.Load(" + texcoords + ", " + sampleIdx + offsets + ")" + swizzle + ";"; sampleProgram += "\n}\n"; @@ -2949,6 +2952,50 @@ State State::GetNext(GlobalState &global, State quad[4]) const device->GetReal()->GetImmediateContext(&context); + // back up SRV/sampler on PS slot 0 + + ID3D11ShaderResourceView *prevSRV = NULL; + ID3D11SamplerState *prevSamp = NULL; + + context->PSGetShaderResources(0, 1, &prevSRV); + context->PSGetSamplers(0, 1, &prevSamp); + + ID3D11ShaderResourceView *usedSRV = NULL; + ID3D11SamplerState *usedSamp = NULL; + + // fetch SRV and sampler from the shader stage we're debugging that this opcode wants to + // load from + + if(dxbc->m_Type == D3D11_SHVER_VERTEX_SHADER) + context->VSGetShaderResources(texSlot, 1, &usedSRV); + else if(dxbc->m_Type == D3D11_SHVER_HULL_SHADER) + context->HSGetShaderResources(texSlot, 1, &usedSRV); + else if(dxbc->m_Type == D3D11_SHVER_DOMAIN_SHADER) + context->DSGetShaderResources(texSlot, 1, &usedSRV); + else if(dxbc->m_Type == D3D11_SHVER_GEOMETRY_SHADER) + context->GSGetShaderResources(texSlot, 1, &usedSRV); + else if(dxbc->m_Type == D3D11_SHVER_PIXEL_SHADER) + context->PSGetShaderResources(texSlot, 1, &usedSRV); + else if(dxbc->m_Type == D3D11_SHVER_COMPUTE_SHADER) + context->CSGetShaderResources(texSlot, 1, &usedSRV); + + if(dxbc->m_Type == D3D11_SHVER_VERTEX_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + else if(dxbc->m_Type == D3D11_SHVER_HULL_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + else if(dxbc->m_Type == D3D11_SHVER_DOMAIN_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + else if(dxbc->m_Type == D3D11_SHVER_GEOMETRY_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + else if(dxbc->m_Type == D3D11_SHVER_PIXEL_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + else if(dxbc->m_Type == D3D11_SHVER_COMPUTE_SHADER) + context->VSGetSamplers(sampSlot, 1, &usedSamp); + + // set onto PS while we perform the sample + context->PSSetShaderResources(0, 1, &usedSRV); + context->PSSetSamplers(0, 1, &usedSamp); + context->IASetInputLayout(NULL); context->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); @@ -3084,8 +3131,20 @@ State State::GetNext(GlobalState &global, State quad[4]) const SAFE_RELEASE(rtv); SAFE_RELEASE(vs); SAFE_RELEASE(ps); + + // restore whatever was on PS slot 0 before we messed with it + + context->PSSetShaderResources(0, 1, &prevSRV); + context->PSSetSamplers(0, 1, &prevSamp); + SAFE_RELEASE(context); + SAFE_RELEASE(prevSRV); + SAFE_RELEASE(prevSamp); + + SAFE_RELEASE(usedSRV); + SAFE_RELEASE(usedSamp); + // should be a better way of doing this if(op.operands[0].comps[1] == 0xff) lookupResult.value.iv[0] = lookupResult.value.iv[ op.operands[0].comps[0] ];