diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 30a93a0a93d..8ce09755c30 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -120,8 +120,21 @@ resource_create(struct pipe_screen *pscreen, bci.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT; - if (templ->bind & PIPE_BIND_SAMPLER_VIEW) - bci.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; + /* apparently gallium thinks this is the jack-of-all-trades bind type */ + if (templ->bind & PIPE_BIND_SAMPLER_VIEW) { + bci.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | + VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | + VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | + VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; + VkFormatProperties props; + vkGetPhysicalDeviceFormatProperties(screen->pdev, zink_get_format(screen, templ->format), &props); + if (props.bufferFeatures & VK_BUFFER_USAGE_STORAGE_BUFFER_BIT) + bci.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; + if (props.bufferFeatures & VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) + bci.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; + } if (templ->bind & PIPE_BIND_VERTEX_BUFFER) bci.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT |