diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gallium/auxiliary/vl/vl_compositor.c | 29 | ||||
| -rw-r--r-- | src/gallium/auxiliary/vl/vl_compositor.h | 2 | ||||
| -rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c | 118 | ||||
| -rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h | 4 | 
4 files changed, 82 insertions, 71 deletions
diff --git a/src/gallium/auxiliary/vl/vl_compositor.c b/src/gallium/auxiliary/vl/vl_compositor.c index 5d61423f9d..6d461cb880 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.c +++ b/src/gallium/auxiliary/vl/vl_compositor.c @@ -230,6 +230,7 @@ static bool  init_pipe_state(struct vl_compositor *c)  {     struct pipe_sampler_state sampler; +   struct pipe_vertex_element vertex_elems[2];     assert(c); @@ -251,15 +252,27 @@ init_pipe_state(struct vl_compositor *c)     /*sampler.border_color[i] = ;*/     /*sampler.max_anisotropy = ;*/     c->sampler = c->pipe->create_sampler_state(c->pipe, &sampler); -	 + +   vertex_elems[0].src_offset = 0; +   vertex_elems[0].instance_divisor = 0; +   vertex_elems[0].vertex_buffer_index = 0; +   vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; +   vertex_elems[1].src_offset = 0; +   vertex_elems[1].instance_divisor = 0; +   vertex_elems[1].vertex_buffer_index = 1; +   vertex_elems[1].src_format = PIPE_FORMAT_R32G32_FLOAT; +   c->vertex_elems = c->pipe->create_vertex_elements_state(c->pipe, 2, vertex_elems); + +     return true;  }  static void cleanup_pipe_state(struct vl_compositor *c)  {     assert(c); -	 +     c->pipe->delete_sampler_state(c->pipe, c->sampler); +   c->pipe->delete_vertex_elements_state(c->pipe, c->vertex_elems);  }  static bool @@ -314,11 +327,6 @@ init_buffers(struct vl_compositor *c)     pipe_buffer_unmap(c->pipe->screen, c->vertex_bufs[0].buffer); -   c->vertex_elems[0].src_offset = 0; -   c->vertex_elems[0].instance_divisor = 0; -   c->vertex_elems[0].vertex_buffer_index = 0; -   c->vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; -     /*      * Create our texcoord buffer and texcoord buffer element      * Texcoord buffer contains the TCs for mapping the rendered surface to the 4 vertices @@ -343,11 +351,6 @@ init_buffers(struct vl_compositor *c)     pipe_buffer_unmap(c->pipe->screen, c->vertex_bufs[1].buffer); -   c->vertex_elems[1].src_offset = 0; -   c->vertex_elems[1].instance_divisor = 0; -   c->vertex_elems[1].vertex_buffer_index = 1; -   c->vertex_elems[1].src_format = PIPE_FORMAT_R32G32_FLOAT; -     /*      * Create our vertex shader's constant buffer      * Const buffer contains scaling and translation vectors @@ -481,7 +484,7 @@ void vl_compositor_render(struct vl_compositor          *compositor,     compositor->pipe->bind_vs_state(compositor->pipe, compositor->vertex_shader);     compositor->pipe->bind_fs_state(compositor->pipe, compositor->fragment_shader);     compositor->pipe->set_vertex_buffers(compositor->pipe, 2, compositor->vertex_bufs); -   compositor->pipe->set_vertex_elements(compositor->pipe, 2, compositor->vertex_elems); +   compositor->pipe->bind_vertex_elements_state(compositor->pipe, compositor->vertex_elems);     compositor->pipe->set_constant_buffer(compositor->pipe, PIPE_SHADER_VERTEX, 0, compositor->vs_const_buf);     compositor->pipe->set_constant_buffer(compositor->pipe, PIPE_SHADER_FRAGMENT, 0, compositor->fs_const_buf); diff --git a/src/gallium/auxiliary/vl/vl_compositor.h b/src/gallium/auxiliary/vl/vl_compositor.h index 6a9a3fd7af..51755554da 100644 --- a/src/gallium/auxiliary/vl/vl_compositor.h +++ b/src/gallium/auxiliary/vl/vl_compositor.h @@ -43,10 +43,10 @@ struct vl_compositor     void *sampler;     void *vertex_shader;     void *fragment_shader; +   void *vertex_elems;     struct pipe_viewport_state viewport;     struct pipe_scissor_state scissor;     struct pipe_vertex_buffer vertex_bufs[2]; -   struct pipe_vertex_element vertex_elems[2];     struct pipe_buffer *vs_const_buf, *fs_const_buf;  }; diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c index 6b9ecd4268..0763b5bb0e 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c @@ -708,6 +708,7 @@ static bool  init_pipe_state(struct vl_mpeg12_mc_renderer *r)  {     struct pipe_sampler_state sampler; +   struct pipe_vertex_element vertex_elems[8];     unsigned filters[5];     unsigned i; @@ -771,6 +772,59 @@ init_pipe_state(struct vl_mpeg12_mc_renderer *r)        r->samplers.all[i] = r->pipe->create_sampler_state(r->pipe, &sampler);     } +   /* Position element */ +   vertex_elems[0].src_offset = 0; +   vertex_elems[0].instance_divisor = 0; +   vertex_elems[0].vertex_buffer_index = 0; +   vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* Luma, texcoord element */ +   vertex_elems[1].src_offset = sizeof(struct vertex2f); +   vertex_elems[1].instance_divisor = 0; +   vertex_elems[1].vertex_buffer_index = 0; +   vertex_elems[1].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* Chroma Cr texcoord element */ +   vertex_elems[2].src_offset = sizeof(struct vertex2f) * 2; +   vertex_elems[2].instance_divisor = 0; +   vertex_elems[2].vertex_buffer_index = 0; +   vertex_elems[2].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* Chroma Cb texcoord element */ +   vertex_elems[3].src_offset = sizeof(struct vertex2f) * 3; +   vertex_elems[3].instance_divisor = 0; +   vertex_elems[3].vertex_buffer_index = 0; +   vertex_elems[3].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* First ref surface top field texcoord element */ +   vertex_elems[4].src_offset = 0; +   vertex_elems[4].instance_divisor = 0; +   vertex_elems[4].vertex_buffer_index = 1; +   vertex_elems[4].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* First ref surface bottom field texcoord element */ +   vertex_elems[5].src_offset = sizeof(struct vertex2f); +   vertex_elems[5].instance_divisor = 0; +   vertex_elems[5].vertex_buffer_index = 1; +   vertex_elems[5].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* Second ref surface top field texcoord element */ +   vertex_elems[6].src_offset = 0; +   vertex_elems[6].instance_divisor = 0; +   vertex_elems[6].vertex_buffer_index = 2; +   vertex_elems[6].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* Second ref surface bottom field texcoord element */ +   vertex_elems[7].src_offset = sizeof(struct vertex2f); +   vertex_elems[7].instance_divisor = 0; +   vertex_elems[7].vertex_buffer_index = 2; +   vertex_elems[7].src_format = PIPE_FORMAT_R32G32_FLOAT; + +   /* need versions with 4,6 and 8 vertex elems */ +   r->vertex_elems[0] = r->pipe->create_vertex_elements_state(r->pipe, 4, vertex_elems); +   r->vertex_elems[1] = r->pipe->create_vertex_elements_state(r->pipe, 6, vertex_elems); +   r->vertex_elems[2] = r->pipe->create_vertex_elements_state(r->pipe, 8, vertex_elems); +     return true;  } @@ -783,6 +837,8 @@ cleanup_pipe_state(struct vl_mpeg12_mc_renderer *r)     for (i = 0; i < 5; ++i)        r->pipe->delete_sampler_state(r->pipe, r->samplers.all[i]); +   for (i = 0; i < 3; i++) +      r->pipe->delete_vertex_elements_state(r->pipe, r->vertex_elems[i]);  }  static bool @@ -888,54 +944,6 @@ init_buffers(struct vl_mpeg12_mc_renderer *r)        );     } -   /* Position element */ -   r->vertex_elems[0].src_offset = 0; -   r->vertex_elems[0].instance_divisor = 0; -   r->vertex_elems[0].vertex_buffer_index = 0; -   r->vertex_elems[0].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* Luma, texcoord element */ -   r->vertex_elems[1].src_offset = sizeof(struct vertex2f); -   r->vertex_elems[1].instance_divisor = 0; -   r->vertex_elems[1].vertex_buffer_index = 0; -   r->vertex_elems[1].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* Chroma Cr texcoord element */ -   r->vertex_elems[2].src_offset = sizeof(struct vertex2f) * 2; -   r->vertex_elems[2].instance_divisor = 0; -   r->vertex_elems[2].vertex_buffer_index = 0; -   r->vertex_elems[2].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* Chroma Cb texcoord element */ -   r->vertex_elems[3].src_offset = sizeof(struct vertex2f) * 3; -   r->vertex_elems[3].instance_divisor = 0; -   r->vertex_elems[3].vertex_buffer_index = 0; -   r->vertex_elems[3].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* First ref surface top field texcoord element */ -   r->vertex_elems[4].src_offset = 0; -   r->vertex_elems[4].instance_divisor = 0; -   r->vertex_elems[4].vertex_buffer_index = 1; -   r->vertex_elems[4].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* First ref surface bottom field texcoord element */ -   r->vertex_elems[5].src_offset = sizeof(struct vertex2f); -   r->vertex_elems[5].instance_divisor = 0; -   r->vertex_elems[5].vertex_buffer_index = 1; -   r->vertex_elems[5].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* Second ref surface top field texcoord element */ -   r->vertex_elems[6].src_offset = 0; -   r->vertex_elems[6].instance_divisor = 0; -   r->vertex_elems[6].vertex_buffer_index = 2; -   r->vertex_elems[6].src_format = PIPE_FORMAT_R32G32_FLOAT; - -   /* Second ref surface bottom field texcoord element */ -   r->vertex_elems[7].src_offset = sizeof(struct vertex2f); -   r->vertex_elems[7].instance_divisor = 0; -   r->vertex_elems[7].vertex_buffer_index = 2; -   r->vertex_elems[7].src_format = PIPE_FORMAT_R32G32_FLOAT; -     r->vs_const_buf = pipe_buffer_create     (        r->pipe->screen, @@ -1299,7 +1307,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (num_macroblocks[MACROBLOCK_TYPE_INTRA] > 0) {        r->pipe->set_vertex_buffers(r->pipe, 1, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 4, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[0]);        r->pipe->set_fragment_sampler_textures(r->pipe, 3, r->textures.all);        r->pipe->bind_fragment_sampler_states(r->pipe, 3, r->samplers.all);        r->pipe->bind_vs_state(r->pipe, r->i_vs); @@ -1312,7 +1320,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (num_macroblocks[MACROBLOCK_TYPE_FWD_FRAME_PRED] > 0) {        r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 6, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[1]);        r->textures.individual.ref[0] = r->past;        r->pipe->set_fragment_sampler_textures(r->pipe, 4, r->textures.all);        r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); @@ -1326,7 +1334,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (false /*num_macroblocks[MACROBLOCK_TYPE_FWD_FIELD_PRED] > 0 */ ) {        r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 6, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[1]);        r->textures.individual.ref[0] = r->past;        r->pipe->set_fragment_sampler_textures(r->pipe, 4, r->textures.all);        r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); @@ -1340,7 +1348,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (num_macroblocks[MACROBLOCK_TYPE_BKWD_FRAME_PRED] > 0) {        r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 6, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[1]);        r->textures.individual.ref[0] = r->future;        r->pipe->set_fragment_sampler_textures(r->pipe, 4, r->textures.all);        r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); @@ -1354,7 +1362,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (false /*num_macroblocks[MACROBLOCK_TYPE_BKWD_FIELD_PRED] > 0 */ ) {        r->pipe->set_vertex_buffers(r->pipe, 2, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 6, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[1]);        r->textures.individual.ref[0] = r->future;        r->pipe->set_fragment_sampler_textures(r->pipe, 4, r->textures.all);        r->pipe->bind_fragment_sampler_states(r->pipe, 4, r->samplers.all); @@ -1368,7 +1376,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (num_macroblocks[MACROBLOCK_TYPE_BI_FRAME_PRED] > 0) {        r->pipe->set_vertex_buffers(r->pipe, 3, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 8, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[2]);        r->textures.individual.ref[0] = r->past;        r->textures.individual.ref[1] = r->future;        r->pipe->set_fragment_sampler_textures(r->pipe, 5, r->textures.all); @@ -1383,7 +1391,7 @@ flush(struct vl_mpeg12_mc_renderer *r)     if (false /*num_macroblocks[MACROBLOCK_TYPE_BI_FIELD_PRED] > 0 */ ) {        r->pipe->set_vertex_buffers(r->pipe, 3, r->vertex_bufs.all); -      r->pipe->set_vertex_elements(r->pipe, 8, r->vertex_elems); +      r->pipe->bind_vertex_elements_state(r->pipe, r->vertex_elems[2]);        r->textures.individual.ref[0] = r->past;        r->textures.individual.ref[1] = r->future;        r->pipe->set_fragment_sampler_textures(r->pipe, 5, r->textures.all); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h index f00b8c7b8b..a11a3e7307 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h @@ -66,8 +66,8 @@ struct vl_mpeg12_mc_renderer     struct pipe_buffer *vs_const_buf;     struct pipe_buffer *fs_const_buf;     struct pipe_framebuffer_state fb_state; -   struct pipe_vertex_element vertex_elems[8]; -	 +   void *vertex_elems[3]; +     union     {        void *all[5];  | 
