util: adapt blitter code to new vertex element cso
The interface of util_draw_vertex_buffer looks a bit odd (calling code has to set vertex elements but not vertex buffers) but due to the way cso state handling generally works (can't re-bind original vertex element state easily there) I guess that's ok for now.
This commit is contained in:
parent
18603a2f07
commit
ac4abaecd5
|
@ -62,6 +62,7 @@ struct blit_state
|
|||
struct pipe_rasterizer_state rasterizer;
|
||||
struct pipe_sampler_state sampler;
|
||||
struct pipe_viewport_state viewport;
|
||||
struct pipe_vertex_element velem[2];
|
||||
|
||||
void *vs;
|
||||
void *fs[TGSI_WRITEMASK_XYZW + 1];
|
||||
|
@ -115,6 +116,15 @@ util_create_blit(struct pipe_context *pipe, struct cso_context *cso)
|
|||
ctx->sampler.normalized_coords = 1;
|
||||
|
||||
|
||||
/* vertex elements state */
|
||||
memset(&ctx->velem[0], 0, sizeof(ctx->velem[0]) * 2);
|
||||
for (i = 0; i < 2; i++) {
|
||||
ctx->velem[i].src_offset = i * 4 * sizeof(float);
|
||||
ctx->velem[i].instance_divisor = 0;
|
||||
ctx->velem[i].vertex_buffer_index = 0;
|
||||
ctx->velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
|
||||
}
|
||||
|
||||
/* vertex shader - still required to provide the linkage between
|
||||
* fragment shader input semantics and vertex_element/buffers.
|
||||
*/
|
||||
|
@ -410,11 +420,13 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
cso_save_vertex_elements(ctx->cso);
|
||||
|
||||
/* set misc state we care about */
|
||||
cso_set_blend(ctx->cso, &ctx->blend);
|
||||
cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
|
||||
cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
|
||||
cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
|
||||
|
||||
/* sampler */
|
||||
ctx->sampler.min_img_filter = filter;
|
||||
|
@ -464,6 +476,7 @@ util_blit_pixels_writemask(struct blit_state *ctx,
|
|||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
|
||||
pipe_texture_reference(&tex, NULL);
|
||||
}
|
||||
|
@ -547,11 +560,13 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
|||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
cso_save_vertex_elements(ctx->cso);
|
||||
|
||||
/* set misc state we care about */
|
||||
cso_set_blend(ctx->cso, &ctx->blend);
|
||||
cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
|
||||
cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
|
||||
cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
|
||||
|
||||
/* sampler */
|
||||
ctx->sampler.min_img_filter = filter;
|
||||
|
@ -596,4 +611,5 @@ util_blit_pixels_tex(struct blit_state *ctx,
|
|||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
}
|
||||
|
|
|
@ -88,6 +88,8 @@ struct blitter_context_priv
|
|||
void *dsa_write_depth_keep_stencil;
|
||||
void *dsa_keep_depth_stencil;
|
||||
|
||||
void *velem_state;
|
||||
|
||||
/* Sampler state for clamping to a miplevel. */
|
||||
void *sampler_state[PIPE_MAX_TEXTURE_LEVELS];
|
||||
|
||||
|
@ -102,6 +104,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
|
|||
struct pipe_depth_stencil_alpha_state dsa = { { 0 } };
|
||||
struct pipe_rasterizer_state rs_state = { 0 };
|
||||
struct pipe_sampler_state *sampler_state;
|
||||
struct pipe_vertex_element velem[2];
|
||||
unsigned i;
|
||||
|
||||
ctx = CALLOC_STRUCT(blitter_context_priv);
|
||||
|
@ -116,6 +119,7 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
|
|||
ctx->blitter.saved_rs_state = INVALID_PTR;
|
||||
ctx->blitter.saved_fs = INVALID_PTR;
|
||||
ctx->blitter.saved_vs = INVALID_PTR;
|
||||
ctx->blitter.saved_velem_state = INVALID_PTR;
|
||||
ctx->blitter.saved_fb_state.nr_cbufs = ~0;
|
||||
ctx->blitter.saved_num_textures = ~0;
|
||||
ctx->blitter.saved_num_sampler_states = ~0;
|
||||
|
@ -165,6 +169,16 @@ struct blitter_context *util_blitter_create(struct pipe_context *pipe)
|
|||
rs_state.flatshade = 1;
|
||||
ctx->rs_state = pipe->create_rasterizer_state(pipe, &rs_state);
|
||||
|
||||
/* vertex elements state */
|
||||
memset(&velem[0], 0, sizeof(velem[0]) * 2);
|
||||
for (i = 0; i < 2; i++) {
|
||||
velem[i].src_offset = i * 4 * sizeof(float);
|
||||
velem[i].instance_divisor = 0;
|
||||
velem[i].vertex_buffer_index = 0;
|
||||
velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
|
||||
}
|
||||
ctx->velem_state = pipe->create_vertex_elements_state(pipe, 2, &velem[0]);
|
||||
|
||||
/* fragment shaders are created on-demand */
|
||||
|
||||
/* vertex shaders */
|
||||
|
@ -214,6 +228,7 @@ void util_blitter_destroy(struct blitter_context *blitter)
|
|||
pipe->delete_rasterizer_state(pipe, ctx->rs_state);
|
||||
pipe->delete_vs_state(pipe, ctx->vs_col);
|
||||
pipe->delete_vs_state(pipe, ctx->vs_tex);
|
||||
pipe->delete_vertex_elements_state(pipe, ctx->velem_state);
|
||||
|
||||
for (i = 0; i < PIPE_MAX_TEXTURE_TYPES; i++) {
|
||||
if (ctx->fs_texfetch_col[i])
|
||||
|
@ -241,7 +256,8 @@ static void blitter_check_saved_CSOs(struct blitter_context_priv *ctx)
|
|||
ctx->blitter.saved_dsa_state != INVALID_PTR &&
|
||||
ctx->blitter.saved_rs_state != INVALID_PTR &&
|
||||
ctx->blitter.saved_fs != INVALID_PTR &&
|
||||
ctx->blitter.saved_vs != INVALID_PTR);
|
||||
ctx->blitter.saved_vs != INVALID_PTR &&
|
||||
ctx->blitter.saved_velem_state != INVALID_PTR);
|
||||
}
|
||||
|
||||
static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
|
||||
|
@ -254,12 +270,14 @@ static void blitter_restore_CSOs(struct blitter_context_priv *ctx)
|
|||
pipe->bind_rasterizer_state(pipe, ctx->blitter.saved_rs_state);
|
||||
pipe->bind_fs_state(pipe, ctx->blitter.saved_fs);
|
||||
pipe->bind_vs_state(pipe, ctx->blitter.saved_vs);
|
||||
pipe->bind_vertex_elements_state(pipe, ctx->blitter.saved_velem_state);
|
||||
|
||||
ctx->blitter.saved_blend_state = INVALID_PTR;
|
||||
ctx->blitter.saved_dsa_state = INVALID_PTR;
|
||||
ctx->blitter.saved_rs_state = INVALID_PTR;
|
||||
ctx->blitter.saved_fs = INVALID_PTR;
|
||||
ctx->blitter.saved_vs = INVALID_PTR;
|
||||
ctx->blitter.saved_velem_state = INVALID_PTR;
|
||||
|
||||
pipe->set_stencil_ref(pipe, &ctx->blitter.saved_stencil_ref);
|
||||
|
||||
|
@ -546,6 +564,7 @@ void util_blitter_clear(struct blitter_context *blitter,
|
|||
pipe->bind_depth_stencil_alpha_state(pipe, ctx->dsa_keep_depth_stencil);
|
||||
|
||||
pipe->bind_rasterizer_state(pipe, ctx->rs_state);
|
||||
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
|
||||
pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, num_cbufs));
|
||||
pipe->bind_vs_state(pipe, ctx->vs_col);
|
||||
|
||||
|
@ -611,6 +630,7 @@ static void util_blitter_do_copy(struct blitter_context *blitter,
|
|||
pipe->bind_vs_state(pipe, ctx->vs_tex);
|
||||
pipe->bind_fragment_sampler_states(pipe, 1,
|
||||
blitter_get_sampler_state(ctx, src->level));
|
||||
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
|
||||
pipe->set_fragment_sampler_textures(pipe, 1, &src->texture);
|
||||
pipe->set_framebuffer_state(pipe, &fb_state);
|
||||
|
||||
|
@ -784,6 +804,7 @@ void util_blitter_fill(struct blitter_context *blitter,
|
|||
pipe->bind_rasterizer_state(pipe, ctx->rs_state);
|
||||
pipe->bind_fs_state(pipe, blitter_get_fs_col(ctx, 1));
|
||||
pipe->bind_vs_state(pipe, ctx->vs_col);
|
||||
pipe->bind_vertex_elements_state(pipe, ctx->velem_state);
|
||||
|
||||
/* set a framebuffer state */
|
||||
fb_state.width = dst->width;
|
||||
|
|
|
@ -43,6 +43,7 @@ struct blitter_context
|
|||
/* Private members, really. */
|
||||
void *saved_blend_state; /**< blend state */
|
||||
void *saved_dsa_state; /**< depth stencil alpha state */
|
||||
void *saved_velem_state; /**< vertex elements state */
|
||||
void *saved_rs_state; /**< rasterizer state */
|
||||
void *saved_fs, *saved_vs; /**< fragment shader, vertex shader */
|
||||
|
||||
|
@ -170,6 +171,13 @@ void util_blitter_save_depth_stencil_alpha(struct blitter_context *blitter,
|
|||
blitter->saved_dsa_state = state;
|
||||
}
|
||||
|
||||
static INLINE
|
||||
void util_blitter_save_vertex_elements(struct blitter_context *blitter,
|
||||
void *state)
|
||||
{
|
||||
blitter->saved_velem_state = state;
|
||||
}
|
||||
|
||||
static INLINE
|
||||
void util_blitter_save_stencil_ref(struct blitter_context *blitter,
|
||||
const struct pipe_stencil_ref *state)
|
||||
|
|
|
@ -45,8 +45,6 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
|
|||
uint num_attribs)
|
||||
{
|
||||
struct pipe_vertex_buffer vbuffer;
|
||||
struct pipe_vertex_element velements[PIPE_MAX_ATTRIBS];
|
||||
uint i;
|
||||
|
||||
assert(num_attribs <= PIPE_MAX_ATTRIBS);
|
||||
|
||||
|
@ -58,14 +56,7 @@ util_draw_vertex_buffer(struct pipe_context *pipe,
|
|||
vbuffer.max_index = num_verts - 1;
|
||||
pipe->set_vertex_buffers(pipe, 1, &vbuffer);
|
||||
|
||||
/* tell pipe about the vertex attributes */
|
||||
for (i = 0; i < num_attribs; i++) {
|
||||
velements[i].src_offset = i * 4 * sizeof(float);
|
||||
velements[i].instance_divisor = 0;
|
||||
velements[i].vertex_buffer_index = 0;
|
||||
velements[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
|
||||
}
|
||||
pipe->set_vertex_elements(pipe, num_attribs, velements);
|
||||
/* note: vertex elements already set by caller */
|
||||
|
||||
/* draw */
|
||||
pipe->draw_arrays(pipe, prim_type, 0, num_verts);
|
||||
|
|
|
@ -61,6 +61,7 @@ struct gen_mipmap_state
|
|||
struct pipe_depth_stencil_alpha_state depthstencil;
|
||||
struct pipe_rasterizer_state rasterizer;
|
||||
struct pipe_sampler_state sampler;
|
||||
struct pipe_vertex_element velem[2];
|
||||
|
||||
void *vs;
|
||||
void *fs2d, *fsCube;
|
||||
|
@ -1307,6 +1308,15 @@ util_create_gen_mipmap(struct pipe_context *pipe,
|
|||
ctx->sampler.min_mip_filter = PIPE_TEX_MIPFILTER_NEAREST;
|
||||
ctx->sampler.normalized_coords = 1;
|
||||
|
||||
/* vertex elements state */
|
||||
memset(&ctx->velem[0], 0, sizeof(ctx->velem[0]) * 2);
|
||||
for (i = 0; i < 2; i++) {
|
||||
ctx->velem[i].src_offset = i * 4 * sizeof(float);
|
||||
ctx->velem[i].instance_divisor = 0;
|
||||
ctx->velem[i].vertex_buffer_index = 0;
|
||||
ctx->velem[i].src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
|
||||
}
|
||||
|
||||
/* vertex shader - still needed to specify mapping from fragment
|
||||
* shader input semantics to vertex elements
|
||||
*/
|
||||
|
@ -1499,11 +1509,13 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
|||
cso_save_framebuffer(ctx->cso);
|
||||
cso_save_fragment_shader(ctx->cso);
|
||||
cso_save_vertex_shader(ctx->cso);
|
||||
cso_save_vertex_elements(ctx->cso);
|
||||
|
||||
/* bind our state */
|
||||
cso_set_blend(ctx->cso, &ctx->blend);
|
||||
cso_set_depth_stencil_alpha(ctx->cso, &ctx->depthstencil);
|
||||
cso_set_rasterizer(ctx->cso, &ctx->rasterizer);
|
||||
cso_set_vertex_elements(ctx->cso, 2, ctx->velem);
|
||||
|
||||
cso_set_fragment_shader_handle(ctx->cso, fs);
|
||||
cso_set_vertex_shader_handle(ctx->cso, ctx->vs);
|
||||
|
@ -1578,4 +1590,5 @@ util_gen_mipmap(struct gen_mipmap_state *ctx,
|
|||
cso_restore_framebuffer(ctx->cso);
|
||||
cso_restore_fragment_shader(ctx->cso);
|
||||
cso_restore_vertex_shader(ctx->cso);
|
||||
cso_restore_vertex_elements(ctx->cso);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue