No longer extract MTLTextureType from SPIR-V Cross to create MTLArgumentEncoders.
MVKDescriptorSetLayoutBinding no longer uses MTLTextureType to create MTLArgumentEncoder, which is not needed for descriptor set argument encoding. Remove obsolete MSLResourceBinding::outMTLTextureType and SPIRVToMSLConversionConfiguration::getMTLTextureType().
This commit is contained in:
parent
4f0367130d
commit
ca89d258c9
@ -166,15 +166,11 @@ protected:
|
||||
friend class MVKInlineUniformBlockDescriptor;
|
||||
|
||||
void initMetalResourceIndexOffsets(const VkDescriptorSetLayoutBinding* pBinding, uint32_t stage);
|
||||
void addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args,
|
||||
mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
|
||||
uint32_t descSetIdx);
|
||||
void addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args);
|
||||
void addMTLArgumentDescriptor(NSMutableArray<MTLArgumentDescriptor*>* args,
|
||||
uint32_t argIndex,
|
||||
MTLDataType dataType,
|
||||
MTLArgumentAccess access,
|
||||
mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
|
||||
uint32_t descSetIdx);
|
||||
MTLArgumentAccess access);
|
||||
bool isUsingMetalArgumentBuffer();
|
||||
void populateShaderConverterContext(mvk::SPIRVToMSLConversionConfiguration& context,
|
||||
MVKShaderResourceBinding& dslMTLRezIdxOffsets,
|
||||
|
@ -444,48 +444,46 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
|
||||
bool MVKDescriptorSetLayoutBinding::isUsingMetalArgumentBuffer() { return _layout->isUsingMetalArgumentBuffer(); };
|
||||
|
||||
// Adds MTLArgumentDescriptors to the array, and updates resource indexes consumed.
|
||||
void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args,
|
||||
mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
|
||||
uint32_t descSetIdx) {
|
||||
void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptors(NSMutableArray<MTLArgumentDescriptor*>* args) {
|
||||
switch (getDescriptorType()) {
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||
case VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadOnly);
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite);
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE:
|
||||
case VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_IMAGE:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite, shaderConfig, descSetIdx); // Needed for atomic operations
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite); // Needed for atomic operations
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite, shaderConfig, descSetIdx); // Needed for atomic operations
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadWrite);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().bufferIndex, MTLDataTypePointer, MTLArgumentAccessReadWrite); // Needed for atomic operations
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_SAMPLER:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
|
||||
break;
|
||||
|
||||
case VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER:
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly, shaderConfig, descSetIdx);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().textureIndex, MTLDataTypeTexture, MTLArgumentAccessReadOnly);
|
||||
addMTLArgumentDescriptor(args, getMetalResourceIndexOffsets().samplerIndex, MTLDataTypeSampler, MTLArgumentAccessReadOnly);
|
||||
break;
|
||||
|
||||
default:
|
||||
@ -493,13 +491,10 @@ void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptors(NSMutableArray<MTL
|
||||
}
|
||||
}
|
||||
|
||||
// Adds an MTLArgumentDescriptor if the specified type to the array, and updates resource indexes consumed.
|
||||
void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptor(NSMutableArray<MTLArgumentDescriptor*>* args,
|
||||
uint32_t argIndex,
|
||||
MTLDataType dataType,
|
||||
MTLArgumentAccess access,
|
||||
mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
|
||||
uint32_t descSetIdx) {
|
||||
MTLArgumentAccess access) {
|
||||
uint32_t descCnt = getDescriptorCount();
|
||||
if (descCnt == 0) { return; }
|
||||
|
||||
@ -508,7 +503,7 @@ void MVKDescriptorSetLayoutBinding::addMTLArgumentDescriptor(NSMutableArray<MTLA
|
||||
argDesc.access = access;
|
||||
argDesc.index = argIndex;
|
||||
argDesc.arrayLength = descCnt;
|
||||
argDesc.textureType = shaderConfig.getMTLTextureType(descSetIdx, getBinding());
|
||||
argDesc.textureType = MTLTextureType2D;
|
||||
|
||||
[args addObject: argDesc];
|
||||
}
|
||||
|
@ -116,8 +116,7 @@ protected:
|
||||
uint32_t getDescriptorIndex(uint32_t binding, uint32_t elementIndex = 0) { return getBinding(binding)->getDescriptorIndex(elementIndex); }
|
||||
MVKDescriptorSetLayoutBinding* getBinding(uint32_t binding) { return &_bindings[_bindingToIndex[binding]]; }
|
||||
const VkDescriptorBindingFlags* getBindingFlags(const VkDescriptorSetLayoutCreateInfo* pCreateInfo);
|
||||
void initForMetalArgumentBufferUse();
|
||||
id<MTLArgumentEncoder> newMTLArgumentEncoder(mvk::SPIRVToMSLConversionConfiguration& shaderConfig, uint32_t descSetIdx);
|
||||
void initMTLArgumentEncoder();
|
||||
|
||||
MVKSmallVector<MVKDescriptorSetLayoutBinding> _bindings;
|
||||
std::unordered_map<uint32_t, uint32_t> _bindingToIndex;
|
||||
|
@ -183,19 +183,6 @@ void MVKDescriptorSetLayout::populateShaderConverterContext(mvk::SPIRVToMSLConve
|
||||
}
|
||||
}
|
||||
|
||||
id<MTLArgumentEncoder> MVKDescriptorSetLayout::newMTLArgumentEncoder(mvk::SPIRVToMSLConversionConfiguration& shaderConfig,
|
||||
uint32_t descSetIdx) {
|
||||
if ( !(isUsingMetalArgumentBuffer() && isUsingDescriptorSetMetalArgumentBuffers()) ) { return nil; }
|
||||
|
||||
@autoreleasepool {
|
||||
NSMutableArray<MTLArgumentDescriptor*>* args = [NSMutableArray arrayWithCapacity: _bindings.size()];
|
||||
for (auto& dslBind : _bindings) {
|
||||
dslBind.addMTLArgumentDescriptors(args, shaderConfig, descSetIdx);
|
||||
}
|
||||
return (args.count) ? [getMTLDevice() newArgumentEncoderWithArguments: args] : nil;
|
||||
}
|
||||
}
|
||||
|
||||
MVKDescriptorSetLayout::MVKDescriptorSetLayout(MVKDevice* device,
|
||||
const VkDescriptorSetLayoutCreateInfo* pCreateInfo) : MVKVulkanAPIDeviceObject(device) {
|
||||
|
||||
@ -229,7 +216,7 @@ MVKDescriptorSetLayout::MVKDescriptorSetLayout(MVKDevice* device,
|
||||
_descriptorCount += _bindings.back().getDescriptorCount();
|
||||
}
|
||||
|
||||
initForMetalArgumentBufferUse();
|
||||
initMTLArgumentEncoder();
|
||||
}
|
||||
|
||||
// Find and return an array of binding flags from the pNext chain of pCreateInfo,
|
||||
@ -248,9 +235,14 @@ const VkDescriptorBindingFlags* MVKDescriptorSetLayout::getBindingFlags(const Vk
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void MVKDescriptorSetLayout::initForMetalArgumentBufferUse() {
|
||||
SPIRVToMSLConversionConfiguration shaderConfig;
|
||||
_mtlArgumentEncoder.init(newMTLArgumentEncoder(shaderConfig, 0));
|
||||
void MVKDescriptorSetLayout::initMTLArgumentEncoder() {
|
||||
if (isUsingDescriptorSetMetalArgumentBuffers() && isUsingMetalArgumentBuffer()) {
|
||||
@autoreleasepool {
|
||||
NSMutableArray<MTLArgumentDescriptor*>* args = [NSMutableArray arrayWithCapacity: _bindings.size()];
|
||||
for (auto& dslBind : _bindings) { dslBind.addMTLArgumentDescriptors(args); }
|
||||
_mtlArgumentEncoder.init(args.count ? [getMTLDevice() newArgumentEncoderWithArguments: args] : nil);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -2202,7 +2202,6 @@ namespace mvk {
|
||||
void serialize(Archive & archive, MSLResourceBinding& rb) {
|
||||
archive(rb.resourceBinding,
|
||||
rb.constExprSampler,
|
||||
rb.outMTLTextureType,
|
||||
rb.requiresConstExprSampler,
|
||||
rb.outIsUsedByShader);
|
||||
}
|
||||
|
@ -26,23 +26,6 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#ifdef __OBJC__
|
||||
#import <Metal/Metal.h>
|
||||
#else
|
||||
enum MTLTextureType {
|
||||
MTLTextureType1D,
|
||||
MTLTextureType1DArray,
|
||||
MTLTextureType2D,
|
||||
MTLTextureType2DArray,
|
||||
MTLTextureType2DMultisample,
|
||||
MTLTextureType2DMultisampleArray,
|
||||
MTLTextureType3D,
|
||||
MTLTextureTypeCube,
|
||||
MTLTextureTypeCubeArray,
|
||||
MTLTextureTypeTextureBuffer
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
namespace mvk {
|
||||
|
||||
@ -297,51 +280,5 @@ namespace mvk {
|
||||
}
|
||||
}
|
||||
|
||||
/** Given the compiler, returns the MTLTextureType of the descriptor set binding. */
|
||||
template<typename C>
|
||||
MTLTextureType getMTLTextureType(C* compiler, uint32_t desc_set, uint32_t binding) {
|
||||
for (auto varID : compiler->get_active_interface_variables()) {
|
||||
if (compiler->has_decoration(varID, spv::DecorationDescriptorSet) &&
|
||||
compiler->get_decoration(varID, spv::DecorationDescriptorSet) == desc_set &&
|
||||
compiler->has_decoration(varID, spv::DecorationBinding) &&
|
||||
compiler->get_decoration(varID, spv::DecorationBinding) == binding) {
|
||||
|
||||
auto& mslOpts = compiler->get_msl_options();
|
||||
auto& imgType = compiler->get_type_from_variable(varID).image;
|
||||
bool isArray = imgType.arrayed;
|
||||
switch (imgType.dim) {
|
||||
case spv::DimBuffer:
|
||||
return mslOpts.texture_buffer_native ? MTLTextureTypeTextureBuffer : MTLTextureType2D;
|
||||
|
||||
case spv::Dim1D:
|
||||
return (mslOpts.texture_1D_as_2D
|
||||
? (isArray ? MTLTextureType2DArray : MTLTextureType2D)
|
||||
: (isArray ? MTLTextureType1DArray : MTLTextureType1D));
|
||||
|
||||
case spv::Dim2D:
|
||||
case spv::DimSubpassData:
|
||||
#if MVK_MACOS_OR_IOS
|
||||
if (isArray && imgType.ms) { return MTLTextureType2DMultisampleArray; }
|
||||
#endif
|
||||
return (isArray
|
||||
? MTLTextureType2DArray
|
||||
: (imgType.ms ? MTLTextureType2DMultisample : MTLTextureType2D));
|
||||
|
||||
case spv::Dim3D:
|
||||
return MTLTextureType3D;
|
||||
|
||||
case spv::DimCube:
|
||||
return (mslOpts.emulate_cube_array
|
||||
? (isArray ? MTLTextureType2DArray : MTLTextureType2D)
|
||||
: (isArray ? MTLTextureTypeCubeArray : MTLTextureTypeCube));
|
||||
|
||||
default:
|
||||
return MTLTextureType2D;
|
||||
}
|
||||
}
|
||||
}
|
||||
return MTLTextureType2D;
|
||||
}
|
||||
|
||||
}
|
||||
#endif
|
||||
|
@ -96,13 +96,10 @@ namespace mvk {
|
||||
* hardcoded into the MSL as a constexpr type, instead of passed in as a runtime-bound variable.
|
||||
* The content of that constexpr sampler is defined in the constExprSampler parameter.
|
||||
*
|
||||
* The outIsUsedByShader and outMTLTextureType values are set by the shader converter
|
||||
* based on the content of the SPIR-V (and resulting MSL), and provide feedback to the
|
||||
* pipeline about shader content. The outIsUsedByShader value is set to true if the shader
|
||||
* makes use of this resource binding. This allows a pipeline to be optimized, and for two
|
||||
* shader conversion configurations to be compared only against the resource bindings that
|
||||
* are actually used by the shader. The outMTLTextureType value provides feedback to the
|
||||
* pipeline regarding the texture type expected by the shader.
|
||||
* The outIsUsedByShader value is set by the shader converter based on the content of the SPIR-V
|
||||
* (and resulting MSL), and is set to true if the shader makes use of this resource binding.
|
||||
* This allows a pipeline to be optimized, and for two shader conversion configurations to
|
||||
* be compared only against the resource bindings that are actually used by the shader.
|
||||
*
|
||||
* THIS STRUCT IS STREAMED OUT AS PART OF THE PIEPLINE CACHE.
|
||||
* CHANGES TO THIS STRUCT SHOULD BE CAPTURED IN THE STREAMING LOGIC OF THE PIPELINE CACHE.
|
||||
@ -110,13 +107,12 @@ namespace mvk {
|
||||
typedef struct MSLResourceBinding {
|
||||
SPIRV_CROSS_NAMESPACE::MSLResourceBinding resourceBinding;
|
||||
SPIRV_CROSS_NAMESPACE::MSLConstexprSampler constExprSampler;
|
||||
MTLTextureType outMTLTextureType = MTLTextureType2D;
|
||||
bool requiresConstExprSampler = false;
|
||||
bool outIsUsedByShader = false;
|
||||
|
||||
/**
|
||||
* Returns whether the specified resource binding match this one.
|
||||
* It does if all corresponding elements except outMTLTextureType and outIsUsedByShader are equal.
|
||||
* It does if all corresponding elements except outIsUsedByShader are equal.
|
||||
*/
|
||||
bool matches(const MSLResourceBinding& other) const;
|
||||
|
||||
@ -164,9 +160,6 @@ namespace mvk {
|
||||
/** Returns whether the vertex buffer at the specified Vulkan binding is used by the shader. */
|
||||
bool isVertexBufferUsed(uint32_t binding) const { return countShaderInputsAt(binding) > 0; }
|
||||
|
||||
/** Returns the MTLTextureType of the image resource at the descriptor set and binding. */
|
||||
MTLTextureType getMTLTextureType(uint32_t descSet, uint32_t binding) const;
|
||||
|
||||
/** Marks all input variables and resources as being used by the shader. */
|
||||
void markAllInputsAndResourcesUsed();
|
||||
|
||||
|
@ -181,16 +181,6 @@ MVK_PUBLIC_SYMBOL uint32_t SPIRVToMSLConversionConfiguration::countShaderInputsA
|
||||
return siCnt;
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL MTLTextureType SPIRVToMSLConversionConfiguration::getMTLTextureType(uint32_t descSet, uint32_t binding) const {
|
||||
for (auto& rb : resourceBindings) {
|
||||
auto& rbb = rb.resourceBinding;
|
||||
if (rb.outIsUsedByShader && rbb.desc_set == descSet && rbb.binding == binding) {
|
||||
return rb.outMTLTextureType;
|
||||
}
|
||||
}
|
||||
return MTLTextureType2D;
|
||||
}
|
||||
|
||||
MVK_PUBLIC_SYMBOL void SPIRVToMSLConversionConfiguration::markAllInputsAndResourcesUsed() {
|
||||
for (auto& si : shaderInputs) { si.outIsUsedByShader = true; }
|
||||
for (auto& rb : resourceBindings) { rb.outIsUsedByShader = true; }
|
||||
@ -231,10 +221,8 @@ MVK_PUBLIC_SYMBOL void SPIRVToMSLConversionConfiguration::alignWith(const SPIRVT
|
||||
|
||||
for (auto& rb : resourceBindings) {
|
||||
rb.outIsUsedByShader = false;
|
||||
rb.outMTLTextureType = MTLTextureType2D;
|
||||
for (auto& srcRB : srcContext.resourceBindings) {
|
||||
if (rb.matches(srcRB)) {
|
||||
rb.outMTLTextureType = srcRB.outMTLTextureType;
|
||||
rb.outIsUsedByShader = srcRB.outIsUsedByShader;
|
||||
}
|
||||
}
|
||||
@ -376,9 +364,6 @@ MVK_PUBLIC_SYMBOL bool SPIRVToMSLConverter::convert(SPIRVToMSLConversionConfigur
|
||||
}
|
||||
for (auto& ctxRB : context.resourceBindings) {
|
||||
if (ctxRB.resourceBinding.stage == context.options.entryPointStage) {
|
||||
ctxRB.outMTLTextureType = getMTLTextureType(pMSLCompiler,
|
||||
ctxRB.resourceBinding.desc_set,
|
||||
ctxRB.resourceBinding.binding);
|
||||
ctxRB.outIsUsedByShader = pMSLCompiler->is_msl_resource_binding_used(ctxRB.resourceBinding.stage,
|
||||
ctxRB.resourceBinding.desc_set,
|
||||
ctxRB.resourceBinding.binding);
|
||||
|
Loading…
x
Reference in New Issue
Block a user