diff options
author | Francisco Jerez <currojerez@riseup.net> | 2015-08-07 16:41:13 +0300 |
---|---|---|
committer | Francisco Jerez <currojerez@riseup.net> | 2015-08-10 14:58:47 +0300 |
commit | cb7e1ad38b6f9c6a5c6103f7be1c16f509ecd20e (patch) | |
tree | 2cf107a4b06fd8e58e605fb8f2ce68218266f510 | |
parent | 60affbbd0548688785f8641c6c8105057a9607aa (diff) |
Fixes.image-load-store-ssbo
-rw-r--r-- | src/glsl/ast_array_index.cpp | 15 | ||||
-rw-r--r-- | src/glsl/ast_to_hir.cpp | 19 | ||||
-rw-r--r-- | src/glsl/builtin_functions.cpp | 67 | ||||
-rw-r--r-- | src/glsl/builtin_types.cpp | 70 | ||||
-rw-r--r-- | src/glsl/builtin_variables.cpp | 2 | ||||
-rw-r--r-- | src/glsl/glcpp/glcpp-parse.y | 2 | ||||
-rw-r--r-- | src/glsl/glsl_lexer.ll | 36 | ||||
-rw-r--r-- | src/glsl/glsl_parser.yy | 2 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.cpp | 1 | ||||
-rw-r--r-- | src/glsl/glsl_parser_extras.h | 2 | ||||
-rw-r--r-- | src/glsl/link_uniform_initializers.cpp | 42 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_context.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_wm_surface_state.c | 4 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/gen6_vs_state.c | 2 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/intel_extensions.c | 1 | ||||
-rw-r--r-- | src/mesa/main/bufferobj.c | 1 | ||||
-rw-r--r-- | src/mesa/main/extensions.c | 1 | ||||
-rw-r--r-- | src/mesa/main/get_hash_params.py | 2 | ||||
-rw-r--r-- | src/mesa/main/mtypes.h | 1 | ||||
-rw-r--r-- | src/mesa/main/shaderimage.c | 7 | ||||
-rw-r--r-- | src/mesa/main/texobj.c | 12 | ||||
-rw-r--r-- | src/mesa/main/texparam.c | 6 | ||||
-rw-r--r-- | src/mesa/main/uniform_query.cpp | 4 |
23 files changed, 212 insertions, 89 deletions
diff --git a/src/glsl/ast_array_index.cpp b/src/glsl/ast_array_index.cpp index 115b5f24a0a..dfb31073f82 100644 --- a/src/glsl/ast_array_index.cpp +++ b/src/glsl/ast_array_index.cpp @@ -291,6 +291,21 @@ _mesa_ast_array_index_to_hir(void *mem_ctx, "1.30 and later"); } } + + /* From page 27 of the GLSL ES 3.1 specification: + * + * "When aggregated into arrays within a shader, images can only be + * indexed with a constant integral expression." + * + * On the other hand the desktop GL specification extension allows + * non-constant indexing of image arrays, but behavior is left undefined + * in cases where the indexing expression is not dynamically uniform. + */ + if (state->es_shader && array->type->without_array()->is_image()) { + _mesa_glsl_error(&loc, state, + "image arrays indexed with non-constant " + "expressions are forbidden in GLSL ES."); + } } /* After performing all of the error checking, generate the IR for the diff --git a/src/glsl/ast_to_hir.cpp b/src/glsl/ast_to_hir.cpp index efe1787d4a0..055b473a09a 100644 --- a/src/glsl/ast_to_hir.cpp +++ b/src/glsl/ast_to_hir.cpp @@ -87,10 +87,10 @@ public: if (!var) return visit_continue; - if (var->data.image_write_only) { - found = var; - return visit_stop; - } + // if (var->data.image_write_only) { + // found = var; + // return visit_stop; + // } return visit_continue; } @@ -2323,6 +2323,16 @@ validate_binding_qualifier(struct _mesa_glsl_parse_state *state, return false; } + } else if (var->type->contains_image()) { + assert(ctx->Const.MaxImageUnits <= MAX_IMAGE_UNITS); + if (unsigned(qual->binding) >= ctx->Const.MaxImageUnits) { + _mesa_glsl_error(loc, state, "layout(binding = %d) exceeds the " + " maximum number of image units (%d)", qual->binding, + ctx->Const.MaxImageUnits); + + return false; + } + } else { _mesa_glsl_error(loc, state, "the \"binding\" qualifier only applies to uniform " @@ -5573,6 +5583,7 @@ is_valid_default_precision_type(const struct glsl_type *const type) /* "int" and "float" are valid, but vectors and matrices are not. */ return type->vector_elements == 1 && type->matrix_columns == 1; case GLSL_TYPE_SAMPLER: + case GLSL_TYPE_IMAGE: return true; default: return false; diff --git a/src/glsl/builtin_functions.cpp b/src/glsl/builtin_functions.cpp index 879e27e98ed..d105b65b625 100644 --- a/src/glsl/builtin_functions.cpp +++ b/src/glsl/builtin_functions.cpp @@ -388,7 +388,8 @@ shader_atomic_counters(const _mesa_glsl_parse_state *state) static bool shader_storage_buffer_object(const _mesa_glsl_parse_state *state) { - return state->ARB_shader_storage_buffer_object_enable; + return (state->is_version(430, 310) || + state->ARB_shader_storage_buffer_object_enable); } static bool @@ -400,11 +401,18 @@ shader_trinary_minmax(const _mesa_glsl_parse_state *state) static bool shader_image_load_store(const _mesa_glsl_parse_state *state) { - return (state->is_version(420, 0) || + return (state->is_version(420, 310) || state->ARB_shader_image_load_store_enable); } static bool +shader_image_atomic(const _mesa_glsl_parse_state *state) +{ + return (state->is_version(420, 0) || + state->OES_shader_image_atomic_enable); +} + +static bool gs_streams(const _mesa_glsl_parse_state *state) { return gpu_shader5(state) && gs_only(state); @@ -514,7 +522,8 @@ private: void add_image_function(const char *name, const char *intrinsic_name, unsigned num_arguments, - unsigned flags); + unsigned flags, + builtin_available_predicate avail); /** * Create new functions for all known image built-ins and types. @@ -724,11 +733,13 @@ private: ir_function_signature *_image_prototype(const glsl_type *image_type, const char *intrinsic_name, unsigned num_arguments, - unsigned flags); + unsigned flags, + builtin_available_predicate avail); ir_function_signature *_image(const glsl_type *image_type, const char *intrinsic_name, unsigned num_arguments, - unsigned flags); + unsigned flags, + builtin_available_predicate avail); ir_function_signature *_memory_barrier_intrinsic( builtin_available_predicate avail); @@ -2684,7 +2695,8 @@ void builtin_builder::add_image_function(const char *name, const char *intrinsic_name, unsigned num_arguments, - unsigned flags) + unsigned flags, + builtin_available_predicate avail) { static const glsl_type *const types[] = { glsl_type::image1D_type, @@ -2727,7 +2739,7 @@ builtin_builder::add_image_function(const char *name, if (types[i]->sampler_type != GLSL_TYPE_FLOAT || (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) f->add_signature(_image(types[i], intrinsic_name, - num_arguments, flags)); + num_arguments, flags, avail)); } shader->symbols->add_function(f); @@ -2742,40 +2754,50 @@ builtin_builder::add_image_functions(bool glsl) "__intrinsic_image_load", 0, (flags | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | - IMAGE_FUNCTION_READ_ONLY)); + IMAGE_FUNCTION_READ_ONLY), + shader_image_load_store); add_image_function(glsl ? "imageStore" : "__intrinsic_image_store", "__intrinsic_image_store", 1, (flags | IMAGE_FUNCTION_RETURNS_VOID | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE | - IMAGE_FUNCTION_WRITE_ONLY)); + IMAGE_FUNCTION_WRITE_ONLY), + shader_image_load_store); add_image_function(glsl ? "imageAtomicAdd" : "__intrinsic_image_atomic_add", - "__intrinsic_image_atomic_add", 1, flags); + "__intrinsic_image_atomic_add", 1, flags, + shader_image_atomic); add_image_function(glsl ? "imageAtomicMin" : "__intrinsic_image_atomic_min", - "__intrinsic_image_atomic_min", 1, flags); + "__intrinsic_image_atomic_min", 1, flags, + shader_image_atomic); add_image_function(glsl ? "imageAtomicMax" : "__intrinsic_image_atomic_max", - "__intrinsic_image_atomic_max", 1, flags); + "__intrinsic_image_atomic_max", 1, flags, + shader_image_atomic); add_image_function(glsl ? "imageAtomicAnd" : "__intrinsic_image_atomic_and", - "__intrinsic_image_atomic_and", 1, flags); + "__intrinsic_image_atomic_and", 1, flags, + shader_image_atomic); add_image_function(glsl ? "imageAtomicOr" : "__intrinsic_image_atomic_or", - "__intrinsic_image_atomic_or", 1, flags); + "__intrinsic_image_atomic_or", 1, flags, + shader_image_atomic); add_image_function(glsl ? "imageAtomicXor" : "__intrinsic_image_atomic_xor", - "__intrinsic_image_atomic_xor", 1, flags); + "__intrinsic_image_atomic_xor", 1, flags, + shader_image_atomic); add_image_function((glsl ? "imageAtomicExchange" : "__intrinsic_image_atomic_exchange"), - "__intrinsic_image_atomic_exchange", 1, flags); + "__intrinsic_image_atomic_exchange", 1, flags, + shader_image_atomic); add_image_function((glsl ? "imageAtomicCompSwap" : "__intrinsic_image_atomic_comp_swap"), - "__intrinsic_image_atomic_comp_swap", 2, flags); + "__intrinsic_image_atomic_comp_swap", 2, flags, + shader_image_atomic); } ir_variable * @@ -4958,7 +4980,8 @@ ir_function_signature * builtin_builder::_image_prototype(const glsl_type *image_type, const char *intrinsic_name, unsigned num_arguments, - unsigned flags) + unsigned flags, + builtin_available_predicate avail) { const glsl_type *data_type = glsl_type::get_instance( image_type->sampler_type, @@ -4972,8 +4995,7 @@ builtin_builder::_image_prototype(const glsl_type *image_type, ir_variable *coord = in_var( glsl_type::ivec(image_type->coordinate_components()), "coord"); - ir_function_signature *sig = new_sig( - ret_type, shader_image_load_store, 2, image, coord); + ir_function_signature *sig = new_sig(ret_type, avail, 2, image, coord); /* Sample index for multisample images. */ if (image_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) @@ -5006,10 +5028,11 @@ ir_function_signature * builtin_builder::_image(const glsl_type *image_type, const char *intrinsic_name, unsigned num_arguments, - unsigned flags) + unsigned flags, + builtin_available_predicate avail) { ir_function_signature *sig = _image_prototype(image_type, intrinsic_name, - num_arguments, flags); + num_arguments, flags, avail); if (flags & IMAGE_FUNCTION_EMIT_STUB) { ir_factory body(&sig->body, mem_ctx); diff --git a/src/glsl/builtin_types.cpp b/src/glsl/builtin_types.cpp index 896d0b38f6e..7334d9f70a8 100644 --- a/src/glsl/builtin_types.cpp +++ b/src/glsl/builtin_types.cpp @@ -220,41 +220,41 @@ const static struct builtin_type_versions { T(struct_gl_DepthRangeParameters, 110, 100) - T(image1D, 420, 999) - T(image2D, 420, 999) - T(image3D, 420, 999) - T(image2DRect, 420, 999) - T(imageCube, 420, 999) - T(imageBuffer, 420, 999) - T(image1DArray, 420, 999) - T(image2DArray, 420, 999) - T(imageCubeArray, 420, 999) - T(image2DMS, 420, 999) - T(image2DMSArray, 420, 999) - T(iimage1D, 420, 999) - T(iimage2D, 420, 999) - T(iimage3D, 420, 999) - T(iimage2DRect, 420, 999) - T(iimageCube, 420, 999) - T(iimageBuffer, 420, 999) - T(iimage1DArray, 420, 999) - T(iimage2DArray, 420, 999) - T(iimageCubeArray, 420, 999) - T(iimage2DMS, 420, 999) - T(iimage2DMSArray, 420, 999) - T(uimage1D, 420, 999) - T(uimage2D, 420, 999) - T(uimage3D, 420, 999) - T(uimage2DRect, 420, 999) - T(uimageCube, 420, 999) - T(uimageBuffer, 420, 999) - T(uimage1DArray, 420, 999) - T(uimage2DArray, 420, 999) - T(uimageCubeArray, 420, 999) - T(uimage2DMS, 420, 999) - T(uimage2DMSArray, 420, 999) - - T(atomic_uint, 420, 999) + T(image1D, 420, 310) + T(image2D, 420, 310) + T(image3D, 420, 310) + T(image2DRect, 420, 310) + T(imageCube, 420, 310) + T(imageBuffer, 420, 310) + T(image1DArray, 420, 310) + T(image2DArray, 420, 310) + T(imageCubeArray, 420, 310) + T(image2DMS, 420, 310) + T(image2DMSArray, 420, 310) + T(iimage1D, 420, 310) + T(iimage2D, 420, 310) + T(iimage3D, 420, 310) + T(iimage2DRect, 420, 310) + T(iimageCube, 420, 310) + T(iimageBuffer, 420, 310) + T(iimage1DArray, 420, 310) + T(iimage2DArray, 420, 310) + T(iimageCubeArray, 420, 310) + T(iimage2DMS, 420, 310) + T(iimage2DMSArray, 420, 310) + T(uimage1D, 420, 310) + T(uimage2D, 420, 310) + T(uimage3D, 420, 310) + T(uimage2DRect, 420, 310) + T(uimageCube, 420, 310) + T(uimageBuffer, 420, 310) + T(uimage1DArray, 420, 310) + T(uimage2DArray, 420, 310) + T(uimageCubeArray, 420, 310) + T(uimage2DMS, 420, 310) + T(uimage2DMSArray, 420, 310) + + T(atomic_uint, 420, 310) }; static const glsl_type *const deprecated_types[] = { diff --git a/src/glsl/builtin_variables.cpp b/src/glsl/builtin_variables.cpp index 53d3500b1f4..7abfd339480 100644 --- a/src/glsl/builtin_variables.cpp +++ b/src/glsl/builtin_variables.cpp @@ -744,7 +744,7 @@ builtin_variable_generator::generate_constants() */ } - if (state->is_version(420, 0) || + if (state->is_version(420, 310) || state->ARB_shader_image_load_store_enable) { add_const("gl_MaxImageUnits", state->Const.MaxImageUnits); diff --git a/src/glsl/glcpp/glcpp-parse.y b/src/glsl/glcpp/glcpp-parse.y index dd5ec2a30b5..6aeaa76842a 100644 --- a/src/glsl/glcpp/glcpp-parse.y +++ b/src/glsl/glcpp/glcpp-parse.y @@ -2382,6 +2382,8 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio add_builtin_define(parser, "GL_OES_EGL_image_external", 1); if (extensions->OES_standard_derivatives) add_builtin_define(parser, "GL_OES_standard_derivatives", 1); + if (extensions->OES_shader_image_atomic) + add_builtin_define(parser, "GL_OES_shader_image_atomic", 1); } } else { add_builtin_define(parser, "GL_ARB_draw_buffers", 1); diff --git a/src/glsl/glsl_lexer.ll b/src/glsl/glsl_lexer.ll index b9d700a4f9e..29f452f61da 100644 --- a/src/glsl/glsl_lexer.ll +++ b/src/glsl/glsl_lexer.ll @@ -368,35 +368,35 @@ precise KEYWORD_WITH_ALT(400, 0, 400, 0, yyextra->ARB_gpu_shader5_enable, PRECI /* keywords available with ARB_shader_image_load_store */ image1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1D); -image2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2D); -image3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE3D); +image2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IMAGE2D); +image3D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IMAGE3D); image2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DRECT); -imageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBE); +imageCube KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IMAGECUBE); imageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGEBUFFER); image1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE1DARRAY); -image2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DARRAY); +image2DArray KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IMAGE2DARRAY); imageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGECUBEARRAY); image2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMS); image2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IMAGE2DMSARRAY); iimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1D); -iimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2D); -iimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE3D); +iimage2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IIMAGE2D); +iimage3D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IIMAGE3D); iimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DRECT); -iimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBE); +iimageCube KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBE); iimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGEBUFFER); iimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE1DARRAY); -iimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DARRAY); +iimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DARRAY); iimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGECUBEARRAY); iimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMS); iimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, IIMAGE2DMSARRAY); uimage1D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1D); -uimage2D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2D); -uimage3D KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE3D); +uimage2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGE2D); +uimage3D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGE3D); uimage2DRect KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DRECT); -uimageCube KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE); -uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER); +uimageCube KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE); +uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER); uimage1DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE1DARRAY); -uimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DARRAY); +uimage2DArray KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DARRAY); uimageCubeArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBEARRAY); uimage2DMS KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMS); uimage2DMSArray KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGE2DMSARRAY); @@ -405,11 +405,11 @@ image2DShadow KEYWORD(130, 300, 0, 0, IMAGE2DSHADOW); image1DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE1DARRAYSHADOW); image2DArrayShadow KEYWORD(130, 300, 0, 0, IMAGE2DARRAYSHADOW); -coherent KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, COHERENT); -volatile KEYWORD_WITH_ALT(110, 100, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, VOLATILE); -restrict KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, RESTRICT); -readonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, READONLY); -writeonly KEYWORD_WITH_ALT(420, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, WRITEONLY); +coherent KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, COHERENT); +volatile KEYWORD_WITH_ALT(110, 100, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, VOLATILE); +restrict KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, RESTRICT); +readonly KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, READONLY); +writeonly KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_image_load_store_enable || yyextra->ARB_shader_storage_buffer_object_enable, WRITEONLY); atomic_uint KEYWORD_WITH_ALT(420, 300, 420, 310, yyextra->ARB_shader_atomic_counters_enable, ATOMIC_UINT); diff --git a/src/glsl/glsl_parser.yy b/src/glsl/glsl_parser.yy index 455041c83c9..841acc08b3f 100644 --- a/src/glsl/glsl_parser.yy +++ b/src/glsl/glsl_parser.yy @@ -1280,7 +1280,7 @@ layout_qualifier_id: /* Layout qualifiers for ARB_shader_image_load_store. */ if (state->ARB_shader_image_load_store_enable || - state->is_version(420, 0)) { + state->is_version(420, 310)) { if (!$$.flags.i) { static const struct { const char *name; diff --git a/src/glsl/glsl_parser_extras.cpp b/src/glsl/glsl_parser_extras.cpp index 53c7d509147..e87dbfda6b8 100644 --- a/src/glsl/glsl_parser_extras.cpp +++ b/src/glsl/glsl_parser_extras.cpp @@ -624,6 +624,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = { /* OES extensions go here, sorted alphabetically. */ EXT(OES_EGL_image_external, false, true, OES_EGL_image_external), + EXT(OES_shader_image_atomic, false, true, OES_shader_image_atomic), EXT(OES_standard_derivatives, false, true, OES_standard_derivatives), EXT(OES_texture_3D, false, true, EXT_texture3D), diff --git a/src/glsl/glsl_parser_extras.h b/src/glsl/glsl_parser_extras.h index 05b6a273733..ed071b15fa4 100644 --- a/src/glsl/glsl_parser_extras.h +++ b/src/glsl/glsl_parser_extras.h @@ -537,6 +537,8 @@ struct _mesa_glsl_parse_state { */ bool OES_EGL_image_external_enable; bool OES_EGL_image_external_warn; + bool OES_shader_image_atomic_enable; + bool OES_shader_image_atomic_warn; bool OES_standard_derivatives_enable; bool OES_standard_derivatives_warn; bool OES_texture_3D_enable; diff --git a/src/glsl/link_uniform_initializers.cpp b/src/glsl/link_uniform_initializers.cpp index d61ae91f4ad..f625c5ec2cb 100644 --- a/src/glsl/link_uniform_initializers.cpp +++ b/src/glsl/link_uniform_initializers.cpp @@ -139,6 +139,46 @@ set_sampler_binding(gl_shader_program *prog, const char *name, int binding) storage->initialized = true; } +static void +set_image_binding(gl_shader_program *prog, const char *name, int binding) +{ + struct gl_uniform_storage *const storage = + get_storage(prog->UniformStorage, prog->NumUniformStorage, name); + + if (storage == NULL) { + assert(storage != NULL); + return; + } + + const unsigned elements = MAX2(storage->array_elements, 1); + + /* Section 4.4.4 (Opaque-Uniform Layout Qualifiers) of the GLSL 4.20 spec + * says: + * + * "If the binding identifier is used with an array, the first element + * of the array takes the specified unit and each subsequent element + * takes the next consecutive unit." + */ + for (unsigned int i = 0; i < elements; i++) { + storage->storage[i].i = binding + i; + } + + for (int sh = 0; sh < MESA_SHADER_STAGES; sh++) { + gl_shader *shader = prog->_LinkedShaders[sh]; + + if (shader && storage->image[sh].active) { + for (unsigned i = 0; i < elements; i++) { + unsigned index = storage->image[sh].index + i; + + shader->SamplerUnits[index] = storage->storage[i].i; + shader->ImageUnits[index] =storage->storage[i].i; + } + } + } + + storage->initialized = true; +} + void set_block_binding(gl_shader_program *prog, const char *block_name, int binding) { @@ -269,6 +309,8 @@ link_set_uniform_initializers(struct gl_shader_program *prog, if (type->without_array()->is_sampler()) { linker::set_sampler_binding(prog, var->name, var->data.binding); + } else if (type->without_array()->is_image()) { + linker::set_image_binding(prog, var->name, var->data.binding); } else if (var->is_in_buffer_block()) { const glsl_type *const iface_type = var->get_interface_type(); diff --git a/src/mesa/drivers/dri/i965/brw_context.c b/src/mesa/drivers/dri/i965/brw_context.c index bc3ba0ac1b8..a3254de4199 100644 --- a/src/mesa/drivers/dri/i965/brw_context.c +++ b/src/mesa/drivers/dri/i965/brw_context.c @@ -573,7 +573,7 @@ brw_initialize_context_constants(struct brw_context *brw) ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks = 12; ctx->Const.Program[MESA_SHADER_COMPUTE].MaxShaderStorageBlocks = 12; ctx->Const.MaxCombinedShaderStorageBlocks = 12 * 3; - ctx->Const.MaxShaderStorageBufferBindings = 48; + ctx->Const.MaxShaderStorageBufferBindings = 42; if (brw->gen >= 6) { ctx->Const.MaxVarying = 32; diff --git a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c index 731da0e9931..bc1bb2cc7a4 100644 --- a/src/mesa/drivers/dri/i965/brw_wm_surface_state.c +++ b/src/mesa/drivers/dri/i965/brw_wm_surface_state.c @@ -1163,7 +1163,7 @@ update_texture_image_param(struct brw_context *brw, minify(mt->logical_depth0, u->Level) : mt->logical_depth0); - intel_miptree_get_image_offset(mt, u->Level, u->Layer, + intel_miptree_get_image_offset(mt, u->Level, (u->Layered ? 0 : u->Layer), ¶m->offset[0], ¶m->offset[1]); @@ -1248,7 +1248,7 @@ update_image_surface(struct brw_context *brw, access != GL_READ_ONLY); } else { - const unsigned min_layer = obj->MinLayer + u->Layer; + const unsigned min_layer = obj->MinLayer + (u->Layered ? 0 : u->Layer); const unsigned min_level = obj->MinLevel + u->Level; const unsigned num_layers = (!u->Layered ? 1 : obj->Target == GL_TEXTURE_CUBE_MAP ? 6 : diff --git a/src/mesa/drivers/dri/i965/gen6_vs_state.c b/src/mesa/drivers/dri/i965/gen6_vs_state.c index 35d10ef8779..556b9b40b59 100644 --- a/src/mesa/drivers/dri/i965/gen6_vs_state.c +++ b/src/mesa/drivers/dri/i965/gen6_vs_state.c @@ -93,7 +93,7 @@ gen6_upload_push_constants(struct brw_context *brw, if ((i & 7) == 0) fprintf(stderr, "g%d: ", prog_data->dispatch_grf_start_reg + i / 8); - fprintf(stderr, "%8f ", param[i].f); + fprintf(stderr, "%08x ", param[i].u); if ((i & 7) == 7) fprintf(stderr, "\n"); } diff --git a/src/mesa/drivers/dri/i965/intel_extensions.c b/src/mesa/drivers/dri/i965/intel_extensions.c index 75057c1b736..bd48422e910 100644 --- a/src/mesa/drivers/dri/i965/intel_extensions.c +++ b/src/mesa/drivers/dri/i965/intel_extensions.c @@ -326,6 +326,7 @@ intelInitExtensions(struct gl_context *ctx) ctx->Extensions.ARB_gpu_shader5 = true; ctx->Extensions.ARB_shader_atomic_counters = true; ctx->Extensions.ARB_shader_image_load_store = true; + ctx->Extensions.OES_shader_image_atomic = true; ctx->Extensions.ARB_texture_compression_bptc = true; ctx->Extensions.ARB_texture_view = true; ctx->Extensions.ARB_shader_storage_buffer_object = true; diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c index 6ddcc5cad4e..55916b11c6a 100644 --- a/src/mesa/main/bufferobj.c +++ b/src/mesa/main/bufferobj.c @@ -90,6 +90,7 @@ get_buffer_target(struct gl_context *ctx, GLenum target) return &ctx->CopyReadBuffer; case GL_COPY_WRITE_BUFFER: return &ctx->CopyWriteBuffer; + case GL_DISPATCH_INDIRECT_BUFFER: case GL_DRAW_INDIRECT_BUFFER: if ((ctx->API == API_OPENGL_CORE && ctx->Extensions.ARB_draw_indirect) || diff --git a/src/mesa/main/extensions.c b/src/mesa/main/extensions.c index 2dbfabdc7b5..49558032caf 100644 --- a/src/mesa/main/extensions.c +++ b/src/mesa/main/extensions.c @@ -319,6 +319,7 @@ static const struct extension extension_table[] = { { "GL_OES_query_matrix", o(dummy_true), ES1, 2003 }, { "GL_OES_read_format", o(dummy_true), GL | ES1, 2003 }, { "GL_OES_rgb8_rgba8", o(dummy_true), ES1 | ES2, 2005 }, + { "GL_OES_shader_image_atomic", o(OES_shader_image_atomic), ES3, 2015 }, { "GL_OES_single_precision", o(dummy_true), ES1, 2003 }, { "GL_OES_standard_derivatives", o(OES_standard_derivatives), ES2, 2005 }, { "GL_OES_stencil1", o(dummy_false), DISABLE, 2005 }, diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py index 3fcf29e1c70..d7943c6bea9 100644 --- a/src/mesa/main/get_hash_params.py +++ b/src/mesa/main/get_hash_params.py @@ -409,6 +409,7 @@ descriptor=[ [ "MAX_COMBINED_SHADER_OUTPUT_RESOURCES", "CONTEXT_INT(Const.MaxCombinedImageUnitsAndFragmentOutputs), extra_ARB_shader_storage_buffer_object_es31" ], [ "SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT", "CONTEXT_INT(Const.ShaderStorageBufferOffsetAlignment), extra_ARB_shader_storage_buffer_object_es31" ], [ "SHADER_STORAGE_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, extra_ARB_shader_storage_buffer_object_es31" ], + [ "MAX_SHADER_STORAGE_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxShaderStorageBufferBindings), extra_ARB_shader_storage_buffer_object_es31" ], ]}, { "apis": ["GLES", "GLES2"], "params": [ @@ -833,7 +834,6 @@ descriptor=[ [ "MAX_GEOMETRY_SHADER_STORAGE_BLOCKS", "CONTEXT_INT(Const.Program[MESA_SHADER_FRAGMENT].MaxShaderStorageBlocks), extra_ARB_shader_storage_buffer_object" ], [ "MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks), extra_ARB_shader_storage_buffer_object" ], [ "MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks), extra_ARB_shader_storage_buffer_object" ], - [ "MAX_SHADER_STORAGE_BUFFER_BINDINGS", "CONTEXT_INT(Const.MaxShaderStorageBufferBindings), extra_ARB_shader_storage_buffer_object" ], ]}, # Enums restricted to OpenGL Core profile diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index e5e147e5cb9..ce124381936 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3971,6 +3971,7 @@ struct gl_extensions GLboolean OES_draw_texture; GLboolean OES_depth_texture_cube_map; GLboolean OES_EGL_image_external; + GLboolean OES_shader_image_atomic; GLboolean OES_texture_float; GLboolean OES_texture_float_linear; GLboolean OES_texture_half_float; diff --git a/src/mesa/main/shaderimage.c b/src/mesa/main/shaderimage.c index 7337f2255c4..7d01be908d2 100644 --- a/src/mesa/main/shaderimage.c +++ b/src/mesa/main/shaderimage.c @@ -475,6 +475,11 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level, return; } + if (!_mesa_is_desktop_gl(ctx) && !t->Immutable) { + _mesa_error(ctx, GL_INVALID_OPERATION, "glBindImageTexture(texture)"); + return; + } + _mesa_reference_texobj(&u->TexObj, t); } else { _mesa_reference_texobj(&u->TexObj, NULL); @@ -488,7 +493,7 @@ _mesa_BindImageTexture(GLuint unit, GLuint texture, GLint level, if (u->TexObj && _mesa_tex_target_is_layered(u->TexObj->Target)) { u->Layered = layered; - u->Layer = (layered ? 0 : layer); + u->Layer = layer; } else { u->Layered = GL_FALSE; u->Layer = 0; diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index cd7cfd6a4fb..3ae971f3578 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -37,6 +37,7 @@ #include "hash.h" #include "imports.h" #include "macros.h" +#include "shaderimage.h" #include "teximage.h" #include "texobj.h" #include "texstate.h" @@ -1411,8 +1412,17 @@ unbind_texobj_from_image_units(struct gl_context *ctx, for (i = 0; i < ctx->Const.MaxImageUnits; i++) { struct gl_image_unit *unit = &ctx->ImageUnits[i]; - if (texObj == unit->TexObj) + if (texObj == unit->TexObj) { _mesa_reference_texobj(&unit->TexObj, NULL); + unit->Level = 0; + unit->Layered = GL_FALSE; + unit->Layer = 0; + unit->Access = GL_READ_ONLY; + unit->Format = GL_R32UI; + unit->_ActualFormat = _mesa_get_shader_image_format(unit->Format); + unit->_Valid = GL_FALSE; + + } } } diff --git a/src/mesa/main/texparam.c b/src/mesa/main/texparam.c index c0611c3e489..f67c5c32aad 100644 --- a/src/mesa/main/texparam.c +++ b/src/mesa/main/texparam.c @@ -1890,6 +1890,12 @@ get_tex_parameterfv(struct gl_context *ctx, *params = (GLfloat) obj->Sampler.sRGBDecode; break; + case GL_IMAGE_FORMAT_COMPATIBILITY_TYPE: + if (!ctx->Extensions.ARB_shader_image_load_store) + goto invalid_pname; + *params = obj->ImageFormatCompatibilityType; + break; + default: goto invalid_pname; } diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp index 036530e91b6..988ec764137 100644 --- a/src/mesa/main/uniform_query.cpp +++ b/src/mesa/main/uniform_query.cpp @@ -677,9 +677,11 @@ _mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg, match = (basicType != GLSL_TYPE_DOUBLE); break; case GLSL_TYPE_SAMPLER: - case GLSL_TYPE_IMAGE: match = (basicType == GLSL_TYPE_INT); break; + case GLSL_TYPE_IMAGE: + match = (basicType == GLSL_TYPE_INT && _mesa_is_desktop_gl(ctx)); + break; default: match = (basicType == uni->type->base_type); break; |