diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 41b046bbeaa..b0d8783e7d0 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -193,48 +193,22 @@ create_bci(struct zink_screen *screen, const struct pipe_resource *templ, unsign VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - if (templ->usage != PIPE_USAGE_STAGING) + VkFormatProperties props = screen->format_props[templ->format]; + + bci.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | + VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT | + VK_BUFFER_USAGE_INDEX_BUFFER_BIT | + VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | + VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT | + VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT; + if (props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) + bci.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + if (props.bufferFeatures & VK_FORMAT_FEATURE_UNIFORM_TEXEL_BUFFER_BIT) bci.usage |= VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT; - /* apparently gallium thinks these are the jack-of-all-trades bind types */ - if (bind & (PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_QUERY_BUFFER)) { - 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; - } - - if (bind & PIPE_BIND_VERTEX_BUFFER) - bci.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | - VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | - VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; - - if (bind & PIPE_BIND_INDEX_BUFFER) - bci.usage |= VK_BUFFER_USAGE_INDEX_BUFFER_BIT; - - if (bind & PIPE_BIND_CONSTANT_BUFFER) - bci.usage |= VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT; - - if (bind & PIPE_BIND_SHADER_BUFFER) - bci.usage |= VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - - if (bind & PIPE_BIND_SHADER_IMAGE) + if (bind & PIPE_BIND_SHADER_IMAGE) { + assert(props.bufferFeatures & VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_BIT); bci.usage |= VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT; - - if (bind & PIPE_BIND_COMMAND_ARGS_BUFFER) - bci.usage |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; - - if (bind == (PIPE_BIND_STREAM_OUTPUT | PIPE_BIND_CUSTOM)) { - bci.usage |= VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT; - } else if (bind & PIPE_BIND_STREAM_OUTPUT) { - bci.usage |= VK_BUFFER_USAGE_VERTEX_BUFFER_BIT | - VK_BUFFER_USAGE_INDEX_BUFFER_BIT | - VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | - VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT; } return bci; }