1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2024-11-29 19:24:10 +01:00

[dxbc] Implemented 64-bit Vector ALU instructions

This commit is contained in:
Philip Rebohle 2018-06-07 15:05:06 +02:00
parent 97af5ee6fe
commit a89eb15546
No known key found for this signature in database
GPG Key ID: C8CC613427A31C99
3 changed files with 46 additions and 15 deletions

View File

@ -1361,6 +1361,9 @@ namespace dxvk {
DxbcRegisterValue dst; DxbcRegisterValue dst;
dst.type.ctype = ins.dst[0].dataType; dst.type.ctype = ins.dst[0].dataType;
dst.type.ccount = ins.dst[0].mask.popCount(); dst.type.ccount = ins.dst[0].mask.popCount();
if (isDoubleType(ins.dst[0].dataType))
dst.type.ccount /= 2;
const uint32_t typeId = getVectorTypeId(dst.type); const uint32_t typeId = getVectorTypeId(dst.type);
@ -1368,12 +1371,14 @@ namespace dxvk {
///////////////////// /////////////////////
// Move instructions // Move instructions
case DxbcOpcode::Mov: case DxbcOpcode::Mov:
case DxbcOpcode::DMov:
dst.id = src.at(0).id; dst.id = src.at(0).id;
break; break;
///////////////////////////////////// /////////////////////////////////////
// ALU operations on float32 numbers // ALU operations on float32 numbers
case DxbcOpcode::Add: case DxbcOpcode::Add:
case DxbcOpcode::DAdd:
dst.id = m_module.opFAdd(typeId, dst.id = m_module.opFAdd(typeId,
src.at(0).id, src.at(1).id); src.at(0).id, src.at(1).id);
break; break;
@ -1404,18 +1409,21 @@ namespace dxvk {
break; break;
case DxbcOpcode::Max: case DxbcOpcode::Max:
case DxbcOpcode::DMax:
dst.id = m_options.test(DxbcOption::UseSimpleMinMaxClamp) dst.id = m_options.test(DxbcOption::UseSimpleMinMaxClamp)
? m_module.opFMax(typeId, src.at(0).id, src.at(1).id) ? m_module.opFMax(typeId, src.at(0).id, src.at(1).id)
: m_module.opNMax(typeId, src.at(0).id, src.at(1).id); : m_module.opNMax(typeId, src.at(0).id, src.at(1).id);
break; break;
case DxbcOpcode::Min: case DxbcOpcode::Min:
case DxbcOpcode::DMin:
dst.id = m_options.test(DxbcOption::UseSimpleMinMaxClamp) dst.id = m_options.test(DxbcOption::UseSimpleMinMaxClamp)
? m_module.opFMin(typeId, src.at(0).id, src.at(1).id) ? m_module.opFMin(typeId, src.at(0).id, src.at(1).id)
: m_module.opNMin(typeId, src.at(0).id, src.at(1).id); : m_module.opNMin(typeId, src.at(0).id, src.at(1).id);
break; break;
case DxbcOpcode::Mul: case DxbcOpcode::Mul:
case DxbcOpcode::DMul:
dst.id = m_module.opFMul(typeId, dst.id = m_module.opFMul(typeId,
src.at(0).id, src.at(1).id); src.at(0).id, src.at(1).id);
break; break;
@ -2556,10 +2564,6 @@ namespace dxvk {
// ftod and dtof take the following operands: // ftod and dtof take the following operands:
// (dst0) Destination operand // (dst0) Destination operand
// (src0) Number to convert // (src0) Number to convert
m_module.enableCapability(spv::CapabilityFloat64);
// The source operand mask depends on the number
// of components set in the destination mask
uint32_t dstBits = ins.dst[0].mask.popCount(); uint32_t dstBits = ins.dst[0].mask.popCount();
DxbcRegMask srcMask = isDoubleType(ins.dst[0].dataType) DxbcRegMask srcMask = isDoubleType(ins.dst[0].dataType)
@ -4028,7 +4032,9 @@ namespace dxvk {
switch (value.type.ctype) { switch (value.type.ctype) {
case DxbcScalarType::Float32: value.id = m_module.opFNegate(typeId, value.id); break; case DxbcScalarType::Float32: value.id = m_module.opFNegate(typeId, value.id); break;
case DxbcScalarType::Float64: value.id = m_module.opFNegate(typeId, value.id); break;
case DxbcScalarType::Sint32: value.id = m_module.opSNegate(typeId, value.id); break; case DxbcScalarType::Sint32: value.id = m_module.opSNegate(typeId, value.id); break;
case DxbcScalarType::Sint64: value.id = m_module.opSNegate(typeId, value.id); break;
default: Logger::warn("DxbcCompiler: Cannot negate given type"); default: Logger::warn("DxbcCompiler: Cannot negate given type");
} }
@ -4846,7 +4852,8 @@ namespace dxvk {
DxbcRegisterValue DxbcCompiler::emitRegisterLoad( DxbcRegisterValue DxbcCompiler::emitRegisterLoad(
const DxbcRegister& reg, const DxbcRegister& reg,
DxbcRegMask writeMask) { DxbcRegMask writeMask) {
if (reg.type == DxbcOperandType::Imm32) { if (reg.type == DxbcOperandType::Imm32
|| reg.type == DxbcOperandType::Imm64) {
DxbcRegisterValue result; DxbcRegisterValue result;
if (reg.componentCount == DxbcComponentCount::Component1) { if (reg.componentCount == DxbcComponentCount::Component1) {
@ -6516,6 +6523,12 @@ namespace dxvk {
uint32_t DxbcCompiler::getScalarTypeId(DxbcScalarType type) { uint32_t DxbcCompiler::getScalarTypeId(DxbcScalarType type) {
if (type == DxbcScalarType::Float64)
m_module.enableCapability(spv::CapabilityFloat64);
if (type == DxbcScalarType::Sint64 || type == DxbcScalarType::Uint64)
m_module.enableCapability(spv::CapabilityInt64);
switch (type) { switch (type) {
case DxbcScalarType::Uint32: return m_module.defIntType(32, 0); case DxbcScalarType::Uint32: return m_module.defIntType(32, 0);
case DxbcScalarType::Uint64: return m_module.defIntType(64, 0); case DxbcScalarType::Uint64: return m_module.defIntType(64, 0);
@ -6525,7 +6538,7 @@ namespace dxvk {
case DxbcScalarType::Float64: return m_module.defFloatType(64); case DxbcScalarType::Float64: return m_module.defFloatType(64);
case DxbcScalarType::Bool: return m_module.defBoolType(); case DxbcScalarType::Bool: return m_module.defBoolType();
} }
throw DxvkError("DxbcCompiler: Invalid scalar type"); throw DxvkError("DxbcCompiler: Invalid scalar type");
} }

View File

@ -244,7 +244,8 @@ namespace dxvk {
void DxbcDecodeContext::decodeOperandImmediates(DxbcCodeSlice& code, DxbcRegister& reg) { void DxbcDecodeContext::decodeOperandImmediates(DxbcCodeSlice& code, DxbcRegister& reg) {
if (reg.type == DxbcOperandType::Imm32) { if (reg.type == DxbcOperandType::Imm32
|| reg.type == DxbcOperandType::Imm64) {
switch (reg.componentCount) { switch (reg.componentCount) {
// This is commonly used if only one vector // This is commonly used if only one vector
// component is involved in an operation // component is involved in an operation
@ -259,12 +260,10 @@ namespace dxvk {
reg.imm.u32_4[2] = code.read(); reg.imm.u32_4[2] = code.read();
reg.imm.u32_4[3] = code.read(); reg.imm.u32_4[3] = code.read();
} break; } break;
default: default:
Logger::warn("DxbcDecodeContext: Invalid component count for immediate operand"); Logger::warn("DxbcDecodeContext: Invalid component count for immediate operand");
} }
} else if (reg.type == DxbcOperandType::Imm64) {
Logger::warn("DxbcDecodeContext: 64-bit immediates not supported");
} }
} }

View File

@ -958,13 +958,29 @@ namespace dxvk {
/* Sync */ /* Sync */
{ 0, DxbcInstClass::Barrier }, { 0, DxbcInstClass::Barrier },
/* DAdd */ /* DAdd */
{ }, { 3, DxbcInstClass::VectorAlu, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
} },
/* DMax */ /* DMax */
{ }, { 3, DxbcInstClass::VectorAlu, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
} },
/* DMin */ /* DMin */
{ }, { 3, DxbcInstClass::VectorAlu, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
} },
/* DMul */ /* DMul */
{ }, { 3, DxbcInstClass::VectorAlu, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
} },
/* DEq */ /* DEq */
{ }, { },
/* DGe */ /* DGe */
@ -974,7 +990,10 @@ namespace dxvk {
/* DNe */ /* DNe */
{ }, { },
/* DMov */ /* DMov */
{ }, { 2, DxbcInstClass::VectorAlu, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float64 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float64 },
} },
/* DMovc */ /* DMovc */
{ }, { },
/* DtoF */ /* DtoF */