1
0
mirror of https://github.com/doitsujin/dxvk.git synced 2025-02-20 10:54:16 +01:00

[dxbc] Initial shadow sampler support

This commit is contained in:
Philip Rebohle 2017-12-20 00:16:49 +01:00
parent d1720c0c52
commit 9865474bb4
4 changed files with 87 additions and 19 deletions

View File

@ -1209,7 +1209,7 @@ namespace dxvk {
// TODO support address offset // TODO support address offset
// TODO support more sample ops // TODO support more sample ops
// sample has four operands: // All sample instructions have at least these operands:
// (dst0) The destination register // (dst0) The destination register
// (src0) Texture coordinates // (src0) Texture coordinates
// (src1) The texture itself // (src1) The texture itself
@ -1227,6 +1227,12 @@ namespace dxvk {
const DxbcRegisterValue coord = emitRegisterLoad( const DxbcRegisterValue coord = emitRegisterLoad(
texCoordReg, DxbcRegMask(true, true, true, true)); texCoordReg, DxbcRegMask(true, true, true, true));
// Load reference value for depth-compare operations
DxbcRegisterValue referenceValue;
if (ins.op == DxbcOpcode::SampleC || ins.op == DxbcOpcode::SampleClz)
referenceValue = emitRegisterLoad(ins.src[3], DxbcRegMask(true, false, false, false));
// Combine the texture and the sampler into a sampled image // Combine the texture and the sampler into a sampled image
const uint32_t sampledImageType = m_module.defSampledImageType( const uint32_t sampledImageType = m_module.defSampledImageType(
m_textures.at(textureId).textureTypeId); m_textures.at(textureId).textureTypeId);
@ -1242,18 +1248,41 @@ namespace dxvk {
// Sampling an image in SPIR-V always returns a four-component // Sampling an image in SPIR-V always returns a four-component
// vector, so we need to declare the corresponding type here // vector, so we need to declare the corresponding type here
// TODO infer sampled type properly // TODO infer sampled types properly
DxbcRegisterValue result; DxbcRegisterValue result;
result.type.ctype = DxbcScalarType::Float32;
result.type.ccount = 4; switch (ins.op) {
result.id = m_module.opImageSampleImplicitLod( case DxbcOpcode::Sample: {
getVectorTypeId(result.type), result.type.ctype = DxbcScalarType::Float32;
sampledImageId, coord.id); result.type.ccount = 4;
result.id = m_module.opImageSampleImplicitLod(
getVectorTypeId(result.type),
sampledImageId, coord.id);
} break;
case DxbcOpcode::SampleClz: {
result.type.ctype = DxbcScalarType::Float32;
result.type.ccount = 1;
result.id = m_module.opImageSampleDrefExplicitLod(
getVectorTypeId(result.type),
sampledImageId, coord.id,
referenceValue.id,
m_module.constf32(0.0f));
} break;
default:
Logger::warn(str::format(
"DxbcCompiler: Unhandled instruction: ",
ins.op));
return;
}
// Swizzle components using the texture swizzle // Swizzle components using the texture swizzle
// and the destination operand's write mask // and the destination operand's write mask
result = emitRegisterSwizzle(result, if (result.type.ccount != 1) {
textureReg.swizzle, ins.dst[0].mask); result = emitRegisterSwizzle(result,
textureReg.swizzle, ins.dst[0].mask);
}
emitRegisterStore(ins.dst[0], result); emitRegisterStore(ins.dst[0], result);
} }

View File

@ -169,10 +169,10 @@ namespace dxvk {
} }, } },
/* IMul */ /* IMul */
{ 4, DxbcInstClass::VectorImul, { { 4, DxbcInstClass::VectorImul, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, { DxbcOperandKind::DstReg, DxbcScalarType::Sint32 },
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, { DxbcOperandKind::DstReg, DxbcScalarType::Sint32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, { DxbcOperandKind::SrcReg, DxbcScalarType::Sint32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, { DxbcOperandKind::SrcReg, DxbcScalarType::Sint32 },
} }, } },
/* INe */ /* INe */
{ 3, DxbcInstClass::VectorCmp, { { 3, DxbcInstClass::VectorCmp, {
@ -300,9 +300,21 @@ namespace dxvk {
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, { DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
} }, } },
/* SampleC */ /* SampleC */
{ }, { 5, DxbcInstClass::TextureSample, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
} },
/* SampleClz */ /* SampleClz */
{ }, { 5, DxbcInstClass::TextureSample, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 },
} },
/* SampleL */ /* SampleL */
{ }, { },
/* SampleD */ /* SampleD */
@ -335,10 +347,10 @@ namespace dxvk {
{ }, { },
/* UMul */ /* UMul */
{ 4, DxbcInstClass::VectorImul, { { 4, DxbcInstClass::VectorImul, {
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, { DxbcOperandKind::DstReg, DxbcScalarType::Uint32 },
{ DxbcOperandKind::DstReg, DxbcScalarType::Float32 }, { DxbcOperandKind::DstReg, DxbcScalarType::Uint32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, { DxbcOperandKind::SrcReg, DxbcScalarType::Uint32 },
{ DxbcOperandKind::SrcReg, DxbcScalarType::Float32 }, { DxbcOperandKind::SrcReg, DxbcScalarType::Uint32 },
} }, } },
/* UMad */ /* UMad */
{ }, { },

View File

@ -1533,6 +1533,26 @@ namespace dxvk {
} }
uint32_t SpirvModule::opImageSampleDrefExplicitLod(
uint32_t resultType,
uint32_t sampledImage,
uint32_t coordinates,
uint32_t reference,
uint32_t lod) {
uint32_t resultId = this->allocateId();
m_code.putIns (spv::OpImageSampleDrefExplicitLod, 8);
m_code.putWord(resultType);
m_code.putWord(resultId);
m_code.putWord(sampledImage);
m_code.putWord(coordinates);
m_code.putWord(reference);
m_code.putWord(spv::ImageOperandsLodMask);
m_code.putWord(lod);
return resultId;
}
void SpirvModule::opLoopMerge( void SpirvModule::opLoopMerge(
uint32_t mergeBlock, uint32_t mergeBlock,
uint32_t continueTarget, uint32_t continueTarget,

View File

@ -520,6 +520,13 @@ namespace dxvk {
uint32_t sampledImage, uint32_t sampledImage,
uint32_t coordinates); uint32_t coordinates);
uint32_t opImageSampleDrefExplicitLod(
uint32_t resultType,
uint32_t sampledImage,
uint32_t coordinates,
uint32_t reference,
uint32_t lod);
void opLoopMerge( void opLoopMerge(
uint32_t mergeBlock, uint32_t mergeBlock,
uint32_t continueTarget, uint32_t continueTarget,