[dxbc] Removed in-shader bounds checking

It looks like this is not needed at the moment, and it needs more work.
This commit is contained in:
Philip Rebohle 2018-01-03 02:37:44 +01:00
parent 755e6d36e3
commit da751a46f7
1 changed files with 10 additions and 55 deletions

View File

@ -658,10 +658,11 @@ namespace dxvk {
default: break; // No additional capabilities required
}
// We do not know whether the image is going to be used as a color
// image or a depth image yet, so we'll declare types for both.
// We do not know whether the image is going to be used as
// a color image or a depth image yet, but we can pick the
// correct type when creating a sampled image object.
const uint32_t imageTypeId = m_module.defImageType(sampledTypeId,
typeInfo.dim, 2, typeInfo.array, typeInfo.ms, typeInfo.sampled,
typeInfo.dim, 0, typeInfo.array, typeInfo.ms, typeInfo.sampled,
spv::ImageFormatUnknown);
// We'll declare the texture variable with the color type
@ -2108,7 +2109,6 @@ namespace dxvk {
const DxbcRegMask coordArrayMask = getTexCoordMask(imageType);
const uint32_t imageLayerDim = getTexLayerDim(imageType);
const uint32_t imageCoordDim = getTexCoordDim(imageType);
// Load the texture coordinates. The last component
// contains the LOD if the resource is an image.
@ -2146,65 +2146,22 @@ namespace dxvk {
}
// Extract coordinates from address
const DxbcRegisterValue coord = emitRegisterExtract(address, coordArrayMask);
const DxbcRegisterValue coord =
emitRegisterExtract(address, coordArrayMask);
// Perform bounds checking. If the coordinates are
// out of bounds, we return zero in all components.
const DxbcRegisterValue resourceSize = imageType.dim != spv::DimBuffer
? emitQueryTextureSize(ins.src[1], imageLod)
: emitQueryTexelBufferSize(ins.src[1]);
uint32_t boundCheckId = m_module.opULessThan(
m_module.defVectorType(m_module.defBoolType(), imageCoordDim),
coord.id, resourceSize.id);
if (imageCoordDim > 1)
boundCheckId = m_module.opAll(m_module.defBoolType(), boundCheckId);
const uint32_t boundCheckPassLabel = m_module.allocateId();
const uint32_t boundCheckFailLabel = m_module.allocateId();
const uint32_t boundCheckMergeLabel = m_module.allocateId();
m_module.opSelectionMerge(boundCheckMergeLabel, spv::SelectionControlMaskNone);
m_module.opBranchConditional(boundCheckId, boundCheckPassLabel, boundCheckFailLabel);
const uint32_t imageId = m_module.opLoad(
m_textures.at(textureId).imageTypeId,
m_textures.at(textureId).varId);
// Reading a typed image or buffer view
// always returns a four-component vector.
DxbcRegisterValue result;
result.type.ctype = m_textures.at(textureId).sampledType;
result.type.ccount = 4;
// Bound check passed, load the texel
m_module.opLabel(boundCheckPassLabel);
const uint32_t imageId = m_module.opLoad(
m_textures.at(textureId).imageTypeId,
m_textures.at(textureId).varId);
const uint32_t boundCheckPassId = m_module.opImageFetch(
result.id = m_module.opImageFetch(
getVectorTypeId(result.type), imageId,
coord.id, imageOperands);
m_module.opBranch(boundCheckMergeLabel);
m_module.opLabel (boundCheckFailLabel);
// Return zeroes if the bound check failed
const uint32_t boundCheckFailId = emitBuildZeroVec(result.type).id;
m_module.opBranch(boundCheckMergeLabel);
m_module.opLabel (boundCheckMergeLabel);
// Use a phi function to determine
// which of the results to take.
const std::array<SpirvPhiLabel, 2> phiOps = {{
{ boundCheckPassId, boundCheckPassLabel },
{ boundCheckFailId, boundCheckFailLabel },
}};
result.id = m_module.opPhi(
getVectorTypeId(result.type),
phiOps.size(), phiOps.data());
// Swizzle components using the texture swizzle
// and the destination operand's write mask
result = emitRegisterSwizzle(result,
@ -2280,8 +2237,6 @@ namespace dxvk {
: DxbcRegisterValue();
// Determine the sampled image type based on the opcode.
// FIXME while this is in line what the offical glsl compiler
// does, this might actually violate the SPIR-V specification.
const uint32_t sampledImageType = isDepthCompare
? m_module.defSampledImageType(m_textures.at(textureId).depthTypeId)
: m_module.defSampledImageType(m_textures.at(textureId).colorTypeId);