mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 18:08:40 +02:00
glsl: add OES_texture_buffer and EXT_texture_buffer support
Expose the samplerBuffer/imageBuffer types, and allow the various functions to operate on them. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
This commit is contained in:
parent
74b76c08a3
commit
720670a615
6 changed files with 46 additions and 24 deletions
|
|
@ -129,12 +129,6 @@ v130_fs_only(const _mesa_glsl_parse_state *state)
|
|||
state->stage == MESA_SHADER_FRAGMENT;
|
||||
}
|
||||
|
||||
static bool
|
||||
v140(const _mesa_glsl_parse_state *state)
|
||||
{
|
||||
return state->is_version(140, 0);
|
||||
}
|
||||
|
||||
static bool
|
||||
v140_or_es3(const _mesa_glsl_parse_state *state)
|
||||
{
|
||||
|
|
@ -183,6 +177,14 @@ v110_lod(const _mesa_glsl_parse_state *state)
|
|||
return !state->es_shader && lod_exists_in_stage(state);
|
||||
}
|
||||
|
||||
static bool
|
||||
texture_buffer(const _mesa_glsl_parse_state *state)
|
||||
{
|
||||
return state->is_version(140, 320) ||
|
||||
state->EXT_texture_buffer_enable ||
|
||||
state->OES_texture_buffer_enable;
|
||||
}
|
||||
|
||||
static bool
|
||||
shader_texture_lod(const _mesa_glsl_parse_state *state)
|
||||
{
|
||||
|
|
@ -1581,9 +1583,9 @@ builtin_builder::create_builtins()
|
|||
_textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2DRect_type),
|
||||
_textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRectShadow_type),
|
||||
|
||||
_textureSize(v140, glsl_type::int_type, glsl_type::samplerBuffer_type),
|
||||
_textureSize(v140, glsl_type::int_type, glsl_type::isamplerBuffer_type),
|
||||
_textureSize(v140, glsl_type::int_type, glsl_type::usamplerBuffer_type),
|
||||
_textureSize(texture_buffer, glsl_type::int_type, glsl_type::samplerBuffer_type),
|
||||
_textureSize(texture_buffer, glsl_type::int_type, glsl_type::isamplerBuffer_type),
|
||||
_textureSize(texture_buffer, glsl_type::int_type, glsl_type::usamplerBuffer_type),
|
||||
_textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::sampler2DMS_type),
|
||||
_textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::isampler2DMS_type),
|
||||
_textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::usampler2DMS_type),
|
||||
|
|
@ -1855,9 +1857,9 @@ builtin_builder::create_builtins()
|
|||
_texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type),
|
||||
_texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type),
|
||||
|
||||
_texelFetch(v140, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type),
|
||||
_texelFetch(v140, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type),
|
||||
_texelFetch(v140, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type),
|
||||
_texelFetch(texture_buffer, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type),
|
||||
_texelFetch(texture_buffer, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type),
|
||||
_texelFetch(texture_buffer, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type),
|
||||
|
||||
_texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMS_type, glsl_type::ivec2_type),
|
||||
_texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMS_type, glsl_type::ivec2_type),
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ static const struct builtin_type_versions {
|
|||
T(sampler2DArray, 130, 300)
|
||||
T(samplerCubeArray, 400, 999)
|
||||
T(sampler2DRect, 140, 999)
|
||||
T(samplerBuffer, 140, 999)
|
||||
T(samplerBuffer, 140, 320)
|
||||
T(sampler2DMS, 150, 310)
|
||||
T(sampler2DMSArray, 150, 999)
|
||||
|
||||
|
|
@ -191,7 +191,7 @@ static const struct builtin_type_versions {
|
|||
T(isampler2DArray, 130, 300)
|
||||
T(isamplerCubeArray, 400, 999)
|
||||
T(isampler2DRect, 140, 999)
|
||||
T(isamplerBuffer, 140, 999)
|
||||
T(isamplerBuffer, 140, 320)
|
||||
T(isampler2DMS, 150, 310)
|
||||
T(isampler2DMSArray, 150, 999)
|
||||
|
||||
|
|
@ -203,7 +203,7 @@ static const struct builtin_type_versions {
|
|||
T(usampler2DArray, 130, 300)
|
||||
T(usamplerCubeArray, 400, 999)
|
||||
T(usampler2DRect, 140, 999)
|
||||
T(usamplerBuffer, 140, 999)
|
||||
T(usamplerBuffer, 140, 320)
|
||||
T(usampler2DMS, 150, 310)
|
||||
T(usampler2DMSArray, 150, 999)
|
||||
|
||||
|
|
@ -222,7 +222,7 @@ static const struct builtin_type_versions {
|
|||
T(image3D, 420, 310)
|
||||
T(image2DRect, 420, 999)
|
||||
T(imageCube, 420, 310)
|
||||
T(imageBuffer, 420, 999)
|
||||
T(imageBuffer, 420, 320)
|
||||
T(image1DArray, 420, 999)
|
||||
T(image2DArray, 420, 310)
|
||||
T(imageCubeArray, 420, 999)
|
||||
|
|
@ -233,7 +233,7 @@ static const struct builtin_type_versions {
|
|||
T(iimage3D, 420, 310)
|
||||
T(iimage2DRect, 420, 999)
|
||||
T(iimageCube, 420, 310)
|
||||
T(iimageBuffer, 420, 999)
|
||||
T(iimageBuffer, 420, 320)
|
||||
T(iimage1DArray, 420, 999)
|
||||
T(iimage2DArray, 420, 310)
|
||||
T(iimageCubeArray, 420, 999)
|
||||
|
|
@ -244,7 +244,7 @@ static const struct builtin_type_versions {
|
|||
T(uimage3D, 420, 310)
|
||||
T(uimage2DRect, 420, 999)
|
||||
T(uimageCube, 420, 310)
|
||||
T(uimageBuffer, 420, 999)
|
||||
T(uimageBuffer, 420, 320)
|
||||
T(uimage1DArray, 420, 999)
|
||||
T(uimage2DArray, 420, 310)
|
||||
T(uimageCubeArray, 420, 999)
|
||||
|
|
@ -371,6 +371,16 @@ _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
|
|||
add_type(symbols, glsl_type::uimage2DMSArray_type);
|
||||
}
|
||||
|
||||
if (state->EXT_texture_buffer_enable || state->OES_texture_buffer_enable) {
|
||||
add_type(symbols, glsl_type::samplerBuffer_type);
|
||||
add_type(symbols, glsl_type::isamplerBuffer_type);
|
||||
add_type(symbols, glsl_type::usamplerBuffer_type);
|
||||
|
||||
add_type(symbols, glsl_type::imageBuffer_type);
|
||||
add_type(symbols, glsl_type::iimageBuffer_type);
|
||||
add_type(symbols, glsl_type::uimageBuffer_type);
|
||||
}
|
||||
|
||||
if (state->has_atomic_counters()) {
|
||||
add_type(symbols, glsl_type::atomic_uint_type);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2390,6 +2390,10 @@ _glcpp_parser_handle_version_declaration(glcpp_parser_t *parser, intmax_t versio
|
|||
add_builtin_define(parser, "GL_EXT_gpu_shader5", 1);
|
||||
add_builtin_define(parser, "GL_OES_gpu_shader5", 1);
|
||||
}
|
||||
if (extensions->OES_texture_buffer) {
|
||||
add_builtin_define(parser, "GL_EXT_texture_buffer", 1);
|
||||
add_builtin_define(parser, "GL_OES_texture_buffer", 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -369,7 +369,7 @@ image2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_l
|
|||
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, 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);
|
||||
imageBuffer KEYWORD_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_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, 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);
|
||||
|
|
@ -380,7 +380,7 @@ iimage2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_l
|
|||
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, 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);
|
||||
iimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_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, 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);
|
||||
|
|
@ -391,7 +391,7 @@ uimage2D KEYWORD_WITH_ALT(130, 300, 420, 310, yyextra->ARB_shader_image_l
|
|||
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, 310, yyextra->ARB_shader_image_load_store_enable, UIMAGECUBE);
|
||||
uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 0, yyextra->ARB_shader_image_load_store_enable, UIMAGEBUFFER);
|
||||
uimageBuffer KEYWORD_WITH_ALT(130, 300, 420, 320, yyextra->ARB_shader_image_load_store_enable || yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_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, 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);
|
||||
|
|
@ -565,15 +565,15 @@ common KEYWORD(130, 300, 0, 0, COMMON);
|
|||
partition KEYWORD(130, 300, 0, 0, PARTITION);
|
||||
active KEYWORD(130, 300, 0, 0, ACTIVE);
|
||||
superp KEYWORD(130, 100, 0, 0, SUPERP);
|
||||
samplerBuffer KEYWORD(130, 300, 140, 0, SAMPLERBUFFER);
|
||||
samplerBuffer KEYWORD_WITH_ALT(130, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, SAMPLERBUFFER);
|
||||
filter KEYWORD(130, 300, 0, 0, FILTER);
|
||||
row_major KEYWORD_WITH_ALT(130, 0, 140, 0, yyextra->ARB_uniform_buffer_object_enable && !yyextra->es_shader, ROW_MAJOR);
|
||||
|
||||
/* Additional reserved words in GLSL 1.40 */
|
||||
isampler2DRect KEYWORD(140, 300, 140, 0, ISAMPLER2DRECT);
|
||||
usampler2DRect KEYWORD(140, 300, 140, 0, USAMPLER2DRECT);
|
||||
isamplerBuffer KEYWORD(140, 300, 140, 0, ISAMPLERBUFFER);
|
||||
usamplerBuffer KEYWORD(140, 300, 140, 0, USAMPLERBUFFER);
|
||||
isamplerBuffer KEYWORD_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, ISAMPLERBUFFER);
|
||||
usamplerBuffer KEYWORD_WITH_ALT(140, 300, 140, 320, yyextra->EXT_texture_buffer_enable || yyextra->OES_texture_buffer_enable, USAMPLERBUFFER);
|
||||
|
||||
/* Additional reserved words in GLSL ES 3.00 */
|
||||
resource KEYWORD(0, 300, 0, 0, RESOURCE);
|
||||
|
|
|
|||
|
|
@ -611,6 +611,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
|
|||
EXT(OES_shader_image_atomic, false, true, ARB_shader_image_load_store),
|
||||
EXT(OES_standard_derivatives, false, true, OES_standard_derivatives),
|
||||
EXT(OES_texture_3D, false, true, dummy_true),
|
||||
EXT(OES_texture_buffer, false, true, OES_texture_buffer),
|
||||
EXT(OES_texture_storage_multisample_2d_array, false, true, ARB_texture_multisample),
|
||||
|
||||
/* All other extensions go here, sorted alphabetically.
|
||||
|
|
@ -627,6 +628,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
|
|||
EXT(EXT_shader_integer_mix, true, true, EXT_shader_integer_mix),
|
||||
EXT(EXT_shader_samples_identical, true, true, EXT_shader_samples_identical),
|
||||
EXT(EXT_texture_array, true, false, EXT_texture_array),
|
||||
EXT(EXT_texture_buffer, false, true, OES_texture_buffer),
|
||||
};
|
||||
|
||||
#undef EXT
|
||||
|
|
|
|||
|
|
@ -603,6 +603,8 @@ struct _mesa_glsl_parse_state {
|
|||
bool OES_standard_derivatives_warn;
|
||||
bool OES_texture_3D_enable;
|
||||
bool OES_texture_3D_warn;
|
||||
bool OES_texture_buffer_enable;
|
||||
bool OES_texture_buffer_warn;
|
||||
bool OES_texture_storage_multisample_2d_array_enable;
|
||||
bool OES_texture_storage_multisample_2d_array_warn;
|
||||
|
||||
|
|
@ -632,6 +634,8 @@ struct _mesa_glsl_parse_state {
|
|||
bool EXT_shader_samples_identical_warn;
|
||||
bool EXT_texture_array_enable;
|
||||
bool EXT_texture_array_warn;
|
||||
bool EXT_texture_buffer_enable;
|
||||
bool EXT_texture_buffer_warn;
|
||||
/*@}*/
|
||||
|
||||
/** Extensions supported by the OpenGL implementation. */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue