Home | History | Annotate | Line # | Download | only in main
      1 /*
      2  * Copyright  2017 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * on the rights to use, copy, modify, merge, publish, distribute, sub
      8  * license, and/or sell copies of the Software, and to permit persons to whom
      9  * the Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     18  * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
     19  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
     20  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
     21  * USE OR OTHER DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 /**
     25  * \file
     26  * \brief SPIRV-V extension handling. See ARB_spirv_extensions
     27  */
     28 
     29 #include <stdbool.h>
     30 #include "spirv_extensions.h"
     31 
     32 GLuint
     33 _mesa_get_spirv_extension_count(struct gl_context *ctx)
     34 {
     35    if (ctx->Const.SpirVExtensions == NULL)
     36       return 0;
     37 
     38    return ctx->Const.SpirVExtensions->count;
     39 }
     40 
     41 const GLubyte *
     42 _mesa_get_enabled_spirv_extension(struct gl_context *ctx,
     43                                   GLuint index)
     44 {
     45    unsigned int n = 0;
     46 
     47    if (ctx->Const.SpirVExtensions == NULL)
     48       return (const GLubyte *) 0;
     49 
     50    for (unsigned int i = 0; i < SPV_EXTENSIONS_COUNT; i++) {
     51       if (ctx->Const.SpirVExtensions->supported[i]) {
     52          if (n == index)
     53             return (const GLubyte *) _mesa_spirv_extensions_to_string(i);
     54          else
     55             n++;
     56       }
     57    }
     58 
     59    return (const GLubyte *) 0;
     60 }
     61 
     62 const char *
     63 _mesa_spirv_extensions_to_string(enum SpvExtension ext)
     64 {
     65 #define STR(x) case x: return #x;
     66    switch (ext) {
     67    STR(SPV_KHR_16bit_storage);
     68    STR(SPV_KHR_device_group);
     69    STR(SPV_KHR_multiview);
     70    STR(SPV_KHR_shader_ballot);
     71    STR(SPV_KHR_shader_draw_parameters);
     72    STR(SPV_KHR_storage_buffer_storage_class);
     73    STR(SPV_KHR_subgroup_vote);
     74    STR(SPV_KHR_variable_pointers);
     75    STR(SPV_AMD_gcn_shader);
     76    case SPV_EXTENSIONS_COUNT:
     77       unreachable("Unknown SPIR-V extension");
     78    }
     79 #undef STR
     80 
     81    return "unknown";
     82 }
     83 
     84 /**
     85  * Sets the supported flags for known SPIR-V extensions based on the
     86  * capabilites supported (spirv capabilities based on the spirv to nir
     87  * support).
     88  *
     89  * One could argue that makes more sense in the other way around, as from the
     90  * spec pov capabilities are enable for a given extension. But from our pov,
     91  * we support or not (depending on the driver) some given capability, and
     92  * spirv_to_nir check for capabilities not extensions. Also we usually fill
     93  * first the supported capabilities, that are not always related to an
     94  * extension.
     95  */
     96 void
     97 _mesa_fill_supported_spirv_extensions(struct spirv_supported_extensions *ext,
     98                                       const struct spirv_supported_capabilities *cap)
     99 {
    100    memset(ext->supported, 0, sizeof(ext->supported));
    101 
    102    ext->count = 0;
    103 
    104    ext->supported[SPV_KHR_shader_draw_parameters] = cap->draw_parameters;
    105    ext->supported[SPV_KHR_multiview] = cap->multiview;
    106    ext->supported[SPV_KHR_storage_buffer_storage_class] = true;
    107    ext->supported[SPV_KHR_variable_pointers] = cap->variable_pointers;
    108    ext->supported[SPV_AMD_gcn_shader] = cap->amd_gcn_shader;
    109    ext->supported[SPV_KHR_shader_ballot] = cap->subgroup_ballot;
    110    ext->supported[SPV_KHR_subgroup_vote] = cap->subgroup_vote;
    111 
    112    for (unsigned i = 0; i < SPV_EXTENSIONS_COUNT; i++) {
    113       if (ext->supported[i])
    114          ext->count++;
    115    }
    116 }
    117