mirror of
https://github.com/doitsujin/dxvk.git
synced 2024-12-11 01:24:12 +01:00
[dxbc] Fixed image size query for multisampled images
This commit is contained in:
parent
d0201a1bab
commit
76d48fcdf5
@ -2197,41 +2197,14 @@ namespace dxvk {
|
|||||||
const DxbcRegisterValue mipLod = emitRegisterLoad(
|
const DxbcRegisterValue mipLod = emitRegisterLoad(
|
||||||
ins.src[0], DxbcRegMask(true, false, false, false));
|
ins.src[0], DxbcRegMask(true, false, false, false));
|
||||||
|
|
||||||
// Image type, which stores the image dimensions etc.
|
|
||||||
const uint32_t imageDim = [&] {
|
|
||||||
switch (resourceInfo.image.dim) {
|
|
||||||
case spv::Dim1D: return 1;
|
|
||||||
case spv::Dim2D: return 2;
|
|
||||||
case spv::Dim3D: return 3;
|
|
||||||
case spv::DimCube: return 2;
|
|
||||||
default: throw DxvkError("DxbcCompiler: resinfo: Unsupported image dim");
|
|
||||||
}
|
|
||||||
}();
|
|
||||||
|
|
||||||
const DxbcScalarType returnType = resinfoType == DxbcResinfoType::Uint
|
const DxbcScalarType returnType = resinfoType == DxbcResinfoType::Uint
|
||||||
? DxbcScalarType::Uint32 : DxbcScalarType::Float32;
|
? DxbcScalarType::Uint32 : DxbcScalarType::Float32;
|
||||||
|
|
||||||
// Load the image variable itself
|
// Query the size of the selected mip level, as well as the
|
||||||
const uint32_t imageId = m_module.opLoad(
|
// total number of mip levels. We will have to combine the
|
||||||
resourceInfo.typeId, resourceInfo.varId);
|
// result into a four-component vector later.
|
||||||
|
DxbcRegisterValue imageSize = emitQueryTextureSize(ins.src[1], mipLod);
|
||||||
// Query image size. This will be written to the
|
DxbcRegisterValue imageLevels = emitQueryTextureLods(ins.src[1]);
|
||||||
// first components of the destination register.
|
|
||||||
DxbcRegisterValue imageSize;
|
|
||||||
imageSize.type.ctype = DxbcScalarType::Uint32;
|
|
||||||
imageSize.type.ccount = imageDim + resourceInfo.image.array;
|
|
||||||
imageSize.id = m_module.opImageQuerySizeLod(
|
|
||||||
getVectorTypeId(imageSize.type),
|
|
||||||
imageId, mipLod.id);
|
|
||||||
|
|
||||||
// Query image levels. This will be written to
|
|
||||||
// the w component of the destination register.
|
|
||||||
DxbcRegisterValue imageLevels;
|
|
||||||
imageLevels.type.ctype = DxbcScalarType::Uint32;
|
|
||||||
imageLevels.type.ccount = 1;
|
|
||||||
imageLevels.id = m_module.opImageQueryLevels(
|
|
||||||
getVectorTypeId(imageLevels.type),
|
|
||||||
imageId);
|
|
||||||
|
|
||||||
// Convert intermediates to the requested type
|
// Convert intermediates to the requested type
|
||||||
if (returnType == DxbcScalarType::Float32) {
|
if (returnType == DxbcScalarType::Float32) {
|
||||||
@ -2249,13 +2222,15 @@ namespace dxvk {
|
|||||||
// If the selected return type is rcpFloat, we need
|
// If the selected return type is rcpFloat, we need
|
||||||
// to compute the reciprocal of the image dimensions,
|
// to compute the reciprocal of the image dimensions,
|
||||||
// but not the array size, so we need to separate it.
|
// but not the array size, so we need to separate it.
|
||||||
|
const uint32_t imageCoordDim = imageSize.type.ccount;
|
||||||
|
|
||||||
DxbcRegisterValue imageLayers;
|
DxbcRegisterValue imageLayers;
|
||||||
imageLayers.type = imageSize.type;
|
imageLayers.type = imageSize.type;
|
||||||
imageLayers.id = 0;
|
imageLayers.id = 0;
|
||||||
|
|
||||||
if (resinfoType == DxbcResinfoType::RcpFloat && resourceInfo.image.array) {
|
if (resinfoType == DxbcResinfoType::RcpFloat && resourceInfo.image.array) {
|
||||||
imageLayers = emitRegisterExtract(imageSize, DxbcRegMask::select(imageDim));
|
imageLayers = emitRegisterExtract(imageSize, DxbcRegMask::select(imageCoordDim - 1));
|
||||||
imageSize = emitRegisterExtract(imageSize, DxbcRegMask::firstN(imageDim));
|
imageSize = emitRegisterExtract(imageSize, DxbcRegMask::firstN(imageCoordDim - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resinfoType == DxbcResinfoType::RcpFloat) {
|
if (resinfoType == DxbcResinfoType::RcpFloat) {
|
||||||
@ -2278,12 +2253,12 @@ namespace dxvk {
|
|||||||
if (imageLayers.id != 0)
|
if (imageLayers.id != 0)
|
||||||
vectorIds[numVectorIds++] = imageLayers.id;
|
vectorIds[numVectorIds++] = imageLayers.id;
|
||||||
|
|
||||||
if (imageDim + resourceInfo.image.array < 3) {
|
if (imageCoordDim < 3) {
|
||||||
const uint32_t zero = returnType == DxbcScalarType::Uint32
|
const uint32_t zero = returnType == DxbcScalarType::Uint32
|
||||||
? m_module.constu32(0)
|
? m_module.constu32(0)
|
||||||
: m_module.constf32(0.0f);
|
: m_module.constf32(0.0f);
|
||||||
|
|
||||||
for (uint32_t i = imageDim + resourceInfo.image.array; i < 3; i++)
|
for (uint32_t i = imageCoordDim; i < 3; i++)
|
||||||
vectorIds[numVectorIds++] = zero;
|
vectorIds[numVectorIds++] = zero;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3957,10 +3932,17 @@ namespace dxvk {
|
|||||||
DxbcRegisterValue result;
|
DxbcRegisterValue result;
|
||||||
result.type.ctype = DxbcScalarType::Uint32;
|
result.type.ctype = DxbcScalarType::Uint32;
|
||||||
result.type.ccount = getTexCoordDim(info.image);
|
result.type.ccount = getTexCoordDim(info.image);
|
||||||
result.id = m_module.opImageQuerySizeLod(
|
|
||||||
getVectorTypeId(result.type),
|
if (info.image.ms == 0) {
|
||||||
m_module.opLoad(info.typeId, info.varId),
|
result.id = m_module.opImageQuerySizeLod(
|
||||||
lod.id);
|
getVectorTypeId(result.type),
|
||||||
|
m_module.opLoad(info.typeId, info.varId),
|
||||||
|
lod.id);
|
||||||
|
} else {
|
||||||
|
result.id = m_module.opImageQuerySize(
|
||||||
|
getVectorTypeId(result.type),
|
||||||
|
m_module.opLoad(info.typeId, info.varId));
|
||||||
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3976,8 +3958,8 @@ namespace dxvk {
|
|||||||
const uint32_t typeId = getVectorTypeId(result.type);
|
const uint32_t typeId = getVectorTypeId(result.type);
|
||||||
|
|
||||||
result.id = m_module.opIAdd(typeId,
|
result.id = m_module.opIAdd(typeId,
|
||||||
m_module.opIMul(typeId, structId.id, m_module.consti32(structStride / 4)),
|
m_module.opIMul(typeId, structId.id, m_module.consti32(structStride / 4)),
|
||||||
m_module.opSDiv(typeId, structOffset.id, m_module.consti32(4)));
|
m_module.opSDiv(typeId, structOffset.id, m_module.consti32(4)));
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user