From 22171d16f8b993547da59b5279fcf17319d97423 Mon Sep 17 00:00:00 2001 From: Faith Ekstrand Date: Wed, 24 Apr 2024 09:07:20 -0500 Subject: [PATCH] mesa: Use the new spirv_capabilities struct MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also, re-organize a bit to match the spec better. There are now capabilities which need to be set to constant true which we didn't have to se in the old caps struct and this makes it all more obvious. Reviewed-by: Alyssa Rosenzweig Reviewed-by: Iván Briano Acked-By: Mike Blumenkrantz Part-of: --- src/compiler/spirv/gl_spirv.c | 6 +- src/mesa/main/glspirv.c | 5 +- src/mesa/main/spirv_capabilities.c | 95 ++++++++++++++++++++---------- src/mesa/main/spirv_capabilities.h | 4 +- 4 files changed, 74 insertions(+), 36 deletions(-) diff --git a/src/compiler/spirv/gl_spirv.c b/src/compiler/spirv/gl_spirv.c index 065a4f2d1b1..99a4fb8e06d 100644 --- a/src/compiler/spirv/gl_spirv.c +++ b/src/compiler/spirv/gl_spirv.c @@ -236,7 +236,11 @@ spirv_verify_gl_specialization_constants( * need to print the warnings now, would be done later, on the real * spirv_to_nir */ - const struct spirv_to_nir_options options = { .debug.func = NULL}; + const struct spirv_capabilities spirv_caps = { false, }; + const struct spirv_to_nir_options options = { + .capabilities = &spirv_caps, + .debug.func = NULL, + }; const uint32_t *word_end = words + word_count; struct vtn_builder *b = vtn_create_builder(words, word_count, diff --git a/src/mesa/main/glspirv.c b/src/mesa/main/glspirv.c index 4438a597bf7..ff1aa1258f6 100644 --- a/src/mesa/main/glspirv.c +++ b/src/mesa/main/glspirv.c @@ -29,6 +29,7 @@ #include "compiler/nir/nir.h" #include "compiler/spirv/nir_spirv.h" +#include "compiler/spirv/spirv_info.h" #include "program/program.h" @@ -261,13 +262,13 @@ _mesa_spirv_to_nir(struct gl_context *ctx, spec_entries[i].defined_on_module = false; } - struct spirv_supported_capabilities spirv_caps; + struct spirv_capabilities spirv_caps; _mesa_fill_supported_spirv_capabilities(&spirv_caps, &ctx->Const, &ctx->Extensions); struct spirv_to_nir_options spirv_options = { .environment = NIR_SPIRV_OPENGL, - .caps = spirv_caps, + .capabilities = &spirv_caps, .subgroup_size = SUBGROUP_SIZE_UNIFORM, .ubo_addr_format = nir_address_format_32bit_index_offset, .ssbo_addr_format = nir_address_format_32bit_index_offset, diff --git a/src/mesa/main/spirv_capabilities.c b/src/mesa/main/spirv_capabilities.c index e9625ddefe1..be07b3f8e37 100644 --- a/src/mesa/main/spirv_capabilities.c +++ b/src/mesa/main/spirv_capabilities.c @@ -27,43 +27,76 @@ */ #include "spirv_capabilities.h" -#include "compiler/shader_info.h" +#include "compiler/spirv/spirv_info.h" void -_mesa_fill_supported_spirv_capabilities(struct spirv_supported_capabilities *caps, +_mesa_fill_supported_spirv_capabilities(struct spirv_capabilities *caps, struct gl_constants *consts, const struct gl_extensions *gl_exts) { const struct spirv_supported_extensions *spirv_exts = consts->SpirVExtensions; - *caps = (struct spirv_supported_capabilities) { - .atomic_storage = gl_exts->ARB_shader_atomic_counters, - .demote_to_helper_invocation = gl_exts->EXT_demote_to_helper_invocation, - .draw_parameters = - gl_exts->ARB_shader_draw_parameters && - spirv_exts->supported[SPV_KHR_shader_draw_parameters], - .derivative_group = gl_exts->NV_compute_shader_derivatives, - .float64 = gl_exts->ARB_gpu_shader_fp64, - .geometry_streams = gl_exts->ARB_gpu_shader5, - .image_ms_array = gl_exts->ARB_shader_image_load_store && - consts->MaxImageSamples > 1, - .image_read_without_format = gl_exts->EXT_shader_image_load_formatted, - .image_write_without_format = gl_exts->ARB_shader_image_load_store, - .int64 = gl_exts->ARB_gpu_shader_int64, - .int64_atomics = gl_exts->NV_shader_atomic_int64, - .post_depth_coverage = gl_exts->ARB_post_depth_coverage, - .shader_clock = gl_exts->ARB_shader_clock, - .shader_viewport_index_layer = gl_exts->ARB_shader_viewport_layer_array, - .stencil_export = gl_exts->ARB_shader_stencil_export, - .storage_image_ms = gl_exts->ARB_shader_image_load_store && - consts->MaxImageSamples > 1, - .subgroup_ballot = - gl_exts->ARB_shader_ballot && spirv_exts->supported[SPV_KHR_shader_ballot], - .subgroup_vote = - gl_exts->ARB_shader_group_vote && spirv_exts->supported[SPV_KHR_subgroup_vote], - .tessellation = gl_exts->ARB_tessellation_shader, - .transform_feedback = gl_exts->ARB_transform_feedback3, - .variable_pointers = spirv_exts->supported[SPV_KHR_variable_pointers], - .integer_functions2 = gl_exts->INTEL_shader_integer_functions2, + *caps = (struct spirv_capabilities) { + /* These come from the table in GL_ARB_gl_spirv */ + .Matrix = true, + .Shader = true, + .Geometry = true, + .Tessellation = gl_exts->ARB_tessellation_shader, + .Float64 = gl_exts->ARB_gpu_shader_fp64, + .AtomicStorage = gl_exts->ARB_shader_atomic_counters, + .TessellationPointSize = gl_exts->ARB_tessellation_shader, + .GeometryPointSize = true, + .ImageGatherExtended = gl_exts->ARB_gpu_shader5, + .StorageImageMultisample = gl_exts->ARB_shader_image_load_store && + consts->MaxImageSamples > 1, + .UniformBufferArrayDynamicIndexing = gl_exts->ARB_gpu_shader5, + .SampledImageArrayDynamicIndexing = gl_exts->ARB_gpu_shader5, + .StorageBufferArrayDynamicIndexing = gl_exts->ARB_shader_storage_buffer_object, + .StorageImageArrayDynamicIndexing = gl_exts->ARB_shader_image_load_store, + .ClipDistance = true, + .CullDistance = gl_exts->ARB_cull_distance, + .ImageCubeArray = gl_exts->ARB_texture_cube_map_array, + .SampleRateShading = gl_exts->ARB_sample_shading, + .ImageRect = true, + .SampledRect = true, + .Sampled1D = true, + .Image1D = true, + .SampledCubeArray = gl_exts->ARB_texture_cube_map_array, + .SampledBuffer = true, + .ImageBuffer = true, + .ImageMSArray = true, + .StorageImageExtendedFormats = gl_exts->ARB_shader_image_load_store, + .ImageQuery = true, + .DerivativeControl = gl_exts->ARB_derivative_control, + .InterpolationFunction = gl_exts->ARB_gpu_shader5, + .TransformFeedback = true, + .GeometryStreams = gl_exts->ARB_gpu_shader5, + .StorageImageWriteWithoutFormat = gl_exts->ARB_shader_image_load_store, + .MultiViewport = gl_exts->ARB_viewport_array, + + /* These aren't in the main table for some reason */ + .Int64 = gl_exts->ARB_gpu_shader_int64, + .SparseResidency = gl_exts->ARB_sparse_texture2, + .MinLod = gl_exts->ARB_sparse_texture_clamp, + .StorageImageReadWithoutFormat = gl_exts->EXT_shader_image_load_formatted, + .Int64Atomics = gl_exts->NV_shader_atomic_int64, + + /* These come from their individual extension specs */ + .DemoteToHelperInvocation = gl_exts->EXT_demote_to_helper_invocation, + .DrawParameters = gl_exts->ARB_shader_draw_parameters && + spirv_exts->supported[SPV_KHR_shader_draw_parameters], + .ComputeDerivativeGroupQuadsNV = gl_exts->NV_compute_shader_derivatives, + .ComputeDerivativeGroupLinearNV = gl_exts->NV_compute_shader_derivatives, + .SampleMaskPostDepthCoverage = gl_exts->ARB_post_depth_coverage, + .ShaderClockKHR = gl_exts->ARB_shader_clock, + .ShaderViewportIndexLayerEXT = gl_exts->ARB_shader_viewport_layer_array, + .StencilExportEXT = gl_exts->ARB_shader_stencil_export, + .SubgroupBallotKHR = gl_exts->ARB_shader_ballot && + spirv_exts->supported[SPV_KHR_shader_ballot], + .SubgroupVoteKHR = gl_exts->ARB_shader_group_vote && + spirv_exts->supported[SPV_KHR_subgroup_vote], + .TransformFeedback = gl_exts->ARB_transform_feedback3, + .VariablePointers = spirv_exts->supported[SPV_KHR_variable_pointers], + .IntegerFunctions2INTEL = gl_exts->INTEL_shader_integer_functions2, }; } diff --git a/src/mesa/main/spirv_capabilities.h b/src/mesa/main/spirv_capabilities.h index d1531bbfb33..1a0264982c5 100644 --- a/src/mesa/main/spirv_capabilities.h +++ b/src/mesa/main/spirv_capabilities.h @@ -36,9 +36,9 @@ extern "C" { #endif -struct spirv_supported_capabilities; +struct spirv_capabilities; -void _mesa_fill_supported_spirv_capabilities(struct spirv_supported_capabilities *caps, +void _mesa_fill_supported_spirv_capabilities(struct spirv_capabilities *caps, struct gl_constants *consts, const struct gl_extensions *gl_exts);