Set options properly on a buffer view's MTLTextureDescriptor.

The resource options must match between an `MTLBuffer` and any linear
texture created from it. Further, to be writable, the
`MTLTextureDescriptor` should have the `MTLTextureUsageShaderWrite` bit
set.

Fixes #542.
This commit is contained in:
Chip Davis 2019-03-27 11:53:23 -05:00
parent fbc66c1ea3
commit 354dc32fb9
2 changed files with 12 additions and 1 deletions

View File

@ -56,6 +56,9 @@ public:
MVKCommandEncoder* cmdEncoder,
MVKCommandUse cmdUse);
/** Returns the intended usage of this buffer. */
VkBufferUsageFlags getUsage() const { return _usage; }
#pragma mark Metal
@ -78,6 +81,8 @@ protected:
bool needsHostReadSync(VkPipelineStageFlags srcStageMask,
VkPipelineStageFlags dstStageMask,
VkBufferMemoryBarrier* pBufferMemoryBarrier);
VkBufferUsageFlags _usage;
};

View File

@ -116,7 +116,7 @@ bool MVKBuffer::needsHostReadSync(VkPipelineStageFlags srcStageMask,
#pragma mark Construction
MVKBuffer::MVKBuffer(MVKDevice* device, const VkBufferCreateInfo* pCreateInfo) : MVKResource(device) {
MVKBuffer::MVKBuffer(MVKDevice* device, const VkBufferCreateInfo* pCreateInfo) : MVKResource(device), _usage(pCreateInfo->usage) {
_byteAlignment = _device->_pMetalFeatures->mtlBufferAlignment;
_byteCount = pCreateInfo->size;
}
@ -142,6 +142,12 @@ id<MTLTexture> MVKBufferView::getMTLTexture() {
width: _textureSize.width
height: _textureSize.height
mipmapped: NO];
mtlTexDesc.storageMode = _buffer->getMTLBuffer().storageMode;
mtlTexDesc.cpuCacheMode = _buffer->getMTLBuffer().cpuCacheMode;
mtlTexDesc.usage = MTLTextureUsageShaderRead;
if ( mvkIsAnyFlagEnabled(_buffer->getUsage(), VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) ) {
mtlTexDesc.usage |= MTLTextureUsageShaderWrite;
}
_mtlTexture = [_buffer->getMTLBuffer() newTextureWithDescriptor: mtlTexDesc
offset: _mtlBufferOffset
bytesPerRow: _mtlBytesPerRow];