[D3D12] Always write original shader source in DXBC if PIX is attached

This commit is contained in:
Triang3l 2020-02-16 18:09:22 +03:00
parent 8ec813de82
commit d18e63e6e2
5 changed files with 20 additions and 12 deletions

View File

@ -72,7 +72,8 @@ PipelineCache::PipelineCache(D3D12CommandProcessor* command_processor,
auto provider = command_processor_->GetD3D12Context()->GetD3D12Provider(); auto provider = command_processor_->GetD3D12Context()->GetD3D12Provider();
shader_translator_ = std::make_unique<DxbcShaderTranslator>( shader_translator_ = std::make_unique<DxbcShaderTranslator>(
provider->GetAdapterVendorID(), edram_rov_used_); provider->GetAdapterVendorID(), edram_rov_used_,
provider->GetGraphicsAnalysis() != nullptr);
if (edram_rov_used_) { if (edram_rov_used_) {
depth_only_pixel_shader_ = depth_only_pixel_shader_ =

View File

@ -81,8 +81,10 @@ constexpr uint32_t DxbcShaderTranslator::kCbufferIndexUnallocated;
constexpr uint32_t DxbcShaderTranslator::kCfExecBoolConstantNone; constexpr uint32_t DxbcShaderTranslator::kCfExecBoolConstantNone;
DxbcShaderTranslator::DxbcShaderTranslator(uint32_t vendor_id, DxbcShaderTranslator::DxbcShaderTranslator(uint32_t vendor_id,
bool edram_rov_used) bool edram_rov_used,
bool force_emit_source_map)
: vendor_id_(vendor_id), edram_rov_used_(edram_rov_used) { : vendor_id_(vendor_id), edram_rov_used_(edram_rov_used) {
emit_source_map_ = force_emit_source_map || cvars::dxbc_source_map;
// Don't allocate again and again for the first shader. // Don't allocate again and again for the first shader.
shader_code_.reserve(8192); shader_code_.reserve(8192);
shader_object_.reserve(16384); shader_object_.reserve(16384);
@ -1963,7 +1965,7 @@ std::vector<uint8_t> DxbcShaderTranslator::CompleteTranslation() {
} }
void DxbcShaderTranslator::EmitInstructionDisassembly() { void DxbcShaderTranslator::EmitInstructionDisassembly() {
if (!cvars::dxbc_source_map) { if (!emit_source_map_) {
return; return;
} }
@ -2955,7 +2957,7 @@ void DxbcShaderTranslator::ProcessLabel(uint32_t cf_index) {
void DxbcShaderTranslator::ProcessExecInstructionBegin( void DxbcShaderTranslator::ProcessExecInstructionBegin(
const ParsedExecInstruction& instr) { const ParsedExecInstruction& instr) {
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
// Will be emitted by UpdateExecConditionals. // Will be emitted by UpdateExecConditionals.
@ -3006,7 +3008,7 @@ void DxbcShaderTranslator::ProcessLoopStartInstruction(
// Loop control is outside execs - actually close the last exec. // Loop control is outside execs - actually close the last exec.
CloseExecConditionals(); CloseExecConditionals();
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
EmitInstructionDisassembly(); EmitInstructionDisassembly();
@ -3118,7 +3120,7 @@ void DxbcShaderTranslator::ProcessLoopEndInstruction(
// Loop control is outside execs - actually close the last exec. // Loop control is outside execs - actually close the last exec.
CloseExecConditionals(); CloseExecConditionals();
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
EmitInstructionDisassembly(); EmitInstructionDisassembly();
@ -3276,7 +3278,7 @@ void DxbcShaderTranslator::ProcessLoopEndInstruction(
void DxbcShaderTranslator::ProcessJumpInstruction( void DxbcShaderTranslator::ProcessJumpInstruction(
const ParsedJumpInstruction& instr) { const ParsedJumpInstruction& instr) {
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
// Will be emitted by UpdateExecConditionals. // Will be emitted by UpdateExecConditionals.
@ -3305,7 +3307,7 @@ void DxbcShaderTranslator::ProcessJumpInstruction(
void DxbcShaderTranslator::ProcessAllocInstruction( void DxbcShaderTranslator::ProcessAllocInstruction(
const ParsedAllocInstruction& instr) { const ParsedAllocInstruction& instr) {
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
EmitInstructionDisassembly(); EmitInstructionDisassembly();

View File

@ -55,7 +55,8 @@ namespace gpu {
// 0 for NaN. // 0 for NaN.
class DxbcShaderTranslator : public ShaderTranslator { class DxbcShaderTranslator : public ShaderTranslator {
public: public:
DxbcShaderTranslator(uint32_t vendor_id, bool edram_rov_used); DxbcShaderTranslator(uint32_t vendor_id, bool edram_rov_used,
bool force_emit_source_map = false);
~DxbcShaderTranslator() override; ~DxbcShaderTranslator() override;
// Constant buffer bindings in space 0. // Constant buffer bindings in space 0.
@ -1874,6 +1875,10 @@ class DxbcShaderTranslator : public ShaderTranslator {
// Buffer for instruction disassembly comments. // Buffer for instruction disassembly comments.
StringBuffer instruction_disassembly_buffer_; StringBuffer instruction_disassembly_buffer_;
// Whether to write comments with the original Xenos instructions to the
// output.
bool emit_source_map_;
// Vendor ID of the GPU manufacturer, for toggling unsupported features. // Vendor ID of the GPU manufacturer, for toggling unsupported features.
uint32_t vendor_id_; uint32_t vendor_id_;

View File

@ -2425,7 +2425,7 @@ void DxbcShaderTranslator::ProcessAluInstruction(
return; return;
} }
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
// Will be emitted by UpdateInstructionPredication. // Will be emitted by UpdateInstructionPredication.

View File

@ -322,7 +322,7 @@ void DxbcShaderTranslator::ProcessVertexFetchInstruction(
} }
uint32_t result_write_mask = (1 << result_component_count) - 1; uint32_t result_write_mask = (1 << result_component_count) - 1;
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
// Will be emitted by UpdateInstructionPredication. // Will be emitted by UpdateInstructionPredication.
@ -1162,7 +1162,7 @@ void DxbcShaderTranslator::ArrayCoordToCubeDirection(uint32_t reg) {
void DxbcShaderTranslator::ProcessTextureFetchInstruction( void DxbcShaderTranslator::ProcessTextureFetchInstruction(
const ParsedTextureFetchInstruction& instr) { const ParsedTextureFetchInstruction& instr) {
if (cvars::dxbc_source_map) { if (emit_source_map_) {
instruction_disassembly_buffer_.Reset(); instruction_disassembly_buffer_.Reset();
instr.Disassemble(&instruction_disassembly_buffer_); instr.Disassemble(&instruction_disassembly_buffer_);
// Will be emitted later explicitly or by UpdateInstructionPredication. // Will be emitted later explicitly or by UpdateInstructionPredication.