Merge pull request #1898 from etang-cw/PushBindPoint

Respect the bind point supplied to vkCmdBindDescriptorSets / vkCmdPushDescriptorSets
This commit is contained in:
Bill Hollings 2023-05-12 14:42:26 -04:00 committed by GitHub
commit 734a185170
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 64 additions and 87 deletions

View File

@ -393,7 +393,7 @@ VkResult MVKCmdPushDescriptorSet::setContent(MVKCommandBuffer* cmdBuff,
} }
void MVKCmdPushDescriptorSet::encode(MVKCommandEncoder* cmdEncoder) { void MVKCmdPushDescriptorSet::encode(MVKCommandEncoder* cmdEncoder) {
_pipelineLayout->pushDescriptorSet(cmdEncoder, _descriptorWrites.contents(), _set); _pipelineLayout->pushDescriptorSet(cmdEncoder, _pipelineBindPoint, _descriptorWrites.contents(), _set);
} }
MVKCmdPushDescriptorSet::~MVKCmdPushDescriptorSet() { MVKCmdPushDescriptorSet::~MVKCmdPushDescriptorSet() {

View File

@ -120,6 +120,7 @@ public:
/** Encodes the descriptors in the descriptor set that are specified by this layout, */ /** Encodes the descriptors in the descriptor set that are specified by this layout, */
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKArrayRef<uint32_t> dynamicOffsets, MVKArrayRef<uint32_t> dynamicOffsets,
@ -127,6 +128,7 @@ public:
/** Encodes this binding layout and the specified descriptor on the specified command encoder immediately. */ /** Encodes this binding layout and the specified descriptor on the specified command encoder immediately. */
void push(MVKCommandEncoder* cmdEncoder, void push(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
uint32_t& dstArrayElement, uint32_t& dstArrayElement,
uint32_t& descriptorCount, uint32_t& descriptorCount,
uint32_t& descriptorsPushed, uint32_t& descriptorsPushed,
@ -207,6 +209,7 @@ public:
/** Encodes this descriptor (based on its layout binding index) on the the command encoder. */ /** Encodes this descriptor (based on its layout binding index) on the the command encoder. */
virtual void bind(MVKCommandEncoder* cmdEncoder, virtual void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -273,6 +276,7 @@ class MVKBufferDescriptor : public MVKDescriptor {
public: public:
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -362,6 +366,7 @@ public:
VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT; } VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT; }
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -411,6 +416,7 @@ class MVKImageDescriptor : public MVKDescriptor {
public: public:
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -491,6 +497,7 @@ class MVKSamplerDescriptorMixin {
protected: protected:
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -538,6 +545,7 @@ public:
VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_SAMPLER; } VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_SAMPLER; }
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -585,6 +593,7 @@ public:
VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; } VkDescriptorType getDescriptorType() override { return VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; }
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -630,6 +639,7 @@ class MVKTexelBufferDescriptor : public MVKDescriptor {
public: public:
void bind(MVKCommandEncoder* cmdEncoder, void bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],

View File

@ -20,6 +20,16 @@
#include "MVKDescriptorSet.h" #include "MVKDescriptorSet.h"
#include "MVKBuffer.h" #include "MVKBuffer.h"
#define BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bind, pipelineBindPoint, stage, ...) \
do { \
if ((stage) == kMVKShaderStageCompute) { \
if ((cmdEncoder) && (pipelineBindPoint) == VK_PIPELINE_BIND_POINT_COMPUTE) \
(cmdEncoder)->_computeResourcesState.bind(__VA_ARGS__); \
} else { \
if ((cmdEncoder) && (pipelineBindPoint) == VK_PIPELINE_BIND_POINT_GRAPHICS) \
(cmdEncoder)->_graphicsResourcesState.bind(static_cast<MVKShaderStage>(stage), __VA_ARGS__); \
} \
} while (0)
#pragma mark MVKShaderStageResourceBinding #pragma mark MVKShaderStageResourceBinding
@ -195,6 +205,7 @@ uint32_t MVKDescriptorSetLayoutBinding::getDescriptorCount(MVKDescriptorSet* des
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder, void MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSet* descSet, MVKDescriptorSet* descSet,
MVKShaderResourceBinding& dslMTLRezIdxOffsets, MVKShaderResourceBinding& dslMTLRezIdxOffsets,
MVKArrayRef<uint32_t> dynamicOffsets, MVKArrayRef<uint32_t> dynamicOffsets,
@ -208,7 +219,7 @@ void MVKDescriptorSetLayoutBinding::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t descIdx = 0; descIdx < descCnt; descIdx++) { for (uint32_t descIdx = 0; descIdx < descCnt; descIdx++) {
MVKDescriptor* mvkDesc = descSet->getDescriptor(getBinding(), descIdx); MVKDescriptor* mvkDesc = descSet->getDescriptor(getBinding(), descIdx);
if (mvkDesc->getDescriptorType() == descType) { if (mvkDesc->getDescriptorType() == descType) {
mvkDesc->bind(cmdEncoder, this, descIdx, _applyToStage, mtlIdxs, dynamicOffsets, dynamicOffsetIndex); mvkDesc->bind(cmdEncoder, pipelineBindPoint, this, descIdx, _applyToStage, mtlIdxs, dynamicOffsets, dynamicOffsetIndex);
} }
} }
} }
@ -220,6 +231,7 @@ static const T& get(const void* pData, size_t stride, uint32_t index) {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder, void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
uint32_t& dstArrayElement, uint32_t& dstArrayElement,
uint32_t& descriptorCount, uint32_t& descriptorCount,
uint32_t& descriptorsPushed, uint32_t& descriptorsPushed,
@ -271,11 +283,7 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (_applyToStage[i]) { if (_applyToStage[i]) {
bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx; bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
break; break;
@ -289,11 +297,7 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (_applyToStage[i]) { if (_applyToStage[i]) {
bb.index = mtlIdxs.stages[i].bufferIndex; bb.index = mtlIdxs.stages[i].bufferIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
break; break;
@ -318,18 +322,10 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (_applyToStage[i]) { if (_applyToStage[i]) {
tb.index = mtlIdxs.stages[i].textureIndex + rezIdx + planeIndex; tb.index = mtlIdxs.stages[i].textureIndex + rezIdx + planeIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindTexture, pipelineBindPoint, i, tb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindTexture(tb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindTexture(MVKShaderStage(i), tb); }
}
if (_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) { if (_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx; bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }
@ -351,18 +347,10 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (_applyToStage[i]) { if (_applyToStage[i]) {
tb.index = mtlIdxs.stages[i].textureIndex + rezIdx; tb.index = mtlIdxs.stages[i].textureIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindTexture, pipelineBindPoint, i, tb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindTexture(tb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindTexture(MVKShaderStage(i), tb); }
}
if (_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) { if (_info.descriptorType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx; bb.index = mtlIdxs.stages[i].bufferIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }
@ -381,11 +369,7 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (_applyToStage[i]) { if (_applyToStage[i]) {
sb.index = mtlIdxs.stages[i].samplerIndex + rezIdx; sb.index = mtlIdxs.stages[i].samplerIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindSamplerState, pipelineBindPoint, i, sb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindSamplerState(sb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindSamplerState(MVKShaderStage(i), sb); }
}
} }
} }
break; break;
@ -410,13 +394,8 @@ void MVKDescriptorSetLayoutBinding::push(MVKCommandEncoder* cmdEncoder,
if (_applyToStage[i]) { if (_applyToStage[i]) {
tb.index = mtlIdxs.stages[i].textureIndex + rezIdx + planeIndex; tb.index = mtlIdxs.stages[i].textureIndex + rezIdx + planeIndex;
sb.index = mtlIdxs.stages[i].samplerIndex + rezIdx; sb.index = mtlIdxs.stages[i].samplerIndex + rezIdx;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindTexture, pipelineBindPoint, i, tb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindTexture(tb); } BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindSamplerState, pipelineBindPoint, i, sb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindSamplerState(sb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindTexture(MVKShaderStage(i), tb); }
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindSamplerState(MVKShaderStage(i), sb); }
}
} }
} }
} }
@ -742,6 +721,7 @@ MTLResourceUsage MVKDescriptor::getMTLResourceUsage() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -762,11 +742,7 @@ void MVKBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (stages[i]) { if (stages[i]) {
bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex; bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }
@ -834,6 +810,7 @@ void MVKBufferDescriptor::reset() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKInlineUniformBlockDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKInlineUniformBlockDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -850,11 +827,7 @@ void MVKInlineUniformBlockDescriptor::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (stages[i]) { if (stages[i]) {
bb.index = mtlIndexes.stages[i].bufferIndex; bb.index = mtlIndexes.stages[i].bufferIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }
@ -923,6 +896,7 @@ void MVKInlineUniformBlockDescriptor::reset() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKImageDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKImageDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -952,18 +926,10 @@ void MVKImageDescriptor::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (stages[i]) { if (stages[i]) {
tb.index = mtlIndexes.stages[i].textureIndex + elementIndex + planeIndex; tb.index = mtlIndexes.stages[i].textureIndex + elementIndex + planeIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindTexture, pipelineBindPoint, i, tb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindTexture(tb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindTexture(MVKShaderStage(i), tb); }
}
if (descType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) { if (descType == VK_DESCRIPTOR_TYPE_STORAGE_IMAGE) {
bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex + planeIndex; bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex + planeIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }
@ -1048,6 +1014,7 @@ void MVKImageDescriptor::reset() {
// Metal validation requires each sampler in an array of samplers to be populated, // Metal validation requires each sampler in an array of samplers to be populated,
// even if not used, so populate a default if one hasn't been set. // even if not used, so populate a default if one hasn't been set.
void MVKSamplerDescriptorMixin::bind(MVKCommandEncoder* cmdEncoder, void MVKSamplerDescriptorMixin::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -1065,11 +1032,7 @@ void MVKSamplerDescriptorMixin::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (stages[i]) { if (stages[i]) {
sb.index = mtlIndexes.stages[i].samplerIndex + elementIndex; sb.index = mtlIndexes.stages[i].samplerIndex + elementIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindSamplerState, pipelineBindPoint, i, sb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindSamplerState(sb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindSamplerState(MVKShaderStage(i), sb); }
}
} }
} }
} }
@ -1136,13 +1099,14 @@ void MVKSamplerDescriptorMixin::reset() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKArrayRef<uint32_t> dynamicOffsets, MVKArrayRef<uint32_t> dynamicOffsets,
uint32_t& dynamicOffsetIndex) { uint32_t& dynamicOffsetIndex) {
MVKSamplerDescriptorMixin::bind(cmdEncoder, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex); MVKSamplerDescriptorMixin::bind(cmdEncoder, pipelineBindPoint, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex);
} }
void MVKSamplerDescriptor::encodeToMetalArgumentBuffer(MVKResourcesCommandEncoderState* rezEncState, void MVKSamplerDescriptor::encodeToMetalArgumentBuffer(MVKResourcesCommandEncoderState* rezEncState,
@ -1185,14 +1149,15 @@ void MVKSamplerDescriptor::reset() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKCombinedImageSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKCombinedImageSamplerDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
MVKShaderResourceBinding& mtlIndexes, MVKShaderResourceBinding& mtlIndexes,
MVKArrayRef<uint32_t> dynamicOffsets, MVKArrayRef<uint32_t> dynamicOffsets,
uint32_t& dynamicOffsetIndex) { uint32_t& dynamicOffsetIndex) {
MVKImageDescriptor::bind(cmdEncoder, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex); MVKImageDescriptor::bind(cmdEncoder, pipelineBindPoint, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex);
MVKSamplerDescriptorMixin::bind(cmdEncoder, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex); MVKSamplerDescriptorMixin::bind(cmdEncoder, pipelineBindPoint, mvkDSLBind, elementIndex, stages, mtlIndexes, dynamicOffsets, dynamicOffsetIndex);
} }
void MVKCombinedImageSamplerDescriptor::encodeToMetalArgumentBuffer(MVKResourcesCommandEncoderState* rezEncState, void MVKCombinedImageSamplerDescriptor::encodeToMetalArgumentBuffer(MVKResourcesCommandEncoderState* rezEncState,
@ -1238,6 +1203,7 @@ void MVKCombinedImageSamplerDescriptor::reset() {
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKTexelBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder, void MVKTexelBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKDescriptorSetLayoutBinding* mvkDSLBind, MVKDescriptorSetLayoutBinding* mvkDSLBind,
uint32_t elementIndex, uint32_t elementIndex,
bool stages[], bool stages[],
@ -1259,18 +1225,10 @@ void MVKTexelBufferDescriptor::bind(MVKCommandEncoder* cmdEncoder,
for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) { for (uint32_t i = kMVKShaderStageVertex; i < kMVKShaderStageCount; i++) {
if (stages[i]) { if (stages[i]) {
tb.index = mtlIndexes.stages[i].textureIndex + elementIndex; tb.index = mtlIndexes.stages[i].textureIndex + elementIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindTexture, pipelineBindPoint, i, tb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindTexture(tb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindTexture(MVKShaderStage(i), tb); }
}
if (descType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) { if (descType == VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER) {
bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex; bb.index = mtlIndexes.stages[i].bufferIndex + elementIndex;
if (i == kMVKShaderStageCompute) { BIND_GRAPHICS_OR_COMPUTE(cmdEncoder, bindBuffer, pipelineBindPoint, i, bb);
if (cmdEncoder) { cmdEncoder->_computeResourcesState.bindBuffer(bb); }
} else {
if (cmdEncoder) { cmdEncoder->_graphicsResourcesState.bindBuffer(MVKShaderStage(i), bb); }
}
} }
} }
} }

View File

@ -81,6 +81,7 @@ public:
/** Encodes this descriptor set layout and the specified descriptor updates on the specified command encoder immediately. */ /** Encodes this descriptor set layout and the specified descriptor updates on the specified command encoder immediately. */
void pushDescriptorSet(MVKCommandEncoder* cmdEncoder, void pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKArrayRef<VkWriteDescriptorSet> descriptorWrites, MVKArrayRef<VkWriteDescriptorSet> descriptorWrites,
MVKShaderResourceBinding& dslMTLRezIdxOffsets); MVKShaderResourceBinding& dslMTLRezIdxOffsets);
@ -338,6 +339,9 @@ public:
/** Get the type of this template. */ /** Get the type of this template. */
VkDescriptorUpdateTemplateType getType() const; VkDescriptorUpdateTemplateType getType() const;
/** Get the bind point of this template */
VkPipelineBindPoint getBindPoint() const { return _pipelineBindPoint; }
/** Constructs an instance for the specified device. */ /** Constructs an instance for the specified device. */
MVKDescriptorUpdateTemplate(MVKDevice* device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo); MVKDescriptorUpdateTemplate(MVKDevice* device, const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo);
@ -347,6 +351,7 @@ public:
protected: protected:
void propagateDebugName() override {} void propagateDebugName() override {}
VkPipelineBindPoint _pipelineBindPoint;
VkDescriptorUpdateTemplateType _type; VkDescriptorUpdateTemplateType _type;
MVKSmallVector<VkDescriptorUpdateTemplateEntry, 1> _entries; MVKSmallVector<VkDescriptorUpdateTemplateEntry, 1> _entries;
}; };

