mesa: add tessellation shader getters (v3)
Tessellation dependencies added by Marek. v2: require tessellation in addition to atomics/images for some glGet queries Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
cb0c12512c
commit
6823d713c6
|
@ -149,6 +149,8 @@ enum value_extra {
|
|||
EXTRA_EXT_UBO_GS4,
|
||||
EXTRA_EXT_ATOMICS_GS4,
|
||||
EXTRA_EXT_SHADER_IMAGE_GS4,
|
||||
EXTRA_EXT_ATOMICS_TESS,
|
||||
EXTRA_EXT_SHADER_IMAGE_TESS,
|
||||
};
|
||||
|
||||
#define NO_EXTRA NULL
|
||||
|
@ -349,6 +351,16 @@ static const int extra_ARB_shader_image_load_store_and_geometry_shader[] = {
|
|||
EXTRA_END
|
||||
};
|
||||
|
||||
static const int extra_ARB_shader_atomic_counters_and_tessellation[] = {
|
||||
EXTRA_EXT_ATOMICS_TESS,
|
||||
EXTRA_END
|
||||
};
|
||||
|
||||
static const int extra_ARB_shader_image_load_store_and_tessellation[] = {
|
||||
EXTRA_EXT_SHADER_IMAGE_TESS,
|
||||
EXTRA_END
|
||||
};
|
||||
|
||||
static const int extra_ARB_draw_indirect_es31[] = {
|
||||
EXT(ARB_draw_indirect),
|
||||
EXTRA_API_ES31,
|
||||
|
@ -401,6 +413,7 @@ EXTRA_EXT(ARB_explicit_uniform_location);
|
|||
EXTRA_EXT(ARB_clip_control);
|
||||
EXTRA_EXT(EXT_polygon_offset_clamp);
|
||||
EXTRA_EXT(ARB_framebuffer_no_attachments);
|
||||
EXTRA_EXT(ARB_tessellation_shader);
|
||||
|
||||
static const int
|
||||
extra_ARB_color_buffer_float_or_glcore[] = {
|
||||
|
@ -1149,6 +1162,16 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
|
|||
api_found = (ctx->Extensions.ARB_shader_image_load_store &&
|
||||
_mesa_has_geometry_shaders(ctx));
|
||||
break;
|
||||
case EXTRA_EXT_ATOMICS_TESS:
|
||||
api_check = GL_TRUE;
|
||||
api_found = ctx->Extensions.ARB_shader_atomic_counters &&
|
||||
_mesa_has_tessellation(ctx);
|
||||
break;
|
||||
case EXTRA_EXT_SHADER_IMAGE_TESS:
|
||||
api_check = GL_TRUE;
|
||||
api_found = ctx->Extensions.ARB_shader_image_load_store &&
|
||||
_mesa_has_tessellation(ctx);
|
||||
break;
|
||||
case EXTRA_END:
|
||||
break;
|
||||
default: /* *e is a offset into the extension struct */
|
||||
|
|
|
@ -824,6 +824,34 @@ descriptor=[
|
|||
[ "MIN_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MinFragmentInterpolationOffset), extra_ARB_gpu_shader5" ],
|
||||
[ "MAX_FRAGMENT_INTERPOLATION_OFFSET", "CONTEXT_FLOAT(Const.MaxFragmentInterpolationOffset), extra_ARB_gpu_shader5" ],
|
||||
[ "FRAGMENT_INTERPOLATION_OFFSET_BITS", "CONST(FRAGMENT_INTERPOLATION_OFFSET_BITS), extra_ARB_gpu_shader5" ],
|
||||
|
||||
# GL_ARB_tessellation_shader
|
||||
[ "PATCH_VERTICES", "CONTEXT_INT(TessCtrlProgram.patch_vertices), extra_ARB_tessellation_shader" ],
|
||||
[ "PATCH_DEFAULT_OUTER_LEVEL", "CONTEXT_FLOAT4(TessCtrlProgram.patch_default_outer_level), extra_ARB_tessellation_shader" ],
|
||||
[ "PATCH_DEFAULT_INNER_LEVEL", "CONTEXT_FLOAT2(TessCtrlProgram.patch_default_inner_level), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_GEN_LEVEL", "CONTEXT_INT(Const.MaxTessGenLevel), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_PATCH_VERTICES", "CONTEXT_INT(Const.MaxPatchVertices), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxUniformComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_EVALUATION_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxUniformComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxTextureImageUnits), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxTextureImageUnits), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_OUTPUT_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxOutputComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_PATCH_COMPONENTS", "CONTEXT_INT(Const.MaxTessPatchComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS", "CONTEXT_INT(Const.MaxTessControlTotalOutputComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_EVALUATION_OUTPUT_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxOutputComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_INPUT_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxInputComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_EVALUATION_INPUT_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxInputComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_CONTROL_UNIFORM_BLOCKS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxUniformBlocks), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_TESS_EVALUATION_UNIFORM_BLOCKS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxUniformBlocks), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxCombinedUniformComponents), extra_ARB_tessellation_shader" ],
|
||||
[ "MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxCombinedUniformComponents), extra_ARB_tessellation_shader" ],
|
||||
# Dependencies on GL_ARB_tessellation_shader
|
||||
[ "MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicBuffers), extra_ARB_shader_atomic_counters_and_tessellation" ],
|
||||
[ "MAX_TESS_CONTROL_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxAtomicCounters), extra_ARB_shader_atomic_counters_and_tessellation" ],
|
||||
[ "MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicBuffers), extra_ARB_shader_atomic_counters_and_tessellation" ],
|
||||
[ "MAX_TESS_EVALUATION_ATOMIC_COUNTERS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxAtomicCounters), extra_ARB_shader_atomic_counters_and_tessellation" ],
|
||||
[ "MAX_TESS_CONTROL_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxImageUniforms), extra_ARB_shader_image_load_store_and_tessellation"],
|
||||
[ "MAX_TESS_EVALUATION_IMAGE_UNIFORMS", "CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxImageUniforms), extra_ARB_shader_image_load_store_and_tessellation"],
|
||||
]}
|
||||
|
||||
]
|
||||
|
|
|
@ -517,6 +517,57 @@ check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if a tessellation control shader query is valid at this time.
|
||||
* If not, report an error and return false.
|
||||
*
|
||||
* From GL 4.0 section 6.1.12 (Shader and Program Queries):
|
||||
*
|
||||
* "If TESS_CONTROL_OUTPUT_VERTICES is queried for a program which has
|
||||
* not been linked successfully, or which does not contain objects to
|
||||
* form a tessellation control shader, then an INVALID_OPERATION error is
|
||||
* generated."
|
||||
*/
|
||||
static bool
|
||||
check_tcs_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
|
||||
{
|
||||
if (shProg->LinkStatus &&
|
||||
shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL] != NULL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION,
|
||||
"glGetProgramv(linked tessellation control shader required)");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if a tessellation evaluation shader query is valid at this time.
|
||||
* If not, report an error and return false.
|
||||
*
|
||||
* From GL 4.0 section 6.1.12 (Shader and Program Queries):
|
||||
*
|
||||
* "If any of the pname values in this paragraph are queried for a program
|
||||
* which has not been linked successfully, or which does not contain
|
||||
* objects to form a tessellation evaluation shader, then an
|
||||
* INVALID_OPERATION error is generated."
|
||||
*
|
||||
*/
|
||||
static bool
|
||||
check_tes_query(struct gl_context *ctx, const struct gl_shader_program *shProg)
|
||||
{
|
||||
if (shProg->LinkStatus &&
|
||||
shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL] != NULL) {
|
||||
return true;
|
||||
}
|
||||
|
||||
_mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramv(linked tessellation "
|
||||
"evaluation shader required)");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* glGetProgramiv() - get shader program state.
|
||||
* Note that this is for GLSL shader programs, not ARB vertex/fragment
|
||||
|
@ -540,6 +591,7 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
|
|||
* and GL 3.2) are available in this context
|
||||
*/
|
||||
const bool has_core_gs = _mesa_has_geometry_shaders(ctx);
|
||||
const bool has_tess = _mesa_has_tessellation(ctx);
|
||||
|
||||
/* Are uniform buffer objects available in this context?
|
||||
*/
|
||||
|
@ -718,6 +770,38 @@ get_programiv(struct gl_context *ctx, GLuint program, GLenum pname,
|
|||
case GL_PROGRAM_SEPARABLE:
|
||||
*params = shProg->SeparateShader;
|
||||
return;
|
||||
|
||||
/* ARB_tessellation_shader */
|
||||
case GL_TESS_CONTROL_OUTPUT_VERTICES:
|
||||
if (!has_tess)
|
||||
break;
|
||||
if (check_tcs_query(ctx, shProg))
|
||||
*params = shProg->TessCtrl.VerticesOut;
|
||||
return;
|
||||
case GL_TESS_GEN_MODE:
|
||||
if (!has_tess)
|
||||
break;
|
||||
if (check_tes_query(ctx, shProg))
|
||||
*params = shProg->TessEval.PrimitiveMode;
|
||||
return;
|
||||
case GL_TESS_GEN_SPACING:
|
||||
if (!has_tess)
|
||||
break;
|
||||
if (check_tes_query(ctx, shProg))
|
||||
*params = shProg->TessEval.Spacing;
|
||||
return;
|
||||
case GL_TESS_GEN_VERTEX_ORDER:
|
||||
if (!has_tess)
|
||||
break;
|
||||
if (check_tes_query(ctx, shProg))
|
||||
*params = shProg->TessEval.VertexOrder;
|
||||
return;
|
||||
case GL_TESS_GEN_POINT_MODE:
|
||||
if (!has_tess)
|
||||
break;
|
||||
if (check_tes_query(ctx, shProg))
|
||||
*params = shProg->TessEval.PointMode;
|
||||
return;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue