st/nine: Rework blend states
Separate state preparation and state commit Signed-off-by: Axel Davy <axel.davy@ens.fr>
This commit is contained in:
@@ -143,7 +143,7 @@ nine_convert_blend_state_fixup(struct pipe_blend_state *blend, const DWORD *rs)
|
||||
}
|
||||
|
||||
void
|
||||
nine_convert_blend_state(struct cso_context *ctx, const DWORD *rs)
|
||||
nine_convert_blend_state(struct pipe_blend_state *blend_state, const DWORD *rs)
|
||||
{
|
||||
struct pipe_blend_state blend;
|
||||
|
||||
@@ -187,7 +187,7 @@ nine_convert_blend_state(struct cso_context *ctx, const DWORD *rs)
|
||||
|
||||
/* blend.force_srgb = !!rs[D3DRS_SRGBWRITEENABLE]; */
|
||||
|
||||
cso_set_blend(ctx, &blend);
|
||||
*blend_state = blend;
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -39,7 +39,7 @@ extern const D3DFORMAT nine_pipe_to_d3d9_format_map[PIPE_FORMAT_COUNT];
|
||||
|
||||
void nine_convert_dsa_state(struct pipe_depth_stencil_alpha_state *, const DWORD *);
|
||||
void nine_convert_rasterizer_state(struct pipe_rasterizer_state *, const DWORD *);
|
||||
void nine_convert_blend_state(struct cso_context *, const DWORD *);
|
||||
void nine_convert_blend_state(struct pipe_blend_state *, const DWORD *);
|
||||
void nine_convert_sampler_state(struct cso_context *, int idx, const DWORD *);
|
||||
|
||||
void nine_pipe_context_clear(struct NineDevice9 *);
|
||||
|
||||
@@ -40,6 +40,13 @@
|
||||
|
||||
/* State preparation only */
|
||||
|
||||
static inline void
|
||||
prepare_blend(struct NineDevice9 *device)
|
||||
{
|
||||
nine_convert_blend_state(&device->state.pipe.blend, device->state.rs);
|
||||
device->state.commit |= NINE_STATE_COMMIT_BLEND;
|
||||
}
|
||||
|
||||
static inline void
|
||||
prepare_dsa(struct NineDevice9 *device)
|
||||
{
|
||||
@@ -197,12 +204,6 @@ update_viewport(struct NineDevice9 *device)
|
||||
pipe->set_viewport_states(pipe, 0, 1, &pvport);
|
||||
}
|
||||
|
||||
static inline void
|
||||
update_blend(struct NineDevice9 *device)
|
||||
{
|
||||
nine_convert_blend_state(device->cso, device->state.rs);
|
||||
}
|
||||
|
||||
/* Loop through VS inputs and pick the vertex elements with the declared
|
||||
* usage from the vertex declaration, then insert the instance divisor from
|
||||
* the stream source frequency setting.
|
||||
@@ -868,6 +869,12 @@ update_textures_and_samplers(struct NineDevice9 *device)
|
||||
|
||||
/* State commit only */
|
||||
|
||||
static inline void
|
||||
commit_blend(struct NineDevice9 *device)
|
||||
{
|
||||
cso_set_blend(device->cso, &device->state.pipe.blend);
|
||||
}
|
||||
|
||||
static inline void
|
||||
commit_dsa(struct NineDevice9 *device)
|
||||
{
|
||||
@@ -982,7 +989,7 @@ nine_update_state(struct NineDevice9 *device)
|
||||
if (group & NINE_STATE_DSA)
|
||||
prepare_dsa(device);
|
||||
if (group & NINE_STATE_BLEND)
|
||||
update_blend(device);
|
||||
prepare_blend(device);
|
||||
|
||||
if (group & NINE_STATE_VS)
|
||||
group |= update_vs(device);
|
||||
@@ -1040,6 +1047,8 @@ nine_update_state(struct NineDevice9 *device)
|
||||
if (state->changed.vtxbuf)
|
||||
update_vertex_buffers(device);
|
||||
|
||||
if (state->commit & NINE_STATE_COMMIT_BLEND)
|
||||
commit_blend(device);
|
||||
if (state->commit & NINE_STATE_COMMIT_DSA)
|
||||
commit_dsa(device);
|
||||
if (state->commit & NINE_STATE_COMMIT_RASTERIZER)
|
||||
|
||||
@@ -80,6 +80,7 @@
|
||||
|
||||
#define NINE_STATE_COMMIT_DSA (1 << 0)
|
||||
#define NINE_STATE_COMMIT_RASTERIZER (1 << 1)
|
||||
#define NINE_STATE_COMMIT_BLEND (1 << 2)
|
||||
|
||||
|
||||
#define NINE_MAX_SIMULTANEOUS_RENDERTARGETS 4
|
||||
@@ -216,6 +217,7 @@ struct nine_state
|
||||
struct {
|
||||
struct pipe_depth_stencil_alpha_state dsa;
|
||||
struct pipe_rasterizer_state rast;
|
||||
struct pipe_blend_state blend;
|
||||
} pipe;
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user