glrenderer: Move ProgramState into Program

There is no real reason to have this on the side indexed via the
index, as it is stored next to each other anyway. Plus, storing them
together lets use use `Program` structures not in the array.
This commit is contained in:
Alexander Larsson 2020-09-18 09:15:03 +02:00
parent e29c586b7c
commit 6887d0ce24
3 changed files with 60 additions and 59 deletions

View File

@ -2919,7 +2919,7 @@ gsk_gl_renderer_programs_new (void)
programs->ref_count = 1; programs->ref_count = 1;
for (i = 0; i < GL_N_PROGRAMS; i ++) for (i = 0; i < GL_N_PROGRAMS; i ++)
{ {
programs->state[i].opacity = 1.0f; programs->programs[i].state.opacity = 1.0f;
} }
return programs; return programs;
@ -2944,7 +2944,7 @@ gsk_gl_renderer_programs_unref (GskGLRendererPrograms *programs)
{ {
if (programs->programs[i].id > 0) if (programs->programs[i].id > 0)
glDeleteProgram (programs->programs[i].id); glDeleteProgram (programs->programs[i].id);
gsk_transform_unref (programs->state[i].modelview); gsk_transform_unref (programs->programs[i].state.modelview);
} }
g_free (programs); g_free (programs);
} }

View File

@ -60,7 +60,7 @@ get_current_program_state (RenderOpBuilder *builder)
if (!builder->current_program) if (!builder->current_program)
return NULL; return NULL;
return &builder->programs->state[builder->current_program->index]; return &builder->current_program->state;
} }
void void
@ -218,10 +218,10 @@ ops_free (RenderOpBuilder *builder)
void void
ops_set_program (RenderOpBuilder *builder, ops_set_program (RenderOpBuilder *builder,
const Program *program) Program *program)
{ {
OpProgram *op; OpProgram *op;
ProgramState *program_state; ProgramState *program_state = NULL;
if (builder->current_program == program) if (builder->current_program == program)
return; return;
@ -231,7 +231,7 @@ ops_set_program (RenderOpBuilder *builder,
builder->current_program = program; builder->current_program = program;
program_state = &builder->programs->state[program->index]; program_state = &program->state;
if (memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0) if (memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0)
{ {

View File

@ -31,6 +31,57 @@ typedef struct
OpsMatrixMetadata metadata; OpsMatrixMetadata metadata;
} MatrixStackEntry; } MatrixStackEntry;
typedef struct
{
GskTransform *modelview;
GskRoundedRect clip;
graphene_matrix_t projection;
int source_texture;
graphene_rect_t viewport;
float opacity;
/* Per-program state */
union {
GdkRGBA color;
struct {
graphene_matrix_t matrix;
graphene_vec4_t offset;
} color_matrix;
struct {
float widths[4];
GdkRGBA color;
GskRoundedRect outline;
} border;
struct {
GskRoundedRect outline;
float dx;
float dy;
float spread;
GdkRGBA color;
} inset_shadow;
struct {
GskRoundedRect outline;
float dx;
float dy;
float spread;
GdkRGBA color;
} unblurred_outset_shadow;
struct {
int n_color_stops;
GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float start_point[2];
float end_point[2];
} linear_gradient;
struct {
int n_color_stops;
GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float center[2];
float start;
float end;
float radius[2]; /* h/v */
} radial_gradient;
};
} ProgramState;
struct _Program struct _Program
{ {
int index; /* Into the renderer's program array */ int index; /* Into the renderer's program array */
@ -109,59 +160,9 @@ struct _Program
int texture_rect_location; int texture_rect_location;
} repeat; } repeat;
}; };
ProgramState state;
}; };
typedef struct
{
GskTransform *modelview;
GskRoundedRect clip;
graphene_matrix_t projection;
int source_texture;
graphene_rect_t viewport;
float opacity;
/* Per-program state */
union {
GdkRGBA color;
struct {
graphene_matrix_t matrix;
graphene_vec4_t offset;
} color_matrix;
struct {
float widths[4];
GdkRGBA color;
GskRoundedRect outline;
} border;
struct {
GskRoundedRect outline;
float dx;
float dy;
float spread;
GdkRGBA color;
} inset_shadow;
struct {
GskRoundedRect outline;
float dx;
float dy;
float spread;
GdkRGBA color;
} unblurred_outset_shadow;
struct {
int n_color_stops;
GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float start_point[2];
float end_point[2];
} linear_gradient;
struct {
int n_color_stops;
GskColorStop color_stops[GL_MAX_GRADIENT_STOPS];
float center[2];
float start;
float end;
float radius[2]; /* h/v */
} radial_gradient;
};
} ProgramState;
typedef struct { typedef struct {
int ref_count; int ref_count;
union { union {
@ -189,7 +190,7 @@ typedef struct {
typedef struct typedef struct
{ {
GskGLRendererPrograms *programs; GskGLRendererPrograms *programs;
const Program *current_program; Program *current_program;
int current_render_target; int current_render_target;
int current_texture; int current_texture;
@ -236,7 +237,7 @@ void ops_pop_modelview (RenderOpBuilder *builder);
float ops_get_scale (const RenderOpBuilder *builder); float ops_get_scale (const RenderOpBuilder *builder);
void ops_set_program (RenderOpBuilder *builder, void ops_set_program (RenderOpBuilder *builder,
const Program *program); Program *program);
void ops_push_clip (RenderOpBuilder *builder, void ops_push_clip (RenderOpBuilder *builder,
const GskRoundedRect *clip); const GskRoundedRect *clip);