Просмотр исходного кода

glsl/parser: Handle the early_fragment_tests input layout qualifier.

v2: Only allow the early_fragment_tests qualifier in fragment shaders.

Reviewed-by: Paul Berry <stereotype441@gmail.com>
tags/mesa-10.2-rc1
Francisco Jerez 11 лет назад
Родитель
Сommit
fcd869ed56
3 измененных файлов: 20 добавлений и 1 удалений
  1. 17
    1
      src/glsl/glsl_parser.yy
  2. 1
    0
      src/glsl/glsl_parser_extras.cpp
  3. 2
    0
      src/glsl/glsl_parser_extras.h

+ 17
- 1
src/glsl/glsl_parser.yy Просмотреть файл

@@ -1231,6 +1231,15 @@ layout_qualifier_id:
}
}

/* Layout qualifiers for ARB_shader_image_load_store. */
if (state->ARB_shader_image_load_store_enable ||
state->is_version(420, 0)) {
if (!$$.flags.i &&
match_layout_qualifier($1, "early_fragment_tests", state) == 0) {
$$.flags.q.early_fragment_tests = 1;
}
}

if (!$$.flags.i) {
_mesa_glsl_error(& @1, state, "unrecognized layout identifier "
"`%s'", $1);
@@ -2388,6 +2397,13 @@ layout_defaults:
}
}
break;
case MESA_SHADER_FRAGMENT:
if ($1.flags.q.early_fragment_tests) {
state->early_fragment_tests = true;
} else {
_mesa_glsl_error(& @1, state, "invalid input layout qualifier");
}
break;
case MESA_SHADER_COMPUTE: {
if ($1.flags.q.local_size == 0) {
_mesa_glsl_error(& @1, state,
@@ -2409,7 +2425,7 @@ layout_defaults:
default:
_mesa_glsl_error(& @1, state,
"input layout qualifiers only valid in "
"geometry and compute shaders");
"geometry, fragment and compute shaders");
break;
}
}

+ 1
- 0
src/glsl/glsl_parser_extras.cpp Просмотреть файл

@@ -197,6 +197,7 @@ _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
this->gs_input_prim_type = GL_POINTS;
this->gs_input_size = 0;
this->out_qualifier = new(this) ast_type_qualifier();
this->early_fragment_tests = false;
memset(this->atomic_counter_offsets, 0,
sizeof(this->atomic_counter_offsets));
}

+ 2
- 0
src/glsl/glsl_parser_extras.h Просмотреть файл

@@ -395,6 +395,8 @@ struct _mesa_glsl_parse_state {
*/
unsigned gs_input_size;

bool early_fragment_tests;

/** Atomic counter offsets by binding */
unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS];
};

Загрузка…
Отмена
Сохранить