Pass MVKArrayRef by reference to functions.

Per cdavis5e observation:
Since an MVKArrayRef<T> is just a pointer and a size, passing it around by
reference doesn't buy much. It might actually hurt performance, since cache
lines might be evicted to make room for the MVKArrayRef in memory.
For this reason, LLVM passes its ArrayRefs by value.

Unrelatedly, update runcts to log errors by default.
This commit is contained in:
Bill Hollings 2021-08-04 13:16:25 -04:00
parent 12f0089d0c
commit 8b1435ca88
7 changed files with 24 additions and 24 deletions

View File

@ -428,7 +428,7 @@ protected:
contents[index] = value; contents[index] = value;
} }
void assertMissingSwizzles(bool needsSwizzle, const char* stageName, const MVKArrayRef<MVKMTLTextureBinding>& texBindings); void assertMissingSwizzles(bool needsSwizzle, const char* stageName, const MVKArrayRef<MVKMTLTextureBinding> texBindings);
void encodeMetalArgumentBuffer(MVKShaderStage stage); void encodeMetalArgumentBuffer(MVKShaderStage stage);
virtual void bindMetalArgumentBuffer(MVKShaderStage stage, MVKMTLBufferBinding& buffBind) = 0; virtual void bindMetalArgumentBuffer(MVKShaderStage stage, MVKMTLBufferBinding& buffBind) = 0;
@ -518,7 +518,7 @@ public:
const char* pStageName, const char* pStageName,
bool fullImageViewSwizzle, bool fullImageViewSwizzle,
std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&)> bindBuffer, std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&)> bindBuffer,
std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&, const MVKArrayRef<uint32_t>&)> bindImplicitBuffer, std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&, const MVKArrayRef<uint32_t>)> bindImplicitBuffer,
std::function<void(MVKCommandEncoder*, MVKMTLTextureBinding&)> bindTexture, std::function<void(MVKCommandEncoder*, MVKMTLTextureBinding&)> bindTexture,
std::function<void(MVKCommandEncoder*, MVKMTLSamplerStateBinding&)> bindSampler); std::function<void(MVKCommandEncoder*, MVKMTLSamplerStateBinding&)> bindSampler);

View File

