mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 18:18:06 +02:00
i915g: Switch to state atoms
This commit is contained in:
parent
ed675bb460
commit
e694f3fd48
5 changed files with 128 additions and 57 deletions
|
|
@ -35,16 +35,21 @@ struct i915_context;
|
|||
|
||||
|
||||
struct i915_tracked_state {
|
||||
const char *name;
|
||||
void (*update)(struct i915_context *);
|
||||
unsigned dirty;
|
||||
void (*update)( struct i915_context * );
|
||||
};
|
||||
|
||||
void i915_update_immediate( struct i915_context *i915 );
|
||||
void i915_update_dynamic( struct i915_context *i915 );
|
||||
void i915_update_derived( struct i915_context *i915 );
|
||||
void i915_update_samplers( struct i915_context *i915 );
|
||||
void i915_update_textures(struct i915_context *i915);
|
||||
extern struct i915_tracked_state i915_update_vertex_layout;
|
||||
|
||||
void i915_emit_hardware_state( struct i915_context *i915 );
|
||||
extern struct i915_tracked_state i915_hw_samplers;
|
||||
extern struct i915_tracked_state i915_hw_sampler_views;
|
||||
extern struct i915_tracked_state i915_hw_immediate;
|
||||
extern struct i915_tracked_state i915_hw_dynamic;
|
||||
extern struct i915_tracked_state i915_hw_fs;
|
||||
extern struct i915_tracked_state i915_hw_framebuffer;
|
||||
|
||||
void i915_update_derived(struct i915_context *i915);
|
||||
void i915_emit_hardware_state(struct i915_context *i915);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -36,11 +36,11 @@
|
|||
|
||||
|
||||
|
||||
/**
|
||||
/***********************************************************************
|
||||
* Determine the hardware vertex layout.
|
||||
* Depends on vertex/fragment shader state.
|
||||
*/
|
||||
static void calculate_vertex_layout( struct i915_context *i915 )
|
||||
static void calculate_vertex_layout(struct i915_context *i915)
|
||||
{
|
||||
const struct i915_fragment_shader *fs = i915->fs;
|
||||
const enum interp_mode colorInterp = i915->rasterizer->color_interp;
|
||||
|
|
@ -146,37 +146,68 @@ static void calculate_vertex_layout( struct i915_context *i915 )
|
|||
}
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_update_vertex_layout = {
|
||||
"vertex_layout",
|
||||
calculate_vertex_layout,
|
||||
I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS
|
||||
};
|
||||
|
||||
|
||||
|
||||
/* Hopefully this will remain quite simple, otherwise need to pull in
|
||||
* something like the state tracker mechanism.
|
||||
/***********************************************************************
|
||||
* Update fragment state
|
||||
*/
|
||||
void i915_update_derived( struct i915_context *i915 )
|
||||
static void update_fs(struct i915_context *i915)
|
||||
{
|
||||
if (i915->dirty & (I915_NEW_RASTERIZER | I915_NEW_FS | I915_NEW_VS))
|
||||
calculate_vertex_layout( i915 );
|
||||
i915->hardware_dirty |= I915_HW_PROGRAM; /* XXX right? */
|
||||
}
|
||||
|
||||
if (i915->dirty & (I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW))
|
||||
i915_update_samplers(i915);
|
||||
struct i915_tracked_state i915_hw_fs = {
|
||||
"fs",
|
||||
update_fs,
|
||||
I915_NEW_FS
|
||||
};
|
||||
|
||||
if (i915->dirty & I915_NEW_SAMPLER_VIEW)
|
||||
i915_update_textures(i915);
|
||||
|
||||
if (i915->dirty)
|
||||
i915_update_immediate( i915 );
|
||||
|
||||
if (i915->dirty)
|
||||
i915_update_dynamic( i915 );
|
||||
|
||||
if (i915->dirty & I915_NEW_FS) {
|
||||
i915->hardware_dirty |= I915_HW_PROGRAM; /* XXX right? */
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
* Update framebuffer state
|
||||
*/
|
||||
static void update_framebuffer(struct i915_context *i915)
|
||||
{
|
||||
/* HW emit currently references framebuffer state directly:
|
||||
*/
|
||||
if (i915->dirty & I915_NEW_FRAMEBUFFER)
|
||||
i915->hardware_dirty |= I915_HW_STATIC;
|
||||
i915->hardware_dirty |= I915_HW_STATIC;
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_hw_framebuffer = {
|
||||
"framebuffer",
|
||||
update_framebuffer,
|
||||
I915_NEW_FRAMEBUFFER
|
||||
};
|
||||
|
||||
|
||||
|
||||
/***********************************************************************
|
||||
*/
|
||||
static struct i915_tracked_state *atoms[] = {
|
||||
&i915_update_vertex_layout,
|
||||
&i915_hw_samplers,
|
||||
&i915_hw_sampler_views,
|
||||
&i915_hw_immediate,
|
||||
&i915_hw_dynamic,
|
||||
&i915_hw_fs,
|
||||
&i915_hw_framebuffer,
|
||||
NULL,
|
||||
};
|
||||
|
||||
void i915_update_derived(struct i915_context *i915)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; atoms[i]; i++)
|
||||
if (atoms[i]->dirty & i915->dirty)
|
||||
atoms[i]->update(i915);
|
||||
|
||||
i915->dirty = 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,8 +86,9 @@ static void upload_MODES4(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_MODES4 = {
|
||||
I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL,
|
||||
upload_MODES4
|
||||
"MODES4",
|
||||
upload_MODES4,
|
||||
I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -111,8 +112,9 @@ static void upload_BFO(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_BFO = {
|
||||
I915_NEW_DEPTH_STENCIL,
|
||||
upload_BFO
|
||||
"BFO",
|
||||
upload_BFO,
|
||||
I915_NEW_DEPTH_STENCIL
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -144,8 +146,9 @@ static void upload_BLENDCOLOR(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_BLENDCOLOR = {
|
||||
I915_NEW_BLEND,
|
||||
upload_BLENDCOLOR
|
||||
"BLENDCOLOR",
|
||||
upload_BLENDCOLOR,
|
||||
I915_NEW_BLEND
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -163,8 +166,9 @@ static void upload_IAB(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_IAB = {
|
||||
I915_NEW_BLEND,
|
||||
upload_IAB
|
||||
"IAB",
|
||||
upload_IAB,
|
||||
I915_NEW_BLEND
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -180,8 +184,9 @@ static void upload_DEPTHSCALE(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_DEPTHSCALE = {
|
||||
I915_NEW_RASTERIZER,
|
||||
upload_DEPTHSCALE
|
||||
"DEPTHSCALE",
|
||||
upload_DEPTHSCALE,
|
||||
I915_NEW_RASTERIZER
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -234,8 +239,9 @@ static void upload_STIPPLE(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_STIPPLE = {
|
||||
I915_NEW_RASTERIZER | I915_NEW_STIPPLE,
|
||||
upload_STIPPLE
|
||||
"STIPPLE",
|
||||
upload_STIPPLE,
|
||||
I915_NEW_RASTERIZER | I915_NEW_STIPPLE
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -281,8 +287,9 @@ static void upload_SCISSOR_RECT(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_SCISSOR_RECT = {
|
||||
I915_NEW_SCISSOR,
|
||||
upload_SCISSOR_RECT
|
||||
"SCISSOR RECT",
|
||||
upload_SCISSOR_RECT,
|
||||
I915_NEW_SCISSOR
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -303,7 +310,7 @@ static const struct i915_tracked_state *atoms[] = {
|
|||
/* These will be dynamic indirect state commands, but for now just end
|
||||
* up on the batch buffer with everything else.
|
||||
*/
|
||||
void i915_update_dynamic(struct i915_context *i915)
|
||||
static void update_dynamic(struct i915_context *i915)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -311,3 +318,9 @@ void i915_update_dynamic(struct i915_context *i915)
|
|||
if (i915->dirty & atoms[i]->dirty)
|
||||
atoms[i]->update(i915);
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_hw_dynamic = {
|
||||
"dynamic",
|
||||
update_dynamic,
|
||||
~0 /* all state atoms, becuase we do internal checking */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -79,8 +79,9 @@ static void upload_S0S1(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_S0S1 = {
|
||||
I915_NEW_VBO | I915_NEW_VERTEX_FORMAT,
|
||||
upload_S0S1
|
||||
"imm S0 S1",
|
||||
upload_S0S1,
|
||||
I915_NEW_VBO | I915_NEW_VERTEX_FORMAT
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -115,8 +116,9 @@ static void upload_S2S4(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_S2S4 = {
|
||||
I915_NEW_RASTERIZER | I915_NEW_VERTEX_FORMAT,
|
||||
upload_S2S4
|
||||
"imm S2 S4",
|
||||
upload_S2S4,
|
||||
I915_NEW_RASTERIZER | I915_NEW_VERTEX_FORMAT
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -152,8 +154,9 @@ static void upload_S5(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_S5 = {
|
||||
(I915_NEW_DEPTH_STENCIL | I915_NEW_BLEND | I915_NEW_RASTERIZER),
|
||||
upload_S5
|
||||
"imm S5",
|
||||
upload_S5,
|
||||
I915_NEW_DEPTH_STENCIL | I915_NEW_BLEND | I915_NEW_RASTERIZER
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -184,8 +187,9 @@ static void upload_S6(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_S6 = {
|
||||
I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL | I915_NEW_FRAMEBUFFER,
|
||||
upload_S6
|
||||
"imm s6",
|
||||
upload_S6,
|
||||
I915_NEW_BLEND | I915_NEW_DEPTH_STENCIL | I915_NEW_FRAMEBUFFER
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -207,8 +211,9 @@ static void upload_S7(struct i915_context *i915)
|
|||
}
|
||||
|
||||
const struct i915_tracked_state i915_upload_S7 = {
|
||||
I915_NEW_RASTERIZER,
|
||||
upload_S7
|
||||
"imm S7",
|
||||
upload_S7,
|
||||
I915_NEW_RASTERIZER
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -223,7 +228,7 @@ static const struct i915_tracked_state *atoms[] = {
|
|||
&i915_upload_S7
|
||||
};
|
||||
|
||||
void i915_update_immediate(struct i915_context *i915)
|
||||
static void update_immediate(struct i915_context *i915)
|
||||
{
|
||||
int i;
|
||||
|
||||
|
|
@ -231,3 +236,9 @@ void i915_update_immediate(struct i915_context *i915)
|
|||
if (i915->dirty & atoms[i]->dirty)
|
||||
atoms[i]->update(i915);
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_hw_immediate = {
|
||||
"immediate",
|
||||
update_immediate,
|
||||
~0 /* all state atoms, becuase we do internal checking */
|
||||
};
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ static void update_sampler(struct i915_context *i915,
|
|||
state[1] |= (unit << SS3_TEXTUREMAP_INDEX_SHIFT);
|
||||
}
|
||||
|
||||
void i915_update_samplers(struct i915_context *i915)
|
||||
static void update_samplers(struct i915_context *i915)
|
||||
{
|
||||
uint unit;
|
||||
|
||||
|
|
@ -173,6 +173,11 @@ void i915_update_samplers(struct i915_context *i915)
|
|||
i915->hardware_dirty |= I915_HW_SAMPLER | I915_HW_MAP;
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_hw_samplers = {
|
||||
"sampler_views",
|
||||
update_samplers,
|
||||
I915_NEW_SAMPLER | I915_NEW_SAMPLER_VIEW
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
|
@ -291,7 +296,7 @@ static void update_texture(struct i915_context *i915,
|
|||
| ((depth - 1) << MS4_VOLUME_DEPTH_SHIFT));
|
||||
}
|
||||
|
||||
void i915_update_textures(struct i915_context *i915)
|
||||
static void update_textures(struct i915_context *i915)
|
||||
{
|
||||
uint unit;
|
||||
|
||||
|
|
@ -312,3 +317,9 @@ void i915_update_textures(struct i915_context *i915)
|
|||
|
||||
i915->hardware_dirty |= I915_HW_MAP;
|
||||
}
|
||||
|
||||
struct i915_tracked_state i915_hw_sampler_views = {
|
||||
"sampler_views",
|
||||
update_textures,
|
||||
I915_NEW_SAMPLER_VIEW
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue