[D3D12] DXBC: Result storing

This commit is contained in:
Triang3l 2018-09-05 21:37:34 +03:00
parent fd27057ce1
commit ae4b34c66c
1 changed files with 98 additions and 18 deletions

View File

@ -1158,7 +1158,7 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result,
shader_code_.push_back( shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) | ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(4) | saturate_bit); ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(4) | saturate_bit);
shader_object_.push_back( shader_code_.push_back(
EncodeScalarOperand(D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH, 0)); EncodeScalarOperand(D3D10_SB_OPERAND_TYPE_OUTPUT_DEPTH, 0));
break; break;
default: default:
@ -1166,13 +1166,13 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result,
return; return;
} }
if (component <= SwizzleSource::kW) { if (component <= SwizzleSource::kW) {
shader_object_.push_back(EncodeVectorSelectOperand( shader_code_.push_back(EncodeVectorSelectOperand(
D3D10_SB_OPERAND_TYPE_TEMP, uint32_t(component), 1)); D3D10_SB_OPERAND_TYPE_TEMP, uint32_t(component), 1));
shader_object_.push_back(reg); shader_code_.push_back(reg);
} else { } else {
shader_object_.push_back( shader_code_.push_back(
EncodeScalarOperand(D3D10_SB_OPERAND_TYPE_IMMEDIATE32, 0)); EncodeScalarOperand(D3D10_SB_OPERAND_TYPE_IMMEDIATE32, 0));
shader_object_.push_back(component == SwizzleSource::k1 ? 0x3F800000 : 0); shader_code_.push_back(component == SwizzleSource::k1 ? 0x3F800000 : 0);
} }
++stat_.instruction_count; ++stat_.instruction_count;
++stat_.mov_instruction_count; ++stat_.mov_instruction_count;
@ -1213,39 +1213,113 @@ void DxbcShaderTranslator::StoreResult(const InstructionResult& result,
if (mask == 0) { if (mask == 0) {
continue; continue;
} }
// r# for the swizzled part, 4-component imm32 for the constant part. // r# for the swizzled part, 4-component imm32 for the constant part.
uint32_t source_length = i == 0 ? 2 : 5; uint32_t source_length = i == 0 ? 2 : 5;
switch (result.storage_target) { switch (result.storage_target) {
case InstructionStorageTarget::kRegister: case InstructionStorageTarget::kRegister:
// TODO(Triang3l): Register store. if (uses_register_dynamic_addressing()) {
continue; bool is_static = result.storage_addressing_mode ==
InstructionStorageAddressingMode::kStatic;
++stat_.instruction_count;
++stat_.array_instruction_count;
shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH((is_static ? 4 : 6) +
source_length) |
saturate_bit);
shader_code_.push_back(EncodeVectorMaskedOperand(
D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP, mask, 2,
D3D10_SB_OPERAND_INDEX_IMMEDIATE32,
is_static ? D3D10_SB_OPERAND_INDEX_IMMEDIATE32
: D3D10_SB_OPERAND_INDEX_IMMEDIATE32_PLUS_RELATIVE));
shader_code_.push_back(0);
shader_code_.push_back(uint32_t(result.storage_index));
if (!is_static) {
uint32_t dynamic_address_register;
uint32_t dynamic_address_component;
if (result.storage_addressing_mode ==
InstructionStorageAddressingMode::kAddressRelative) {
// Addressed by aL.x.
dynamic_address_register = system_temp_aL_;
dynamic_address_component = 0;
} else {
// Addressed by a0.
dynamic_address_register = system_temp_ps_pc_p0_a0_;
dynamic_address_component = 3;
}
shader_code_.push_back(EncodeVectorSelectOperand(
D3D10_SB_OPERAND_TYPE_TEMP, dynamic_address_component, 1));
shader_code_.push_back(dynamic_address_register);
}
} else {
++stat_.instruction_count;
++stat_.mov_instruction_count;
shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(3 + source_length) |
saturate_bit);
shader_code_.push_back(
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, mask, 1));
shader_code_.push_back(uint32_t(result.storage_index));
}
break; break;
case InstructionStorageTarget::kInterpolant: case InstructionStorageTarget::kInterpolant:
// TODO(Triang3l): Interpolant store. ++stat_.instruction_count;
continue; ++stat_.mov_instruction_count;
shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(3 + source_length) |
saturate_bit);
shader_code_.push_back(
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_OUTPUT, mask, 1));
shader_code_.push_back(kVSOutInterpolatorRegister +
uint32_t(result.storage_index));
break; break;
case InstructionStorageTarget::kPosition: case InstructionStorageTarget::kPosition:
// TODO(Triang3l): Position store. // TODO(Triang3l): Change to a temporary register because of vtx_fmt,
continue; // drawing without a viewport and half-pixel offset.
++stat_.instruction_count;
++stat_.mov_instruction_count;
shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(3 + source_length) |
saturate_bit);
shader_code_.push_back(
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_OUTPUT, mask, 1));
shader_code_.push_back(kVSOutPositionRegister);
break; break;
case InstructionStorageTarget::kColorTarget: case InstructionStorageTarget::kColorTarget:
// TODO(Triang3l): Color target store. ++stat_.instruction_count;
continue; ++stat_.array_instruction_count;
shader_code_.push_back(
ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MOV) |
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(4 + source_length) |
saturate_bit);
shader_code_.push_back(EncodeVectorMaskedOperand(
D3D10_SB_OPERAND_TYPE_INDEXABLE_TEMP, mask, 2));
shader_code_.push_back(GetColorIndexableTemp());
shader_code_.push_back(uint32_t(result.storage_index));
break; break;
default: default:
continue; continue;
} }
if (i == 0) { if (i == 0) {
// Copy from the source r#. // Copy from the source r#.
shader_object_.push_back(EncodeVectorSwizzledOperand( shader_code_.push_back(EncodeVectorSwizzledOperand(
D3D10_SB_OPERAND_TYPE_TEMP, swizzle_components, 1)); D3D10_SB_OPERAND_TYPE_TEMP, swizzle_components, 1));
shader_object_.push_back(reg); shader_code_.push_back(reg);
} else { } else {
// Load constants. // Load constants.
shader_object_.push_back(EncodeVectorSwizzledOperand( shader_code_.push_back(EncodeVectorSwizzledOperand(
D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0)); D3D10_SB_OPERAND_TYPE_IMMEDIATE32, kSwizzleXYZW, 0));
for (uint32_t j = 0; j < 4; ++j) { for (uint32_t j = 0; j < 4; ++j) {
shader_object_.push_back((constant_values & (1 << j)) ? 0x3F800000 : 0); shader_code_.push_back((constant_values & (1 << j)) ? 0x3F800000 : 0);
} }
} }
} }
@ -1858,7 +1932,9 @@ void DxbcShaderTranslator::ProcessVectorAluInstruction(
UnloadDxbcSourceOperand(dxbc_operands[instr.operand_count - 1 - i]); UnloadDxbcSourceOperand(dxbc_operands[instr.operand_count - 1 - i]);
} }
// TODO(Triang3l): Store pv. StoreResult(instr.result, system_temp_pv_, replicate_result);
// TODO(Triang3l): Close predicate check.
} }
void DxbcShaderTranslator::ProcessScalarAluInstruction( void DxbcShaderTranslator::ProcessScalarAluInstruction(
@ -2477,6 +2553,10 @@ void DxbcShaderTranslator::ProcessScalarAluInstruction(
for (uint32_t i = 0; i < uint32_t(instr.operand_count); ++i) { for (uint32_t i = 0; i < uint32_t(instr.operand_count); ++i) {
UnloadDxbcSourceOperand(dxbc_operands[instr.operand_count - 1 - i]); UnloadDxbcSourceOperand(dxbc_operands[instr.operand_count - 1 - i]);
} }
StoreResult(instr.result, system_temp_ps_pc_p0_a0_, true);
// TODO(Triang3l): Close predicate check.
} }
void DxbcShaderTranslator::ProcessAluInstruction( void DxbcShaderTranslator::ProcessAluInstruction(