Mesa (main): glsl: add language support for GL_ARM_shader_framebuffer_fetch_depth_stencil
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 22 05:02:10 UTC 2022
Module: Mesa
Branch: main
Commit: 959b7480388aa499c00fa2bd531cba92b7799c94
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=959b7480388aa499c00fa2bd531cba92b7799c94
Author: Pavel Asyutchenko <sventeam at yandex.ru>
Date: Wed Sep 1 23:26:12 2021 +0300
glsl: add language support for GL_ARM_shader_framebuffer_fetch_depth_stencil
This extension adds built-in variables gl_LastFragDepthARM and gl_LastFragStencilARM
which can be implemented almost the same as gl_LastFragData from color fetch extension.
Signed-off-by: Pavel Asyutchenko <sventeam at yandex.ru>
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13979>
---
src/compiler/glsl/ast_to_hir.cpp | 58 ++++++++++++++++++++++----------
src/compiler/glsl/builtin_variables.cpp | 16 +++++++++
src/compiler/glsl/glsl_parser_extras.cpp | 1 +
src/compiler/glsl/glsl_parser_extras.h | 7 ++++
src/compiler/glsl/ir.h | 7 ++++
5 files changed, 71 insertions(+), 18 deletions(-)
diff --git a/src/compiler/glsl/ast_to_hir.cpp b/src/compiler/glsl/ast_to_hir.cpp
index 2a93a7fd401..68eb84eba66 100644
--- a/src/compiler/glsl/ast_to_hir.cpp
+++ b/src/compiler/glsl/ast_to_hir.cpp
@@ -2066,17 +2066,30 @@ ast_expression::do_hir(exec_list *instructions,
this->primary_expression.identifier);
}
- /* From the EXT_shader_framebuffer_fetch spec:
- *
- * "Unless the GL_EXT_shader_framebuffer_fetch extension has been
- * enabled in addition, it's an error to use gl_LastFragData if it
- * hasn't been explicitly redeclared with layout(noncoherent)."
- */
- if (var->data.fb_fetch_output && var->data.memory_coherent &&
- !state->EXT_shader_framebuffer_fetch_enable) {
- _mesa_glsl_error(&loc, state,
- "invalid use of framebuffer fetch output not "
- "qualified with layout(noncoherent)");
+ if (var->is_fb_fetch_color_output()) {
+ /* From the EXT_shader_framebuffer_fetch spec:
+ *
+ * "Unless the GL_EXT_shader_framebuffer_fetch extension has been
+ * enabled in addition, it's an error to use gl_LastFragData if it
+ * hasn't been explicitly redeclared with layout(noncoherent)."
+ */
+ if (var->data.memory_coherent && !state->EXT_shader_framebuffer_fetch_enable) {
+ _mesa_glsl_error(&loc, state,
+ "invalid use of framebuffer fetch output not "
+ "qualified with layout(noncoherent)");
+ }
+ } else if (var->data.fb_fetch_output) {
+ /* From the ARM_shader_framebuffer_fetch_depth_stencil spec:
+ *
+ * "It is not legal for a fragment shader to read from gl_LastFragDepthARM
+ * and gl_LastFragStencilARM if the early_fragment_tests layout qualifier
+ * is specified. This will result in a compile-time error."
+ */
+ if (state->fs_early_fragment_tests) {
+ _mesa_glsl_error(&loc, state,
+ "invalid use of depth or stencil fetch "
+ "with early fragment tests enabled");
+ }
}
} else {
@@ -4118,16 +4131,25 @@ apply_type_qualifier_to_variable(const struct ast_type_qualifier *qual,
else if (qual->flags.q.shared_storage)
var->data.mode = ir_var_shader_shared;
- if (!is_parameter && state->has_framebuffer_fetch() &&
- state->stage == MESA_SHADER_FRAGMENT) {
- if (state->is_version(130, 300))
- var->data.fb_fetch_output = qual->flags.q.in && qual->flags.q.out;
- else
- var->data.fb_fetch_output = (strcmp(var->name, "gl_LastFragData") == 0);
+ if (!is_parameter && state->stage == MESA_SHADER_FRAGMENT) {
+ if (state->has_framebuffer_fetch()) {
+ if (state->is_version(130, 300))
+ var->data.fb_fetch_output = qual->flags.q.in && qual->flags.q.out;
+ else
+ var->data.fb_fetch_output = (strcmp(var->name, "gl_LastFragData") == 0);
+ }
+
+ if (state->has_framebuffer_fetch_zs() &&
+ (strcmp(var->name, "gl_LastFragDepthARM") == 0 ||
+ strcmp(var->name, "gl_LastFragStencilARM") == 0)) {
+ var->data.fb_fetch_output = 1;
+ }
}
- if (var->data.fb_fetch_output) {
+ if (var->data.fb_fetch_output)
var->data.assigned = true;
+
+ if (var->is_fb_fetch_color_output()) {
var->data.memory_coherent = !qual->flags.q.non_coherent;
/* From the EXT_shader_framebuffer_fetch spec:
diff --git a/src/compiler/glsl/builtin_variables.cpp b/src/compiler/glsl/builtin_variables.cpp
index 7afb013b8e3..4aed31d8057 100644
--- a/src/compiler/glsl/builtin_variables.cpp
+++ b/src/compiler/glsl/builtin_variables.cpp
@@ -1368,6 +1368,22 @@ builtin_variable_generator::generate_fs_special_vars()
var->data.memory_coherent = 1;
}
+ if (state->has_framebuffer_fetch_zs()) {
+ ir_variable *const depth_var =
+ add_output(FRAG_RESULT_DEPTH, float_t,
+ GLSL_PRECISION_HIGH, "gl_LastFragDepthARM");
+ depth_var->data.read_only = 1;
+ depth_var->data.fb_fetch_output = 1;
+ depth_var->data.memory_coherent = 1;
+
+ ir_variable *const stencil_var =
+ add_output(FRAG_RESULT_STENCIL, int_t,
+ GLSL_PRECISION_LOW, "gl_LastFragStencilARM");
+ stencil_var->data.read_only = 1;
+ stencil_var->data.fb_fetch_output = 1;
+ stencil_var->data.memory_coherent = 1;
+ }
+
if (state->es_shader && state->language_version == 100 && state->EXT_blend_func_extended_enable) {
add_index_output(FRAG_RESULT_COLOR, 1, vec4_t,
GLSL_PRECISION_MEDIUM, "gl_SecondaryFragColorEXT");
diff --git a/src/compiler/glsl/glsl_parser_extras.cpp b/src/compiler/glsl/glsl_parser_extras.cpp
index e579cf54462..5f8eb70b459 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -744,6 +744,7 @@ static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
EXT(AMD_vertex_shader_layer),
EXT(AMD_vertex_shader_viewport_index),
EXT(ANDROID_extension_pack_es31a),
+ EXT(ARM_shader_framebuffer_fetch_depth_stencil),
EXT(EXT_blend_func_extended),
EXT(EXT_demote_to_helper_invocation),
EXT(EXT_frag_depth),
diff --git a/src/compiler/glsl/glsl_parser_extras.h b/src/compiler/glsl/glsl_parser_extras.h
index e35ab6948d7..45ed7ad87bd 100644
--- a/src/compiler/glsl/glsl_parser_extras.h
+++ b/src/compiler/glsl/glsl_parser_extras.h
@@ -329,6 +329,11 @@ struct _mesa_glsl_parse_state {
EXT_shader_framebuffer_fetch_non_coherent_enable;
}
+ bool has_framebuffer_fetch_zs() const
+ {
+ return ARM_shader_framebuffer_fetch_depth_stencil_enable;
+ }
+
bool has_texture_cube_map_array() const
{
return ARB_texture_cube_map_array_enable ||
@@ -827,6 +832,8 @@ struct _mesa_glsl_parse_state {
bool AMD_vertex_shader_viewport_index_warn;
bool ANDROID_extension_pack_es31a_enable;
bool ANDROID_extension_pack_es31a_warn;
+ bool ARM_shader_framebuffer_fetch_depth_stencil_enable;
+ bool ARM_shader_framebuffer_fetch_depth_stencil_warn;
bool EXT_blend_func_extended_enable;
bool EXT_blend_func_extended_warn;
bool EXT_clip_cull_distance_enable;
diff --git a/src/compiler/glsl/ir.h b/src/compiler/glsl/ir.h
index 0b6a773a95f..d6abd843813 100644
--- a/src/compiler/glsl/ir.h
+++ b/src/compiler/glsl/ir.h
@@ -612,6 +612,13 @@ public:
this->name != this->name_storage;
}
+ inline bool is_fb_fetch_color_output() const
+ {
+ return this->data.fb_fetch_output &&
+ this->data.location != FRAG_RESULT_DEPTH &&
+ this->data.location != FRAG_RESULT_STENCIL;
+ }
+
/**
* Enable emitting extension warnings for this variable
*/
More information about the mesa-commit
mailing list