View File

@ -43,7 +43,7 @@ void MVKDescriptorSetLayout::bindDescriptorSet(MVKCommandEncoder* cmdEncoder,
dynamicOffsets, dynamicOffsetIndex); } dynamicOffsets, dynamicOffsetIndex); }
if ( !isUsingMetalArgumentBuffers() ) { if ( !isUsingMetalArgumentBuffers() ) {
for (auto& dslBind : _bindings) { for (auto& dslBind : _bindings) {
dslBind.bind(cmdEncoder, descSet, dslMTLRezIdxOffsets, dynamicOffsets, dynamicOffsetIndex); dslBind.bind(cmdEncoder, pipelineBindPoint, descSet, dslMTLRezIdxOffsets, dynamicOffsets, dynamicOffsetIndex);
} }
} }
} }
@ -91,6 +91,7 @@ static const void* getWriteParameters(VkDescriptorType type, const VkDescriptorI
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKDescriptorSetLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder, void MVKDescriptorSetLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKArrayRef<VkWriteDescriptorSet> descriptorWrites, MVKArrayRef<VkWriteDescriptorSet> descriptorWrites,
MVKShaderResourceBinding& dslMTLRezIdxOffsets) { MVKShaderResourceBinding& dslMTLRezIdxOffsets) {
@ -127,7 +128,7 @@ void MVKDescriptorSetLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
pBufferInfo, pTexelBufferView, pInlineUniformBlock, stride); pBufferInfo, pTexelBufferView, pInlineUniformBlock, stride);
uint32_t descriptorsPushed = 0; uint32_t descriptorsPushed = 0;
uint32_t bindIdx = _bindingToIndex[dstBinding]; uint32_t bindIdx = _bindingToIndex[dstBinding];
_bindings[bindIdx].push(cmdEncoder, dstArrayElement, descriptorCount, _bindings[bindIdx].push(cmdEncoder, pipelineBindPoint, dstArrayElement, descriptorCount,
descriptorsPushed, descWrite.descriptorType, descriptorsPushed, descWrite.descriptorType,
stride, pData, dslMTLRezIdxOffsets); stride, pData, dslMTLRezIdxOffsets);
pBufferInfo += descriptorsPushed; pBufferInfo += descriptorsPushed;
@ -148,6 +149,7 @@ void MVKDescriptorSetLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
return; return;
if (!cmdEncoder) { clearConfigurationResult(); } if (!cmdEncoder) { clearConfigurationResult(); }
VkPipelineBindPoint bindPoint = descUpdateTemplate->getBindPoint();
for (uint32_t i = 0; i < descUpdateTemplate->getNumberOfEntries(); i++) { for (uint32_t i = 0; i < descUpdateTemplate->getNumberOfEntries(); i++) {
const VkDescriptorUpdateTemplateEntry* pEntry = descUpdateTemplate->getEntry(i); const VkDescriptorUpdateTemplateEntry* pEntry = descUpdateTemplate->getEntry(i);
uint32_t dstBinding = pEntry->dstBinding; uint32_t dstBinding = pEntry->dstBinding;
@ -161,7 +163,7 @@ void MVKDescriptorSetLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
if (!_bindingToIndex.count(dstBinding)) continue; if (!_bindingToIndex.count(dstBinding)) continue;
uint32_t descriptorsPushed = 0; uint32_t descriptorsPushed = 0;
uint32_t bindIdx = _bindingToIndex[dstBinding]; uint32_t bindIdx = _bindingToIndex[dstBinding];
_bindings[bindIdx].push(cmdEncoder, dstArrayElement, descriptorCount, _bindings[bindIdx].push(cmdEncoder, bindPoint, dstArrayElement, descriptorCount,
descriptorsPushed, pEntry->descriptorType, descriptorsPushed, pEntry->descriptorType,
pEntry->stride, pCurData, dslMTLRezIdxOffsets); pEntry->stride, pCurData, dslMTLRezIdxOffsets);
pCurData = (const char*)pCurData + pEntry->stride * descriptorsPushed; pCurData = (const char*)pCurData + pEntry->stride * descriptorsPushed;
@ -876,7 +878,7 @@ VkDescriptorUpdateTemplateType MVKDescriptorUpdateTemplate::getType() const {
MVKDescriptorUpdateTemplate::MVKDescriptorUpdateTemplate(MVKDevice* device, MVKDescriptorUpdateTemplate::MVKDescriptorUpdateTemplate(MVKDevice* device,
const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo) : const VkDescriptorUpdateTemplateCreateInfo* pCreateInfo) :
MVKVulkanAPIDeviceObject(device), _type(pCreateInfo->templateType) { MVKVulkanAPIDeviceObject(device), _type(pCreateInfo->templateType), _pipelineBindPoint(pCreateInfo->pipelineBindPoint) {
for (uint32_t i = 0; i < pCreateInfo->descriptorUpdateEntryCount; i++) for (uint32_t i = 0; i < pCreateInfo->descriptorUpdateEntryCount; i++)
_entries.push_back(pCreateInfo->pDescriptorUpdateEntries[i]); _entries.push_back(pCreateInfo->pDescriptorUpdateEntries[i]);

View File

@ -63,6 +63,7 @@ public:
/** Updates a descriptor set in a command encoder. */ /** Updates a descriptor set in a command encoder. */
void pushDescriptorSet(MVKCommandEncoder* cmdEncoder, void pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKArrayRef<VkWriteDescriptorSet> descriptorWrites, MVKArrayRef<VkWriteDescriptorSet> descriptorWrites,
uint32_t set); uint32_t set);

View File

@ -64,11 +64,12 @@ void MVKPipelineLayout::bindDescriptorSets(MVKCommandEncoder* cmdEncoder,
// A null cmdEncoder can be passed to perform a validation pass // A null cmdEncoder can be passed to perform a validation pass
void MVKPipelineLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder, void MVKPipelineLayout::pushDescriptorSet(MVKCommandEncoder* cmdEncoder,
VkPipelineBindPoint pipelineBindPoint,
MVKArrayRef<VkWriteDescriptorSet> descriptorWrites, MVKArrayRef<VkWriteDescriptorSet> descriptorWrites,
uint32_t set) { uint32_t set) {
if (!cmdEncoder) { clearConfigurationResult(); } if (!cmdEncoder) { clearConfigurationResult(); }
MVKDescriptorSetLayout* dsl = _descriptorSetLayouts[set]; MVKDescriptorSetLayout* dsl = _descriptorSetLayouts[set];
dsl->pushDescriptorSet(cmdEncoder, descriptorWrites, _dslMTLResourceIndexOffsets[set]); dsl->pushDescriptorSet(cmdEncoder, pipelineBindPoint, descriptorWrites, _dslMTLResourceIndexOffsets[set]);
if (!cmdEncoder) { setConfigurationResult(dsl->getConfigurationResult()); } if (!cmdEncoder) { setConfigurationResult(dsl->getConfigurationResult()); }
} }