Reduce memory requirements for resource bindings.
Use uint16_t instead of uint32_t for Metal resource indexes in binding structures. MVKIndexMTLBufferBinding::mtlIndexType track MTLIndexType as uint8_t.
This commit is contained in:
parent
40d0427d31
commit
d443b131e0
@ -306,7 +306,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
pipeline->getStages(stages);
|
||||
|
||||
MVKIndexMTLBufferBinding& ibb = cmdEncoder->_graphicsResourcesState._mtlIndexBufferBinding;
|
||||
size_t idxSize = mvkMTLIndexTypeSizeInBytes(ibb.mtlIndexType);
|
||||
size_t idxSize = mvkMTLIndexTypeSizeInBytes((MTLIndexType)ibb.mtlIndexType);
|
||||
VkDeviceSize idxBuffOffset = ibb.offset + (_firstIndex * idxSize);
|
||||
|
||||
const MVKMTLBufferAllocation* vtxOutBuff = nullptr;
|
||||
@ -333,7 +333,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
// Yeah, this sucks. But there aren't many good ways for dealing with this issue.
|
||||
mtlTessCtlEncoder = cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationControl);
|
||||
tcIndexBuff = cmdEncoder->getTempMTLBuffer(_instanceCount * patchCount * outControlPointCount * idxSize);
|
||||
id<MTLComputePipelineState> mtlCopyIndexState = cmdEncoder->getCommandEncodingPool()->getCmdDrawIndexedCopyIndexBufferMTLComputePipelineState(ibb.mtlIndexType);
|
||||
id<MTLComputePipelineState> mtlCopyIndexState = cmdEncoder->getCommandEncodingPool()->getCmdDrawIndexedCopyIndexBufferMTLComputePipelineState((MTLIndexType)ibb.mtlIndexType);
|
||||
[mtlTessCtlEncoder setComputePipelineState: mtlCopyIndexState];
|
||||
[mtlTessCtlEncoder setBuffer: ibb.mtlBuffer
|
||||
offset: ibb.offset
|
||||
@ -382,7 +382,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
if (cmdEncoder->_pDeviceMetalFeatures->baseVertexInstanceDrawing) {
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: MTLPrimitiveTypePoint
|
||||
indexCount: _indexCount
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: idxBuffOffset
|
||||
instanceCount: _instanceCount
|
||||
@ -391,7 +391,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
} else {
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: MTLPrimitiveTypePoint
|
||||
indexCount: _indexCount
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: idxBuffOffset
|
||||
instanceCount: _instanceCount];
|
||||
@ -482,7 +482,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
if (cmdEncoder->_pDeviceMetalFeatures->baseVertexInstanceDrawing) {
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: cmdEncoder->_mtlPrimitiveType
|
||||
indexCount: _indexCount
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: idxBuffOffset
|
||||
instanceCount: _instanceCount
|
||||
@ -491,7 +491,7 @@ void MVKCmdDrawIndexed::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
} else {
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: cmdEncoder->_mtlPrimitiveType
|
||||
indexCount: _indexCount
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: idxBuffOffset
|
||||
instanceCount: _instanceCount];
|
||||
@ -775,7 +775,7 @@ VkResult MVKCmdDrawIndexedIndirect::setContent(MVKCommandBuffer* cmdBuff,
|
||||
void MVKCmdDrawIndexedIndirect::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
|
||||
MVKIndexMTLBufferBinding& ibb = cmdEncoder->_graphicsResourcesState._mtlIndexBufferBinding;
|
||||
size_t idxSize = mvkMTLIndexTypeSizeInBytes(ibb.mtlIndexType);
|
||||
size_t idxSize = mvkMTLIndexTypeSizeInBytes((MTLIndexType)ibb.mtlIndexType);
|
||||
auto* pipeline = (MVKGraphicsPipeline*)cmdEncoder->_graphicsPipelineState.getPipeline();
|
||||
// The indirect calls for dispatchThreadgroups:... and drawPatches:... have different formats.
|
||||
// We have to convert from the drawIndexedPrimitives:... format to them.
|
||||
@ -863,7 +863,7 @@ void MVKCmdDrawIndexedIndirect::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
// or not there are gaps in it, because there's no way to tell Metal to
|
||||
// offset an index buffer from a value in an indirect buffer. This also
|
||||
// means that, to make a copy, we have to use a compute shader.
|
||||
id<MTLComputePipelineState> mtlCopyIndexState = cmdEncoder->getCommandEncodingPool()->getCmdDrawIndexedCopyIndexBufferMTLComputePipelineState(ibb.mtlIndexType);
|
||||
id<MTLComputePipelineState> mtlCopyIndexState = cmdEncoder->getCommandEncodingPool()->getCmdDrawIndexedCopyIndexBufferMTLComputePipelineState((MTLIndexType)ibb.mtlIndexType);
|
||||
[mtlTessCtlEncoder setComputePipelineState: mtlCopyIndexState];
|
||||
[mtlTessCtlEncoder setBuffer: ibb.mtlBuffer
|
||||
offset: ibb.offset
|
||||
@ -902,7 +902,7 @@ void MVKCmdDrawIndexedIndirect::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
atIndex: pipeline->getIndirectParamsIndex().stages[kMVKShaderStageVertex]];
|
||||
}
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: MTLPrimitiveTypePoint
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: ibb.offset
|
||||
indirectBuffer: _mtlIndirectBuffer
|
||||
@ -991,7 +991,7 @@ void MVKCmdDrawIndexedIndirect::encode(MVKCommandEncoder* cmdEncoder) {
|
||||
cmdEncoder->getPushConstants(VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT)->beginMetalRenderPass();
|
||||
} else {
|
||||
[cmdEncoder->_mtlRenderEncoder drawIndexedPrimitives: cmdEncoder->_mtlPrimitiveType
|
||||
indexType: ibb.mtlIndexType
|
||||
indexType: (MTLIndexType)ibb.mtlIndexType
|
||||
indexBuffer: ibb.mtlBuffer
|
||||
indexBufferOffset: ibb.offset
|
||||
indirectBuffer: _mtlIndirectBuffer
|
||||
|
@ -23,15 +23,15 @@
|
||||
/** Describes a MTLTexture resource binding. */
|
||||
typedef struct {
|
||||
union { id<MTLTexture> mtlTexture = nil; id<MTLTexture> mtlResource; }; // aliases
|
||||
uint32_t index = 0;
|
||||
uint32_t swizzle = 0;
|
||||
uint16_t index = 0;
|
||||
bool isDirty = true;
|
||||
} MVKMTLTextureBinding;
|
||||
|
||||
/** Describes a MTLSamplerState resource binding. */
|
||||
typedef struct {
|
||||
union { id<MTLSamplerState> mtlSamplerState = nil; id<MTLSamplerState> mtlResource; }; // aliases
|
||||
uint32_t index = 0;
|
||||
uint16_t index = 0;
|
||||
bool isDirty = true;
|
||||
} MVKMTLSamplerStateBinding;
|
||||
|
||||
@ -39,8 +39,8 @@ typedef struct {
|
||||
typedef struct {
|
||||
union { id<MTLBuffer> mtlBuffer = nil; id<MTLBuffer> mtlResource; const void* mtlBytes; }; // aliases
|
||||
NSUInteger offset = 0;
|
||||
uint32_t index = 0;
|
||||
uint32_t size = 0;
|
||||
uint16_t index = 0;
|
||||
bool isDirty = true;
|
||||
bool isInline = false;
|
||||
} MVKMTLBufferBinding;
|
||||
@ -49,6 +49,6 @@ typedef struct {
|
||||
typedef struct {
|
||||
union { id<MTLBuffer> mtlBuffer = nil; id<MTLBuffer> mtlResource; }; // aliases
|
||||
NSUInteger offset = 0;
|
||||
MTLIndexType mtlIndexType;
|
||||
uint8_t mtlIndexType; // MTLIndexType
|
||||
bool isDirty = true;
|
||||
} MVKIndexMTLBufferBinding;
|
||||
|
@ -31,9 +31,9 @@ class MVKCommandEncoder;
|
||||
|
||||
/** Indicates the Metal resource indexes used by a single shader stage in a descriptor. */
|
||||
typedef struct MVKShaderStageResourceBinding {
|
||||
uint32_t bufferIndex = 0;
|
||||
uint32_t textureIndex = 0;
|
||||
uint32_t samplerIndex = 0;
|
||||
uint16_t bufferIndex = 0;
|
||||
uint16_t textureIndex = 0;
|
||||
uint16_t samplerIndex = 0;
|
||||
|
||||
MVKShaderStageResourceBinding operator+ (const MVKShaderStageResourceBinding& rhs);
|
||||
MVKShaderStageResourceBinding& operator+= (const MVKShaderStageResourceBinding& rhs);
|
||||
@ -47,9 +47,9 @@ typedef struct MVKShaderStageResourceBinding {
|
||||
typedef struct MVKShaderResourceBinding {
|
||||
MVKShaderStageResourceBinding stages[kMVKShaderStageMax];
|
||||
|
||||
uint32_t getMaxBufferIndex();
|
||||
uint32_t getMaxTextureIndex();
|
||||
uint32_t getMaxSamplerIndex();
|
||||
uint16_t getMaxBufferIndex();
|
||||
uint16_t getMaxTextureIndex();
|
||||
uint16_t getMaxSamplerIndex();
|
||||
|
||||
MVKShaderResourceBinding operator+ (const MVKShaderResourceBinding& rhs);
|
||||
MVKShaderResourceBinding& operator+= (const MVKShaderResourceBinding& rhs);
|
||||
|
@ -41,15 +41,15 @@ MVKShaderStageResourceBinding& MVKShaderStageResourceBinding::operator+= (const
|
||||
|
||||
#pragma mark MVKShaderResourceBinding
|
||||
|
||||
uint32_t MVKShaderResourceBinding::getMaxBufferIndex() {
|
||||
uint16_t MVKShaderResourceBinding::getMaxBufferIndex() {
|
||||
return std::max({stages[kMVKShaderStageVertex].bufferIndex, stages[kMVKShaderStageTessCtl].bufferIndex, stages[kMVKShaderStageTessEval].bufferIndex, stages[kMVKShaderStageFragment].bufferIndex, stages[kMVKShaderStageCompute].bufferIndex});
|
||||
}
|
||||
|
||||
uint32_t MVKShaderResourceBinding::getMaxTextureIndex() {
|
||||
uint16_t MVKShaderResourceBinding::getMaxTextureIndex() {
|
||||
return std::max({stages[kMVKShaderStageVertex].textureIndex, stages[kMVKShaderStageTessCtl].textureIndex, stages[kMVKShaderStageTessEval].textureIndex, stages[kMVKShaderStageFragment].textureIndex, stages[kMVKShaderStageCompute].textureIndex});
|
||||
}
|
||||
|
||||
uint32_t MVKShaderResourceBinding::getMaxSamplerIndex() {
|
||||
uint16_t MVKShaderResourceBinding::getMaxSamplerIndex() {
|
||||
return std::max({stages[kMVKShaderStageVertex].samplerIndex, stages[kMVKShaderStageTessCtl].samplerIndex, stages[kMVKShaderStageTessEval].samplerIndex, stages[kMVKShaderStageFragment].samplerIndex, stages[kMVKShaderStageCompute].samplerIndex});
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user