compiler: Add SYSTEM_VALUE_IS_INDEXED_DRAW and instrinsics

This VS system value contains if the draw command used to start the
rendering was an indexed draw command or a non-indexed one
(~0/0 respectively). Useful to calculate the gl_BaseVertex as:
(SYSTEM_VALUE_IS_INDEXED_DRAW & SYSTEM_VALUE_FIRST_VERTEX).

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Antia Puentes
2018-04-28 14:09:18 +02:00
parent 0737c1e3a6
commit 9e6b886cf2
5 changed files with 14 additions and 0 deletions

View File

@@ -1991,6 +1991,8 @@ nir_intrinsic_from_system_value(gl_system_value val)
return nir_intrinsic_load_base_instance; return nir_intrinsic_load_base_instance;
case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE: case SYSTEM_VALUE_VERTEX_ID_ZERO_BASE:
return nir_intrinsic_load_vertex_id_zero_base; return nir_intrinsic_load_vertex_id_zero_base;
case SYSTEM_VALUE_IS_INDEXED_DRAW:
return nir_intrinsic_load_is_indexed_draw;
case SYSTEM_VALUE_FIRST_VERTEX: case SYSTEM_VALUE_FIRST_VERTEX:
return nir_intrinsic_load_first_vertex; return nir_intrinsic_load_first_vertex;
case SYSTEM_VALUE_BASE_VERTEX: case SYSTEM_VALUE_BASE_VERTEX:
@@ -2070,6 +2072,8 @@ nir_system_value_from_intrinsic(nir_intrinsic_op intrin)
return SYSTEM_VALUE_VERTEX_ID_ZERO_BASE; return SYSTEM_VALUE_VERTEX_ID_ZERO_BASE;
case nir_intrinsic_load_first_vertex: case nir_intrinsic_load_first_vertex:
return SYSTEM_VALUE_FIRST_VERTEX; return SYSTEM_VALUE_FIRST_VERTEX;
case nir_intrinsic_load_is_indexed_draw:
return SYSTEM_VALUE_IS_INDEXED_DRAW;
case nir_intrinsic_load_base_vertex: case nir_intrinsic_load_base_vertex:
return SYSTEM_VALUE_BASE_VERTEX; return SYSTEM_VALUE_BASE_VERTEX;
case nir_intrinsic_load_invocation_id: case nir_intrinsic_load_invocation_id:

View File

@@ -266,6 +266,7 @@ gather_intrinsic_info(nir_intrinsic_instr *instr, nir_shader *shader)
case nir_intrinsic_load_vertex_id_zero_base: case nir_intrinsic_load_vertex_id_zero_base:
case nir_intrinsic_load_base_vertex: case nir_intrinsic_load_base_vertex:
case nir_intrinsic_load_first_vertex: case nir_intrinsic_load_first_vertex:
case nir_intrinsic_load_is_indexed_draw:
case nir_intrinsic_load_base_instance: case nir_intrinsic_load_base_instance:
case nir_intrinsic_load_instance_id: case nir_intrinsic_load_instance_id:
case nir_intrinsic_load_sample_id: case nir_intrinsic_load_sample_id:

View File

@@ -414,6 +414,7 @@ system_value("front_face", 1)
system_value("vertex_id", 1) system_value("vertex_id", 1)
system_value("vertex_id_zero_base", 1) system_value("vertex_id_zero_base", 1)
system_value("first_vertex", 1) system_value("first_vertex", 1)
system_value("is_indexed_draw", 1)
system_value("base_vertex", 1) system_value("base_vertex", 1)
system_value("instance_id", 1) system_value("instance_id", 1)
system_value("base_instance", 1) system_value("base_instance", 1)

View File

@@ -217,6 +217,7 @@ gl_system_value_name(gl_system_value sysval)
ENUM(SYSTEM_VALUE_INSTANCE_INDEX), ENUM(SYSTEM_VALUE_INSTANCE_INDEX),
ENUM(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE), ENUM(SYSTEM_VALUE_VERTEX_ID_ZERO_BASE),
ENUM(SYSTEM_VALUE_FIRST_VERTEX), ENUM(SYSTEM_VALUE_FIRST_VERTEX),
ENUM(SYSTEM_VALUE_IS_INDEXED_DRAW),
ENUM(SYSTEM_VALUE_BASE_VERTEX), ENUM(SYSTEM_VALUE_BASE_VERTEX),
ENUM(SYSTEM_VALUE_BASE_INSTANCE), ENUM(SYSTEM_VALUE_BASE_INSTANCE),
ENUM(SYSTEM_VALUE_DRAW_ID), ENUM(SYSTEM_VALUE_DRAW_ID),

View File

@@ -517,6 +517,13 @@ typedef enum
*/ */
SYSTEM_VALUE_FIRST_VERTEX, SYSTEM_VALUE_FIRST_VERTEX,
/**
* If the Draw command used to start the rendering was an indexed draw
* or not (~0/0). Useful to calculate \c SYSTEM_VALUE_BASE_VERTEX as
* \c SYSTEM_VALUE_IS_INDEXED_DRAW & \c SYSTEM_VALUE_FIRST_VERTEX.
*/
SYSTEM_VALUE_IS_INDEXED_DRAW,
/** /**
* Value of \c baseinstance passed to instanced draw entry points * Value of \c baseinstance passed to instanced draw entry points
* *