gallium: add TGSI property NEXT_SHADER
Radeonsi needs to know which shader stage will execute after a shader in order to make the best decision about which shader variant to compile first. This is only set for VS and TES, because we don't need it elsewhere. VS has 3 variants: - next shader is FS - next shader is GS - next shader is TCS TES has 2 variants: - next shader is FS - next shader is GS Currently, radeonsi always assumes the next shader is FS, which is suboptimal, since st/mesa always knows which shader is next if the GLSL program is not a "separate shader". By default, ureg always sets "next shader is FS". Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
This commit is contained in:
@@ -145,6 +145,7 @@ const char *tgsi_property_names[TGSI_PROPERTY_COUNT] =
|
|||||||
"NUM_CLIPDIST_ENABLED",
|
"NUM_CLIPDIST_ENABLED",
|
||||||
"NUM_CULLDIST_ENABLED",
|
"NUM_CULLDIST_ENABLED",
|
||||||
"FS_EARLY_DEPTH_STENCIL",
|
"FS_EARLY_DEPTH_STENCIL",
|
||||||
|
"NEXT_SHADER",
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *tgsi_return_type_names[TGSI_RETURN_TYPE_COUNT] =
|
const char *tgsi_return_type_names[TGSI_RETURN_TYPE_COUNT] =
|
||||||
|
@@ -101,6 +101,7 @@ struct ureg_program
|
|||||||
{
|
{
|
||||||
unsigned processor;
|
unsigned processor;
|
||||||
bool supports_any_inout_decl_range;
|
bool supports_any_inout_decl_range;
|
||||||
|
int next_shader_processor;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
unsigned semantic_name;
|
unsigned semantic_name;
|
||||||
@@ -1966,6 +1967,16 @@ const struct tgsi_token *ureg_finalize( struct ureg_program *ureg )
|
|||||||
{
|
{
|
||||||
const struct tgsi_token *tokens;
|
const struct tgsi_token *tokens;
|
||||||
|
|
||||||
|
switch (ureg->processor) {
|
||||||
|
case TGSI_PROCESSOR_VERTEX:
|
||||||
|
case TGSI_PROCESSOR_TESS_EVAL:
|
||||||
|
ureg_property(ureg, TGSI_PROPERTY_NEXT_SHADER,
|
||||||
|
ureg->next_shader_processor == -1 ?
|
||||||
|
TGSI_PROCESSOR_FRAGMENT :
|
||||||
|
ureg->next_shader_processor);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
emit_header( ureg );
|
emit_header( ureg );
|
||||||
emit_decls( ureg );
|
emit_decls( ureg );
|
||||||
copy_instructions( ureg );
|
copy_instructions( ureg );
|
||||||
@@ -2079,6 +2090,7 @@ ureg_create_with_screen(unsigned processor, struct pipe_screen *screen)
|
|||||||
screen->get_shader_param(screen,
|
screen->get_shader_param(screen,
|
||||||
util_pipe_shader_from_tgsi_processor(processor),
|
util_pipe_shader_from_tgsi_processor(processor),
|
||||||
PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE) != 0;
|
PIPE_SHADER_CAP_TGSI_ANY_INOUT_DECL_RANGE) != 0;
|
||||||
|
ureg->next_shader_processor = -1;
|
||||||
|
|
||||||
for (i = 0; i < Elements(ureg->properties); i++)
|
for (i = 0; i < Elements(ureg->properties); i++)
|
||||||
ureg->properties[i] = ~0;
|
ureg->properties[i] = ~0;
|
||||||
@@ -2108,6 +2120,13 @@ no_ureg:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_set_next_shader_processor(struct ureg_program *ureg, unsigned processor)
|
||||||
|
{
|
||||||
|
ureg->next_shader_processor = processor;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
unsigned
|
unsigned
|
||||||
ureg_get_nr_outputs( const struct ureg_program *ureg )
|
ureg_get_nr_outputs( const struct ureg_program *ureg )
|
||||||
{
|
{
|
||||||
|
@@ -114,6 +114,8 @@ ureg_create_shader( struct ureg_program *,
|
|||||||
struct pipe_context *pipe,
|
struct pipe_context *pipe,
|
||||||
const struct pipe_stream_output_info *so );
|
const struct pipe_stream_output_info *so );
|
||||||
|
|
||||||
|
void
|
||||||
|
ureg_set_next_shader_processor(struct ureg_program *ureg, unsigned processor);
|
||||||
|
|
||||||
/* Alternately, return the built token stream and hand ownership of
|
/* Alternately, return the built token stream and hand ownership of
|
||||||
* that memory to the caller:
|
* that memory to the caller:
|
||||||
|
@@ -3213,6 +3213,14 @@ Whether depth test, stencil test, and occlusion query should run before
|
|||||||
the fragment shader (regardless of fragment shader side effects). Corresponds
|
the fragment shader (regardless of fragment shader side effects). Corresponds
|
||||||
to GLSL early_fragment_tests.
|
to GLSL early_fragment_tests.
|
||||||
|
|
||||||
|
NEXT_SHADER
|
||||||
|
"""""""""""
|
||||||
|
|
||||||
|
Which shader stage will MOST LIKELY follow after this shader when the shader
|
||||||
|
is bound. This is only a hint to the driver and doesn't have to be precise.
|
||||||
|
Only set for VS and TES.
|
||||||
|
|
||||||
|
|
||||||
Texture Sampling and Texture Formats
|
Texture Sampling and Texture Formats
|
||||||
------------------------------------
|
------------------------------------
|
||||||
|
|
||||||
|
@@ -278,7 +278,8 @@ union tgsi_immediate_data
|
|||||||
#define TGSI_PROPERTY_NUM_CLIPDIST_ENABLED 15
|
#define TGSI_PROPERTY_NUM_CLIPDIST_ENABLED 15
|
||||||
#define TGSI_PROPERTY_NUM_CULLDIST_ENABLED 16
|
#define TGSI_PROPERTY_NUM_CULLDIST_ENABLED 16
|
||||||
#define TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL 17
|
#define TGSI_PROPERTY_FS_EARLY_DEPTH_STENCIL 17
|
||||||
#define TGSI_PROPERTY_COUNT 18
|
#define TGSI_PROPERTY_NEXT_SHADER 18
|
||||||
|
#define TGSI_PROPERTY_COUNT 19
|
||||||
|
|
||||||
struct tgsi_property {
|
struct tgsi_property {
|
||||||
unsigned Type : 4; /**< TGSI_TOKEN_TYPE_PROPERTY */
|
unsigned Type : 4; /**< TGSI_TOKEN_TYPE_PROPERTY */
|
||||||
|
Reference in New Issue
Block a user