st/mesa: translate geometry shaders into TGSI when we get them

Reviewed-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Tested-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
Marek Olšák
2015-10-05 03:26:48 +02:00
parent a907b5dd16
commit 897177020b
3 changed files with 30 additions and 15 deletions

View File

@@ -244,6 +244,8 @@ st_program_string_notify( struct gl_context *ctx,
struct st_geometry_program *stgp = (struct st_geometry_program *) prog; struct st_geometry_program *stgp = (struct st_geometry_program *) prog;
st_release_gp_variants(st, stgp); st_release_gp_variants(st, stgp);
if (!st_translate_geometry_program(st, stgp))
return false;
if (st->gp == stgp) if (st->gp == stgp)
st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM; st->dirty.st |= ST_NEW_GEOMETRY_PROGRAM;

View File

@@ -170,6 +170,11 @@ st_release_gp_variants(struct st_context *st, struct st_geometry_program *stgp)
} }
stgp->variants = NULL; stgp->variants = NULL;
if (stgp->tgsi.tokens) {
ureg_free_tokens(stgp->tgsi.tokens);
stgp->tgsi.tokens = NULL;
}
} }
@@ -1276,19 +1281,15 @@ st_translate_program_common(struct st_context *st,
/** /**
* Translate a geometry program to create a new variant. * Translate a geometry program to create a new variant.
*/ */
static struct st_gp_variant * bool
st_translate_geometry_program(struct st_context *st, st_translate_geometry_program(struct st_context *st,
struct st_geometry_program *stgp, struct st_geometry_program *stgp)
const struct st_gp_variant_key *key)
{ {
struct pipe_context *pipe = st->pipe;
struct ureg_program *ureg; struct ureg_program *ureg;
struct st_gp_variant *gpv;
struct pipe_shader_state state;
ureg = ureg_create_with_screen(TGSI_PROCESSOR_GEOMETRY, st->pipe->screen); ureg = ureg_create_with_screen(TGSI_PROCESSOR_GEOMETRY, st->pipe->screen);
if (ureg == NULL) if (ureg == NULL)
return NULL; return false;
ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType); ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType);
ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, stgp->Base.OutputType); ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, stgp->Base.OutputType);
@@ -1297,19 +1298,26 @@ st_translate_geometry_program(struct st_context *st,
ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, stgp->Base.Invocations); ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, stgp->Base.Invocations);
st_translate_program_common(st, &stgp->Base.Base, stgp->glsl_to_tgsi, ureg, st_translate_program_common(st, &stgp->Base.Base, stgp->glsl_to_tgsi, ureg,
TGSI_PROCESSOR_GEOMETRY, &state); TGSI_PROCESSOR_GEOMETRY, &stgp->tgsi);
return true;
}
static struct st_gp_variant *
st_create_gp_variant(struct st_context *st,
struct st_geometry_program *stgp,
const struct st_gp_variant_key *key)
{
struct pipe_context *pipe = st->pipe;
struct st_gp_variant *gpv;
gpv = CALLOC_STRUCT(st_gp_variant); gpv = CALLOC_STRUCT(st_gp_variant);
if (!gpv) { if (!gpv)
ureg_free_tokens(state.tokens);
return NULL; return NULL;
}
/* fill in new variant */ /* fill in new variant */
gpv->driver_shader = pipe->create_gs_state(pipe, &state); gpv->driver_shader = pipe->create_gs_state(pipe, &stgp->tgsi);
gpv->key = *key; gpv->key = *key;
ureg_free_tokens(state.tokens);
return gpv; return gpv;
} }
@@ -1333,7 +1341,7 @@ st_get_gp_variant(struct st_context *st,
if (!gpv) { if (!gpv) {
/* create new */ /* create new */
gpv = st_translate_geometry_program(st, stgp, key); gpv = st_create_gp_variant(st, stgp, key);
if (gpv) { if (gpv) {
/* insert into list */ /* insert into list */
gpv->next = stgp->variants; gpv->next = stgp->variants;

View File

@@ -200,6 +200,7 @@ struct st_gp_variant
struct st_geometry_program struct st_geometry_program
{ {
struct gl_geometry_program Base; /**< The Mesa geometry program */ struct gl_geometry_program Base; /**< The Mesa geometry program */
struct pipe_shader_state tgsi;
struct glsl_to_tgsi_visitor* glsl_to_tgsi; struct glsl_to_tgsi_visitor* glsl_to_tgsi;
struct st_gp_variant *variants; struct st_gp_variant *variants;
@@ -442,6 +443,10 @@ extern bool
st_translate_fragment_program(struct st_context *st, st_translate_fragment_program(struct st_context *st,
struct st_fragment_program *stfp); struct st_fragment_program *stfp);
extern bool
st_translate_geometry_program(struct st_context *st,
struct st_geometry_program *stgp);
extern void extern void
st_print_current_vertex_program(void); st_print_current_vertex_program(void);