1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-12-12 13:08:50 +01:00

[dxso] Implement bem instruction

This commit is contained in:
Alpyne 2023-04-27 18:01:46 -07:00 committed by Joshie
parent a79772322b
commit 404c984f9c

View File

@ -128,6 +128,7 @@ namespace dxvk {
case DxsoOpcode::Lrp:
case DxsoOpcode::Frc:
case DxsoOpcode::Cmp:
case DxsoOpcode::Bem:
case DxsoOpcode::Cnd:
case DxsoOpcode::Dp2Add:
case DxsoOpcode::DsX:
@ -2196,6 +2197,41 @@ namespace dxvk {
emitRegisterLoad(src[2], mask).id);
break;
}
case DxsoOpcode::Bem: {
DxsoRegisterValue src0 = emitRegisterLoad(src[0], mask);
DxsoRegisterValue src1 = emitRegisterLoad(src[1], mask);
// dst.x = src0.x + [bm00(m) * src1.x + bm10(m) * src1.y]
// dst.y = src0.y + [bm01(m) * src1.x + bm11(m) * src1.y]
// But we flipped the bm indices so we can use dot here...
// dst.x = src0.x + dot(bm0, src1)
// dst.y = src0.y + dot(bm1, src1)
std::array<uint32_t, 2> values = { m_module.constf32(0.0f), m_module.constf32(0.0f) };
for (uint32_t i = 0; i < 2; i++) {
uint32_t fl_t = getScalarTypeId(DxsoScalarType::Float32);
uint32_t vec2_t = getVectorTypeId({ DxsoScalarType::Float32, 2 });
std::array<uint32_t, 4> indices = { 0, 1, 2, 3 };
uint32_t tc_m_n = m_module.opCompositeExtract(fl_t, src0.id, 1, &i);
uint32_t offset = m_module.constu32(D3D9SharedPSStages_Count * ctx.dst.id.num + D3D9SharedPSStages_BumpEnvMat0 + i);
uint32_t bm = m_module.opAccessChain(m_module.defPointerType(vec2_t, spv::StorageClassUniform),
m_ps.sharedState, 1, &offset);
bm = m_module.opLoad(vec2_t, bm);
uint32_t t = m_module.opVectorShuffle(vec2_t, src1.id, src1.id, 2, indices.data());
uint32_t dot = m_module.opDot(fl_t, bm, t);
values[i] = m_module.opFAdd(fl_t, tc_m_n, dot);
}
result.id = m_module.opCompositeConstruct(typeId, values.size(), values.data());
break;
}
case DxsoOpcode::Cnd: {
const uint32_t boolTypeId =
getVectorTypeId({ DxsoScalarType::Bool, result.type.ccount });