@ -580,7 +580,7 @@ void MVKResourcesCommandEncoderState::markDirty() {
} }
// If a swizzle is needed for this stage, iterates all the bindings and logs errors for those that need texture swizzling. // If a swizzle is needed for this stage, iterates all the bindings and logs errors for those that need texture swizzling.
void MVKResourcesCommandEncoderState::assertMissingSwizzles(bool needsSwizzle, const char* stageName, const MVKArrayRef<MVKMTLTextureBinding>& texBindings) { void MVKResourcesCommandEncoderState::assertMissingSwizzles(bool needsSwizzle, const char* stageName, const MVKArrayRef<MVKMTLTextureBinding> texBindings) {
if (needsSwizzle) { if (needsSwizzle) {
for (auto& tb : texBindings) { for (auto& tb : texBindings) {
VkComponentMapping vkcm = mvkUnpackSwizzle(tb.swizzle); VkComponentMapping vkcm = mvkUnpackSwizzle(tb.swizzle);
@ -670,7 +670,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeBindings(MVKShaderStage stag
const char* pStageName, const char* pStageName,
bool fullImageViewSwizzle, bool fullImageViewSwizzle,
std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&)> bindBuffer, std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&)> bindBuffer,
std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&, const MVKArrayRef<uint32_t>&)> bindImplicitBuffer, std::function<void(MVKCommandEncoder*, MVKMTLBufferBinding&, const MVKArrayRef<uint32_t>)> bindImplicitBuffer,
std::function<void(MVKCommandEncoder*, MVKMTLTextureBinding&)> bindTexture, std::function<void(MVKCommandEncoder*, MVKMTLTextureBinding&)> bindTexture,
std::function<void(MVKCommandEncoder*, MVKMTLSamplerStateBinding&)> bindSampler) { std::function<void(MVKCommandEncoder*, MVKMTLSamplerStateBinding&)> bindSampler) {
@ -767,7 +767,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeImpl(uint32_t stage) {
offset: b.offset offset: b.offset
atIndex: b.index]; atIndex: b.index];
}, },
[](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t>& s)->void { [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t> s)->void {
cmdEncoder->setComputeBytes(cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationVertexTessCtl), cmdEncoder->setComputeBytes(cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationVertexTessCtl),
s.data, s.data,
s.size * sizeof(uint32_t), s.size * sizeof(uint32_t),
@ -806,7 +806,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeImpl(uint32_t stage) {
} }
} }
}, },
[](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t>& s)->void { [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t> s)->void {
cmdEncoder->setVertexBytes(cmdEncoder->_mtlRenderEncoder, cmdEncoder->setVertexBytes(cmdEncoder->_mtlRenderEncoder,
s.data, s.data,
s.size * sizeof(uint32_t), s.size * sizeof(uint32_t),
@ -836,7 +836,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeImpl(uint32_t stage) {
offset: b.offset offset: b.offset
atIndex: b.index]; atIndex: b.index];
}, },
[](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t>& s)->void { [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t> s)->void {
cmdEncoder->setComputeBytes(cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationVertexTessCtl), cmdEncoder->setComputeBytes(cmdEncoder->getMTLComputeEncoder(kMVKCommandUseTessellationVertexTessCtl),
s.data, s.data,
s.size * sizeof(uint32_t), s.size * sizeof(uint32_t),
@ -866,7 +866,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeImpl(uint32_t stage) {
offset: b.offset offset: b.offset
atIndex: b.index]; atIndex: b.index];
}, },
[](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t>& s)->void { [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t> s)->void {
cmdEncoder->setVertexBytes(cmdEncoder->_mtlRenderEncoder, cmdEncoder->setVertexBytes(cmdEncoder->_mtlRenderEncoder,
s.data, s.data,
s.size * sizeof(uint32_t), s.size * sizeof(uint32_t),
@ -896,7 +896,7 @@ void MVKGraphicsResourcesCommandEncoderState::encodeImpl(uint32_t stage) {
offset: b.offset offset: b.offset
atIndex: b.index]; atIndex: b.index];
}, },
[](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t>& s)->void { [](MVKCommandEncoder* cmdEncoder, MVKMTLBufferBinding& b, const MVKArrayRef<uint32_t> s)->void {
cmdEncoder->setFragmentBytes(cmdEncoder->_mtlRenderEncoder, cmdEncoder->setFragmentBytes(cmdEncoder->_mtlRenderEncoder,
s.data, s.data,
s.size * sizeof(uint32_t), s.size * sizeof(uint32_t),

View File

@ -56,7 +56,7 @@ public:
virtual void endQuery(uint32_t query, MVKCommandEncoder* cmdEncoder); virtual void endQuery(uint32_t query, MVKCommandEncoder* cmdEncoder);
/** Finishes the specified queries and marks them as available. */ /** Finishes the specified queries and marks them as available. */
virtual void finishQueries(const MVKArrayRef<uint32_t>& queries); virtual void finishQueries(const MVKArrayRef<uint32_t> queries);
/** Resets the results and availability status of the specified queries. */ /** Resets the results and availability status of the specified queries. */
virtual void resetResults(uint32_t firstQuery, uint32_t queryCount, MVKCommandEncoder* cmdEncoder); virtual void resetResults(uint32_t firstQuery, uint32_t queryCount, MVKCommandEncoder* cmdEncoder);
@ -209,7 +209,7 @@ class MVKTimestampQueryPool : public MVKGPUCounterQueryPool {
public: public:
void endQuery(uint32_t query, MVKCommandEncoder* cmdEncoder) override; void endQuery(uint32_t query, MVKCommandEncoder* cmdEncoder) override;
void finishQueries(const MVKArrayRef<uint32_t>& queries) override; void finishQueries(const MVKArrayRef<uint32_t> queries) override;
#pragma mark Construction #pragma mark Construction

View File

@ -52,7 +52,7 @@ void MVKQueryPool::endQuery(uint32_t query, MVKCommandEncoder* cmdEncoder) {
} }
// Mark queries as available // Mark queries as available
void MVKQueryPool::finishQueries(const MVKArrayRef<uint32_t>& queries) { void MVKQueryPool::finishQueries(const MVKArrayRef<uint32_t> queries) {
lock_guard<mutex> lock(_availabilityLock); lock_guard<mutex> lock(_availabilityLock);
for (uint32_t qry : queries) { for (uint32_t qry : queries) {
if (_availability[qry] == DeviceAvailable) { if (_availability[qry] == DeviceAvailable) {
@ -367,7 +367,7 @@ void MVKTimestampQueryPool::endQuery(uint32_t query, MVKCommandEncoder* cmdEncod
} }
// If not using MTLCounterSampleBuffer, update timestamp values, then mark queries as available // If not using MTLCounterSampleBuffer, update timestamp values, then mark queries as available
void MVKTimestampQueryPool::finishQueries(const MVKArrayRef<uint32_t>& queries) { void MVKTimestampQueryPool::finishQueries(const MVKArrayRef<uint32_t> queries) {
if ( !_mtlCounterBuffer ) { if ( !_mtlCounterBuffer ) {
uint64_t ts = mvkGetTimestamp(); uint64_t ts = mvkGetTimestamp();
for (uint32_t qry : queries) { _timestamps[qry] = ts; } for (uint32_t qry : queries) { _timestamps[qry] = ts; }

View File

@ -103,8 +103,8 @@ public:
uint32_t passIdx, uint32_t passIdx,
VkExtent2D framebufferExtent, VkExtent2D framebufferExtent,
uint32_t framebufferLayerCount, uint32_t framebufferLayerCount,
const MVKArrayRef<MVKImageView*>& attachments, const MVKArrayRef<MVKImageView*> attachments,
const MVKArrayRef<VkClearValue>& clearValues, const MVKArrayRef<VkClearValue> clearValues,
bool isRenderingEntireAttachment, bool isRenderingEntireAttachment,
bool loadOverride = false); bool loadOverride = false);
@ -113,7 +113,7 @@ public:
* when the render area is smaller than the full framebuffer size. * when the render area is smaller than the full framebuffer size.
*/ */
void populateClearAttachments(MVKClearAttachments& clearAtts, void populateClearAttachments(MVKClearAttachments& clearAtts,
const MVKArrayRef<VkClearValue>& clearValues); const MVKArrayRef<VkClearValue> clearValues);
/** /**
* Populates the specified vector with VkClearRects for clearing views of a specified multiview * Populates the specified vector with VkClearRects for clearing views of a specified multiview
@ -127,11 +127,11 @@ public:
/** If a render encoder is active, sets the store actions for all attachments to it. */ /** If a render encoder is active, sets the store actions for all attachments to it. */
void encodeStoreActions(MVKCommandEncoder* cmdEncoder, void encodeStoreActions(MVKCommandEncoder* cmdEncoder,
bool isRenderingEntireAttachment, bool isRenderingEntireAttachment,
const MVKArrayRef<MVKImageView*>& attachments, const MVKArrayRef<MVKImageView*> attachments,
bool storeOverride = false); bool storeOverride = false);
/** Resolves any resolve attachments that cannot be handled by native Metal subpass resolve behavior. */ /** Resolves any resolve attachments that cannot be handled by native Metal subpass resolve behavior. */
void resolveUnresolvableAttachments(MVKCommandEncoder* cmdEncoder, const MVKArrayRef<MVKImageView*>& attachments); void resolveUnresolvableAttachments(MVKCommandEncoder* cmdEncoder, const MVKArrayRef<MVKImageView*> attachments);
MVKRenderSubpass(MVKRenderPass* renderPass, const VkSubpassDescription* pCreateInfo, MVKRenderSubpass(MVKRenderPass* renderPass, const VkSubpassDescription* pCreateInfo,
const VkRenderPassInputAttachmentAspectCreateInfo* pInputAspects, const VkRenderPassInputAttachmentAspectCreateInfo* pInputAspects,

View File

@ -185,8 +185,8 @@ void MVKRenderSubpass::populateMTLRenderPassDescriptor(MTLRenderPassDescriptor*
uint32_t passIdx, uint32_t passIdx,
VkExtent2D framebufferExtent, VkExtent2D framebufferExtent,
uint32_t framebufferLayerCount, uint32_t framebufferLayerCount,
const MVKArrayRef<MVKImageView*>& attachments, const MVKArrayRef<MVKImageView*> attachments,
const MVKArrayRef<VkClearValue>& clearValues, const MVKArrayRef<VkClearValue> clearValues,
bool isRenderingEntireAttachment, bool isRenderingEntireAttachment,
bool loadOverride) { bool loadOverride) {
MVKPixelFormats* pixFmts = _renderPass->getPixelFormats(); MVKPixelFormats* pixFmts = _renderPass->getPixelFormats();
@ -381,7 +381,7 @@ void MVKRenderSubpass::populateMTLRenderPassDescriptor(MTLRenderPassDescriptor*
void MVKRenderSubpass::encodeStoreActions(MVKCommandEncoder* cmdEncoder, void MVKRenderSubpass::encodeStoreActions(MVKCommandEncoder* cmdEncoder,
bool isRenderingEntireAttachment, bool isRenderingEntireAttachment,
const MVKArrayRef<MVKImageView*>& attachments, const MVKArrayRef<MVKImageView*> attachments,
bool storeOverride) { bool storeOverride) {
if (!cmdEncoder->_mtlRenderEncoder) { return; } if (!cmdEncoder->_mtlRenderEncoder) { return; }
if (!_renderPass->getDevice()->_pMetalFeatures->deferredStoreActions) { return; } if (!_renderPass->getDevice()->_pMetalFeatures->deferredStoreActions) { return; }
@ -417,7 +417,7 @@ void MVKRenderSubpass::encodeStoreActions(MVKCommandEncoder* cmdEncoder,
} }
void MVKRenderSubpass::populateClearAttachments(MVKClearAttachments& clearAtts, void MVKRenderSubpass::populateClearAttachments(MVKClearAttachments& clearAtts,
const MVKArrayRef<VkClearValue>& clearValues) { const MVKArrayRef<VkClearValue> clearValues) {
VkClearAttachment cAtt; VkClearAttachment cAtt;
uint32_t attIdx; uint32_t attIdx;
@ -498,7 +498,7 @@ MVKMTLFmtCaps MVKRenderSubpass::getRequiredFormatCapabilitiesForAttachmentAt(uin
return caps; return caps;
} }
void MVKRenderSubpass::resolveUnresolvableAttachments(MVKCommandEncoder* cmdEncoder, const MVKArrayRef<MVKImageView*>& attachments) { void MVKRenderSubpass::resolveUnresolvableAttachments(MVKCommandEncoder* cmdEncoder, const MVKArrayRef<MVKImageView*> attachments) {
MVKPixelFormats* pixFmts = cmdEncoder->getPixelFormats(); MVKPixelFormats* pixFmts = cmdEncoder->getPixelFormats();
size_t raCnt = _resolveAttachments.size(); size_t raCnt = _resolveAttachments.size();
for (uint32_t raIdx = 0; raIdx < raCnt; raIdx++) { for (uint32_t raIdx = 0; raIdx < raCnt; raIdx++) {

View File

@ -99,7 +99,7 @@ export METAL_ERROR_MODE=3
export METAL_DEBUG_ERROR_MODE=3 export METAL_DEBUG_ERROR_MODE=3
# ----- MoltenVK config settings ------ # ----- MoltenVK config settings ------
export MVK_CONFIG_LOG_LEVEL=0 export MVK_CONFIG_LOG_LEVEL=1
export MVK_DEBUG=0 export MVK_DEBUG=0
# Additional MoltenVK configuration can be set here by # Additional MoltenVK configuration can be set here by