summaryrefslogtreecommitdiffstats
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/glsl/glsl_parser.yy86
-rw-r--r--src/compiler/glsl/glsl_parser_extras.cpp2
-rw-r--r--src/compiler/glsl/glsl_parser_extras.h2
3 files changed, 49 insertions, 41 deletions
diff --git a/src/compiler/glsl/glsl_parser.yy b/src/compiler/glsl/glsl_parser.yy
index 7d709c78c57..a48dc68b00e 100644
--- a/src/compiler/glsl/glsl_parser.yy
+++ b/src/compiler/glsl/glsl_parser.yy
@@ -1296,51 +1296,55 @@ layout_qualifier_id:
unsigned required_glsl;
/** Minimum GLSL ES version required for the image format. */
unsigned required_essl;
+ /* NV_image_formats */
+ bool nv_image_formats;
} map[] = {
- { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310 },
- { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310 },
- { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0 },
- { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0 },
- { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0 },
- { "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310 },
- { "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0 },
- { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310 },
- { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310 },
- { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0 },
- { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310 },
- { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0 },
- { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0 },
- { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0 },
- { "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310 },
- { "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0 },
- { "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0 },
- { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310 },
- { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310 },
- { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310 },
- { "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0 },
- { "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0 },
- { "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0 },
- { "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310 },
- { "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0 },
- { "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0 },
- { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0 },
- { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0 },
- { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310 },
- { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0 },
- { "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0 },
- { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0 },
- { "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0 },
- { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0 },
- { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310 },
- { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0 },
- { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0 },
- { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0 },
- { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0 }
+ { "rgba32f", GL_RGBA32F, GLSL_TYPE_FLOAT, 130, 310, false },
+ { "rgba16f", GL_RGBA16F, GLSL_TYPE_FLOAT, 130, 310, false },
+ { "rg32f", GL_RG32F, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "rg16f", GL_RG16F, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "r11f_g11f_b10f", GL_R11F_G11F_B10F, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "r32f", GL_R32F, GLSL_TYPE_FLOAT, 130, 310, false },
+ { "r16f", GL_R16F, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "rgba32ui", GL_RGBA32UI, GLSL_TYPE_UINT, 130, 310, false },
+ { "rgba16ui", GL_RGBA16UI, GLSL_TYPE_UINT, 130, 310, false },
+ { "rgb10_a2ui", GL_RGB10_A2UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "rgba8ui", GL_RGBA8UI, GLSL_TYPE_UINT, 130, 310, false },
+ { "rg32ui", GL_RG32UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "rg16ui", GL_RG16UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "rg8ui", GL_RG8UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "r32ui", GL_R32UI, GLSL_TYPE_UINT, 130, 310, false },
+ { "r16ui", GL_R16UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "r8ui", GL_R8UI, GLSL_TYPE_UINT, 130, 0, true },
+ { "rgba32i", GL_RGBA32I, GLSL_TYPE_INT, 130, 310, false },
+ { "rgba16i", GL_RGBA16I, GLSL_TYPE_INT, 130, 310, false },
+ { "rgba8i", GL_RGBA8I, GLSL_TYPE_INT, 130, 310, false },
+ { "rg32i", GL_RG32I, GLSL_TYPE_INT, 130, 0, true },
+ { "rg16i", GL_RG16I, GLSL_TYPE_INT, 130, 0, true },
+ { "rg8i", GL_RG8I, GLSL_TYPE_INT, 130, 0, true },
+ { "r32i", GL_R32I, GLSL_TYPE_INT, 130, 310, false },
+ { "r16i", GL_R16I, GLSL_TYPE_INT, 130, 0, true },
+ { "r8i", GL_R8I, GLSL_TYPE_INT, 130, 0, true },
+ { "rgba16", GL_RGBA16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rgb10_a2", GL_RGB10_A2, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "rgba8", GL_RGBA8, GLSL_TYPE_FLOAT, 130, 310, false },
+ { "rg16", GL_RG16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rg8", GL_RG8, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "r16", GL_R16, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "r8", GL_R8, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "rgba16_snorm", GL_RGBA16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rgba8_snorm", GL_RGBA8_SNORM, GLSL_TYPE_FLOAT, 130, 310, false },
+ { "rg16_snorm", GL_RG16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "rg8_snorm", GL_RG8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true },
+ { "r16_snorm", GL_R16_SNORM, GLSL_TYPE_FLOAT, 130, 0, false },
+ { "r8_snorm", GL_R8_SNORM, GLSL_TYPE_FLOAT, 130, 0, true }
};
for (unsigned i = 0; i < ARRAY_SIZE(map); i++) {
- if (state->is_version(map[i].required_glsl,
- map[i].required_essl) &&
+ if ((state->is_version(map[i].required_glsl,
+ map[i].required_essl) ||
+ (state->NV_image_formats_enable &&
+ map[i].nv_image_formats)) &&
match_layout_qualifier($1, map[i].name, state) == 0) {
$$.flags.q.explicit_image_format = 1;
$$.image_format = map[i].format;
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
index 0cb3c124ea5..1f3ba2ced44 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -28,6 +28,7 @@
#include "main/core.h" /* for struct gl_context */
#include "main/context.h"
#include "main/debug_output.h"
+#include "main/formats.h"
#include "main/shaderobj.h"
#include "util/u_atomic.h" /* for p_atomic_cmpxchg */
#include "util/ralloc.h"
@@ -687,6 +688,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
EXT_AEP(EXT_texture_buffer),
EXT_AEP(EXT_texture_cube_map_array),
EXT(MESA_shader_integer_functions),
+ EXT(NV_image_formats),
};
#undef EXT
diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
index 53abbbc997f..d757c1d76b2 100644
--- a/src/compiler/glsl/glsl_parser_extras.h
+++ b/src/compiler/glsl/glsl_parser_extras.h
@@ -765,6 +765,8 @@ struct _mesa_glsl_parse_state {
bool MESA_shader_framebuffer_fetch_non_coherent_warn;
bool MESA_shader_integer_functions_enable;
bool MESA_shader_integer_functions_warn;
+ bool NV_image_formats_enable;
+ bool NV_image_formats_warn;
/*@}*/
/** Extensions supported by the OpenGL implementation. */