[D3D12] ROV: Blending fixes
This commit is contained in:
parent
efc7f794ed
commit
c8a48f9c1c
|
@ -1797,6 +1797,8 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
|
|||
|
||||
// Color exponent bias and output index mapping or ROV writing.
|
||||
uint32_t rb_color_mask = regs[XE_GPU_REG_RB_COLOR_MASK].u32;
|
||||
bool colorcontrol_blend_enable =
|
||||
(regs[XE_GPU_REG_RB_COLORCONTROL].u32 & 0x20) == 0;
|
||||
for (uint32_t i = 0; i < 4; ++i) {
|
||||
uint32_t color_info, blend_control;
|
||||
switch (i) {
|
||||
|
@ -1899,7 +1901,8 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
|
|||
rt_flags |= DxbcShaderTranslator::kRTFlag_Load;
|
||||
}
|
||||
uint32_t blend_x, blend_y;
|
||||
if (DxbcShaderTranslator::GetBlendConstants(blend_control, blend_x,
|
||||
if (colorcontrol_blend_enable &&
|
||||
DxbcShaderTranslator::GetBlendConstants(blend_control, blend_x,
|
||||
blend_y)) {
|
||||
rt_flags |= DxbcShaderTranslator::kRTFlag_Load |
|
||||
DxbcShaderTranslator::kRTFlag_Blend;
|
||||
|
@ -1912,7 +1915,7 @@ void D3D12CommandProcessor::UpdateSystemConstantValues(
|
|||
}
|
||||
if (system_constants_
|
||||
.edram_blend_rt01_rt23[rt_pair_index][rt_pair_comp + 1] !=
|
||||
blend_x) {
|
||||
blend_y) {
|
||||
dirty = true;
|
||||
system_constants_
|
||||
.edram_blend_rt01_rt23[rt_pair_index][rt_pair_comp + 1] =
|
||||
|
|
|
@ -90,6 +90,7 @@ bool DxbcShaderTranslator::GetBlendConstants(uint32_t blend_control,
|
|||
0,
|
||||
kBlendX_Src_One,
|
||||
0,
|
||||
kBlendX_Src_One,
|
||||
kBlendX_Src_One | kBlendX_Src_DestAlpha_Neg,
|
||||
};
|
||||
static const uint32_t kBlendYSrcFactorMap[32] = {
|
||||
|
@ -128,6 +129,7 @@ bool DxbcShaderTranslator::GetBlendConstants(uint32_t blend_control,
|
|||
kBlendX_SrcAlpha_One,
|
||||
0,
|
||||
kBlendX_SrcAlpha_One,
|
||||
kBlendX_SrcAlpha_One,
|
||||
};
|
||||
static const uint32_t kBlendYSrcAlphaFactorMap[32] = {
|
||||
0,
|
||||
|
@ -164,6 +166,7 @@ bool DxbcShaderTranslator::GetBlendConstants(uint32_t blend_control,
|
|||
0,
|
||||
kBlendX_Dest_One,
|
||||
0,
|
||||
kBlendX_Dest_One,
|
||||
kBlendX_Dest_One | kBlendX_Src_DestAlpha_Neg,
|
||||
};
|
||||
static const uint32_t kBlendYDestFactorMap[32] = {
|
||||
|
@ -202,6 +205,7 @@ bool DxbcShaderTranslator::GetBlendConstants(uint32_t blend_control,
|
|||
kBlendX_DestAlpha_One,
|
||||
0,
|
||||
kBlendX_DestAlpha_One,
|
||||
kBlendX_DestAlpha_One,
|
||||
};
|
||||
static const uint32_t kBlendYDestAlphaFactorMap[32] = {
|
||||
0,
|
||||
|
@ -270,8 +274,8 @@ bool DxbcShaderTranslator::GetBlendConstants(uint32_t blend_control,
|
|||
uint32_t src_alpha_factor = (blend_control >> 16) & 0x1F;
|
||||
uint32_t dest_alpha_factor = (blend_control >> 24) & 0x1F;
|
||||
blend_x |= kBlendXSrcAlphaFactorMap[src_alpha_factor] |
|
||||
kBlendYDestAlphaFactorMap[dest_alpha_factor];
|
||||
blend_y |= kBlendXSrcAlphaFactorMap[src_alpha_factor] |
|
||||
kBlendXDestAlphaFactorMap[dest_alpha_factor];
|
||||
blend_y |= kBlendYSrcAlphaFactorMap[src_alpha_factor] |
|
||||
kBlendYDestAlphaFactorMap[dest_alpha_factor];
|
||||
switch (op_alpha) {
|
||||
case BlendOp::kAdd:
|
||||
|
@ -1376,8 +1380,8 @@ void DxbcShaderTranslator::CompletePixelShader_WriteToROV_ExtractBlendScales(
|
|||
system_constants_used_ |= (1ull << kSysConst_EDRAMBlendRT01_Index)
|
||||
<< rt_pair_index;
|
||||
shader_code_.push_back(
|
||||
ENCODE_D3D10_SB_OPCODE_TYPE(is_signed ? D3D11_SB_OPCODE_UBFE
|
||||
: D3D11_SB_OPCODE_IBFE) |
|
||||
ENCODE_D3D10_SB_OPCODE_TYPE(is_signed ? D3D11_SB_OPCODE_IBFE
|
||||
: D3D11_SB_OPCODE_UBFE) |
|
||||
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(17));
|
||||
shader_code_.push_back(
|
||||
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, write_mask, 1));
|
||||
|
@ -1409,8 +1413,8 @@ void DxbcShaderTranslator::CompletePixelShader_WriteToROV_ExtractBlendScales(
|
|||
|
||||
// Convert -1, 0 or 1 integer to float.
|
||||
shader_code_.push_back(
|
||||
ENCODE_D3D10_SB_OPCODE_TYPE(is_signed ? D3D10_SB_OPCODE_UTOF
|
||||
: D3D10_SB_OPCODE_ITOF) |
|
||||
ENCODE_D3D10_SB_OPCODE_TYPE(is_signed ? D3D10_SB_OPCODE_ITOF
|
||||
: D3D10_SB_OPCODE_UTOF) |
|
||||
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(5));
|
||||
shader_code_.push_back(
|
||||
EncodeVectorMaskedOperand(D3D10_SB_OPERAND_TYPE_TEMP, write_mask, 1));
|
||||
|
@ -1448,8 +1452,8 @@ void DxbcShaderTranslator::CompletePixelShader_WriteToROV_Blend(
|
|||
// This will initialize src_factor_temp and dest_factor_temp.
|
||||
CompletePixelShader_WriteToROV_ExtractBlendScales(
|
||||
rt_index, 0b00000000, true, kBlendX_Src_SrcColor_Shift,
|
||||
kBlendX_SrcAlpha_SrcAlpha_Shift, kBlendX_Dest_DestColor_Shift,
|
||||
kBlendX_DestAlpha_DestAlpha_Shift, scale_temp);
|
||||
kBlendX_SrcAlpha_SrcAlpha_Shift, kBlendX_Dest_SrcColor_Shift,
|
||||
kBlendX_DestAlpha_SrcAlpha_Shift, scale_temp);
|
||||
for (uint32_t i = 0; i < 2; ++i) {
|
||||
shader_code_.push_back(ENCODE_D3D10_SB_OPCODE_TYPE(D3D10_SB_OPCODE_MAD) |
|
||||
ENCODE_D3D10_SB_TOKENIZED_INSTRUCTION_LENGTH(9));
|
||||
|
|
Loading…
Reference in New Issue