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:
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user