add_const("gl_MaxGeometryAtomicCounters",
state->Const.MaxGeometryAtomicCounters);
}
- if (!state->es_shader) {
+ if (state->is_version(110, 320)) {
add_const("gl_MaxTessControlAtomicCounters",
state->Const.MaxTessControlAtomicCounters);
add_const("gl_MaxTessEvaluationAtomicCounters",
add_const("gl_MaxGeometryAtomicCounterBuffers",
state->Const.MaxGeometryAtomicCounterBuffers);
}
- if (!state->es_shader) {
+ if (state->is_version(110, 320)) {
add_const("gl_MaxTessControlAtomicCounterBuffers",
state->Const.MaxTessControlAtomicCounterBuffers);
add_const("gl_MaxTessEvaluationAtomicCounterBuffers",
add_system_value(SYSTEM_VALUE_BASE_INSTANCE, int_t, "gl_BaseInstanceARB");
add_system_value(SYSTEM_VALUE_DRAW_ID, int_t, "gl_DrawIDARB");
}
- if (state->AMD_vertex_shader_layer_enable) {
+ if (state->AMD_vertex_shader_layer_enable ||
+ state->ARB_shader_viewport_layer_array_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) {
+ if (state->AMD_vertex_shader_viewport_index_enable ||
+ state->ARB_shader_viewport_layer_array_enable) {
var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
var->data.interpolation = INTERP_MODE_FLAT;
}
"gl_TessLevelOuter")->data.patch = 1;
add_output(VARYING_SLOT_TESS_LEVEL_INNER, array(float_t, 2),
"gl_TessLevelInner")->data.patch = 1;
+ /* XXX What to do if multiple are flipped on? */
+ int bbox_slot = state->ctx->Const.NoPrimitiveBoundingBoxOutput ? -1 :
+ VARYING_SLOT_BOUNDING_BOX0;
+ if (state->EXT_primitive_bounding_box_enable)
+ add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxEXT")
+ ->data.patch = 1;
+ if (state->OES_primitive_bounding_box_enable)
+ add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBoxOES")
+ ->data.patch = 1;
+ if (state->is_version(0, 320) || state->ARB_ES3_2_compatibility_enable)
+ add_output(bbox_slot, array(vec4_t, 2), "gl_BoundingBox")
+ ->data.patch = 1;
}
void
builtin_variable_generator::generate_tes_special_vars()
{
+ ir_variable *var;
+
add_system_value(SYSTEM_VALUE_PRIMITIVE_ID, int_t, "gl_PrimitiveID");
add_system_value(SYSTEM_VALUE_VERTICES_IN, int_t, "gl_PatchVerticesIn");
add_system_value(SYSTEM_VALUE_TESS_COORD, vec3_t, "gl_TessCoord");
"gl_TessLevelOuter");
add_system_value(SYSTEM_VALUE_TESS_LEVEL_INNER, array(float_t, 2),
"gl_TessLevelInner");
+ if (state->ARB_shader_viewport_layer_array_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;
+ }
}
var = add_output(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
var->data.interpolation = INTERP_MODE_FLAT;
}
- if (state->is_version(400, 0) || state->ARB_gpu_shader5_enable)
+ 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, "gl_InvocationID");
+ }
/* Although gl_PrimitiveID appears in tessellation control and tessellation
* evaluation shaders, it has a different function there than it has in
array(vec4_t, state->Const.MaxDrawBuffers), "gl_FragData");
}
+ if (state->has_framebuffer_fetch() && !state->is_version(130, 300)) {
+ ir_variable *const var =
+ add_output(FRAG_RESULT_DATA0,
+ array(vec4_t, state->Const.MaxDrawBuffers),
+ "gl_LastFragData");
+ var->data.precision = GLSL_PRECISION_MEDIUM;
+ var->data.read_only = 1;
+ var->data.fb_fetch_output = 1;
+ }
+
if (state->es_shader && state->language_version == 100 && state->EXT_blend_func_extended_enable) {
- /* We make an assumption here that there will only ever be one dual-source draw buffer
- * In case this assumption is ever proven to be false, make sure to assert here
- * since we don't handle this case.
- * In practice, this issue will never arise since no hardware will support it.
- */
- assert(state->Const.MaxDualSourceDrawBuffers <= 1);
- add_index_output(FRAG_RESULT_DATA0, 1, vec4_t, "gl_SecondaryFragColorEXT");
+ add_index_output(FRAG_RESULT_COLOR, 1, vec4_t,
+ "gl_SecondaryFragColorEXT");
add_index_output(FRAG_RESULT_DATA0, 1,
array(vec4_t, state->Const.MaxDualSourceDrawBuffers),
"gl_SecondaryFragDataEXT");
add_system_value(SYSTEM_VALUE_SAMPLE_MASK_IN, array(int_t, 1), "gl_SampleMaskIn");
}
- if (state->is_version(430, 0) || state->ARB_fragment_layer_viewport_enable) {
+ if (state->is_version(430, 320) ||
+ state->ARB_fragment_layer_viewport_enable ||
+ state->OES_geometry_shader_enable ||
+ state->EXT_geometry_shader_enable) {
var = add_input(VARYING_SLOT_LAYER, int_t, "gl_Layer");
var->data.interpolation = INTERP_MODE_FLAT;
+ }
+
+ if (state->is_version(430, 0) ||
+ state->ARB_fragment_layer_viewport_enable) {
var = add_input(VARYING_SLOT_VIEWPORT, int_t, "gl_ViewportIndex");
var->data.interpolation = INTERP_MODE_FLAT;
}
if (!state->es_shader ||
state->stage == MESA_SHADER_VERTEX ||
(state->stage == MESA_SHADER_GEOMETRY &&
- state->OES_geometry_point_size_enable) ||
+ (state->OES_geometry_point_size_enable ||
+ state->EXT_geometry_point_size_enable)) ||
((state->stage == MESA_SHADER_TESS_CTRL ||
state->stage == MESA_SHADER_TESS_EVAL) &&
(state->OES_tessellation_point_size_enable ||