glsl: add NV_viewport_array2 support
This enables gl_Layer/gl_ViewportIndex when the ext is enabled, as well as adding the new gl_ViewportMask[] array and viewport_relative layout qualifier for gl_Layer. Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Acked-by: Marek Olšák <marek.olsak@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/4529>
This commit is contained in:
@@ -1097,15 +1097,32 @@ builtin_variable_generator::generate_vs_special_vars()
|
||||
add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
|
||||
}
|
||||
if (state->AMD_vertex_shader_layer_enable ||
|
||||
state->ARB_shader_viewport_layer_array_enable) {
|
||||
state->ARB_shader_viewport_layer_array_enable ||
|
||||
state->NV_viewport_array2_enable) {
|
||||
var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (state->AMD_vertex_shader_viewport_index_enable ||
|
||||
state->ARB_shader_viewport_layer_array_enable) {
|
||||
state->ARB_shader_viewport_layer_array_enable ||
|
||||
state->NV_viewport_array2_enable) {
|
||||
var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (state->NV_viewport_array2_enable) {
|
||||
/* From the NV_viewport_array2 specification:
|
||||
*
|
||||
* "The variable gl_ViewportMask[] is available as an output variable
|
||||
* in the VTG languages. The array has ceil(v/32) elements where v is
|
||||
* the maximum number of viewports supported by the implementation."
|
||||
*
|
||||
* Since no drivers expose more than 16 viewports, we can simply set the
|
||||
* array size to 1 rather than computing it and dealing with varying
|
||||
* slot complication.
|
||||
*/
|
||||
var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
|
||||
"gl_ViewportMask");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (compatibility) {
|
||||
add_input(VERT_ATTRIB_POS, vec4_t, "gl_Vertex");
|
||||
add_input(VERT_ATTRIB_NORMAL, vec3_t, "gl_Normal");
|
||||
@@ -1155,6 +1172,17 @@ builtin_variable_generator::generate_tcs_special_vars()
|
||||
add_output(bbox_slot, array(vec4_t, 2), GLSL_PRECISION_HIGH,
|
||||
"gl_BoundingBox")->data.patch = 1;
|
||||
}
|
||||
|
||||
/* NOTE: These are completely pointless. Writing these will never go
|
||||
* anywhere. But the specs demands it. So we add them with a slot of -1,
|
||||
* which makes the data go nowhere.
|
||||
*/
|
||||
if (state->NV_viewport_array2_enable) {
|
||||
add_output(-1, int_t, "gl_Layer");
|
||||
add_output(-1, int_t, "gl_ViewportIndex");
|
||||
add_output(-1, array(int_t, 1), "gl_ViewportMask");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1183,12 +1211,18 @@ builtin_variable_generator::generate_tes_special_vars()
|
||||
add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
|
||||
GLSL_PRECISION_HIGH, "gl_TessLevelInner");
|
||||
}
|
||||
if (state->ARB_shader_viewport_layer_array_enable) {
|
||||
if (state->ARB_shader_viewport_layer_array_enable ||
|
||||
state->NV_viewport_array2_enable) {
|
||||
var = add_output(VARYING_SLOT_LAYER, int_t, "gl_Layer");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (state->NV_viewport_array2_enable) {
|
||||
var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
|
||||
"gl_ViewportMask");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1208,6 +1242,11 @@ builtin_variable_generator::generate_gs_special_vars()
|
||||
"gl_ViewportIndex");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (state->NV_viewport_array2_enable) {
|
||||
var = add_output(VARYING_SLOT_VIEWPORT_MASK, array(int_t, 1),
|
||||
"gl_ViewportMask");
|
||||
var->data.interpolation = INTERP_MODE_FLAT;
|
||||
}
|
||||
if (state->is_version(400, 320) || state->ARB_gpu_shader5_enable ||
|
||||
state->OES_geometry_shader_enable || state->EXT_geometry_shader_enable) {
|
||||
add_system_value(SYSTEM_VALUE_INVOCATION_ID, int_t, GLSL_PRECISION_HIGH,
|
||||
|
||||
Reference in New Issue
Block a user