From: Christian König Date: Tue, 7 Dec 2010 20:23:14 +0000 (+0100) Subject: [g3dvl] use buffer width instead of texture size or vs constants X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=22b4acb2069a368e986805d3b43395172ebf9146;p=mesa.git [g3dvl] use buffer width instead of texture size or vs constants --- diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c index 7de778e1036..f19cfc38d7b 100644 --- a/src/gallium/auxiliary/vl/vl_idct.c +++ b/src/gallium/auxiliary/vl/vl_idct.c @@ -110,8 +110,8 @@ create_vert_shader(struct vl_idct *idct) * */ scale = ureg_imm2f(shader, - (float)BLOCK_WIDTH / idct->destination->width0, - (float)BLOCK_HEIGHT / idct->destination->height0); + (float)BLOCK_WIDTH / idct->buffer_width, + (float)BLOCK_HEIGHT / idct->buffer_height); ureg_ADD(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), vpos, vrect); ureg_MUL(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos), scale); @@ -555,6 +555,9 @@ vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe, struct pipe_resour assert(idct && pipe && dst); idct->pipe = pipe; + idct->buffer_width = dst->width0; + idct->buffer_height = dst->height0; + pipe_resource_reference(&idct->textures.individual.matrix, matrix); pipe_resource_reference(&idct->textures.individual.transpose, matrix); pipe_resource_reference(&idct->destination, dst); diff --git a/src/gallium/auxiliary/vl/vl_idct.h b/src/gallium/auxiliary/vl/vl_idct.h index 96e3d267046..2e98f22bea2 100644 --- a/src/gallium/auxiliary/vl/vl_idct.h +++ b/src/gallium/auxiliary/vl/vl_idct.h @@ -31,10 +31,17 @@ #include #include "vl_vertex_buffers.h" +struct vl_idct_buffer +{ +}; + struct vl_idct { struct pipe_context *pipe; + unsigned buffer_width; + unsigned buffer_height; + unsigned max_blocks; struct pipe_viewport_state viewport[2]; diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c index dba49e5f087..5ee9836f293 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c @@ -43,11 +43,6 @@ #define BLOCK_WIDTH 8 #define BLOCK_HEIGHT 8 -struct vertex_shader_consts -{ - struct vertex4f norm; -}; - struct vertex_stream_0 { struct vertex2f pos; @@ -108,9 +103,9 @@ static void * create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigned mv_per_frame) { struct ureg_program *shader; - struct ureg_src norm, mbs; + struct ureg_src scale; struct ureg_src vrect, vpos, eb[2][2], interlaced, vmv[4]; - struct ureg_dst scale, t_vpos, t_vtex; + struct ureg_dst t_vpos, t_vtex; struct ureg_dst o_vpos, o_line, o_vtex[3], o_eb[2][2], o_interlaced, o_vmv[4]; unsigned i, j, count, label; @@ -118,10 +113,6 @@ create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigne if (!shader) return NULL; - norm = ureg_DECL_constant(shader, 0); - mbs = ureg_imm2f(shader, MACROBLOCK_WIDTH, MACROBLOCK_HEIGHT); - - scale = ureg_DECL_temporary(shader); t_vpos = ureg_DECL_temporary(shader); t_vtex = ureg_DECL_temporary(shader); @@ -156,7 +147,7 @@ create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigne } /* - * scale = norm * mbs; + * scale = (MACROBLOCK_WIDTH, MACROBLOCK_HEIGHT) / (dst.width, dst.height) * * t_vpos = (vpos + vrect) * scale * o_vpos.xy = t_vpos @@ -181,15 +172,17 @@ create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigne * o_interlaced = interlaced * * if(count > 0) { // Apply motion vectors - * scale = norm * 0.5; + * scale = 0.5 / (dst.width, dst.height); * o_vmv[0..count] = t_vpos + vmv[0..count] * scale * } * */ - ureg_MUL(shader, ureg_writemask(scale, TGSI_WRITEMASK_XY), norm, mbs); + scale = ureg_imm2f(shader, + (float)MACROBLOCK_WIDTH / r->buffer_width, + (float)MACROBLOCK_HEIGHT / r->buffer_height); ureg_ADD(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), vpos, vrect); - ureg_MUL(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos), ureg_src(scale)); + ureg_MUL(shader, ureg_writemask(t_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos), scale); ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_XY), ureg_src(t_vpos)); ureg_MOV(shader, ureg_writemask(o_vpos, TGSI_WRITEMASK_ZW), vpos); @@ -201,9 +194,9 @@ create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigne ureg_MOV(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_X), vrect); ureg_MUL(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_Y), vrect, ureg_imm1f(shader, 0.5f)); ureg_ADD(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_XY), vpos, ureg_src(t_vtex)); - ureg_MUL(shader, ureg_writemask(o_vtex[0], TGSI_WRITEMASK_XY), ureg_src(t_vtex), ureg_src(scale)); + ureg_MUL(shader, ureg_writemask(o_vtex[0], TGSI_WRITEMASK_XY), ureg_src(t_vtex), scale); ureg_ADD(shader, ureg_writemask(t_vtex, TGSI_WRITEMASK_Y), ureg_src(t_vtex), ureg_imm1f(shader, 0.5f)); - ureg_MUL(shader, ureg_writemask(o_vtex[1], TGSI_WRITEMASK_XY), ureg_src(t_vtex), ureg_src(scale)); + ureg_MUL(shader, ureg_writemask(o_vtex[1], TGSI_WRITEMASK_XY), ureg_src(t_vtex), scale); ureg_ELSE(shader, &label); @@ -221,14 +214,16 @@ create_vert_shader(struct vl_mpeg12_mc_renderer *r, unsigned ref_frames, unsigne ureg_MOV(shader, o_interlaced, interlaced); if(count > 0) { - ureg_MUL(shader, ureg_writemask(scale, TGSI_WRITEMASK_XY), norm, ureg_imm1f(shader, 0.5f)); + scale = ureg_imm2f(shader, + 0.5f / r->buffer_width, + 0.5f / r->buffer_height); + for (i = 0; i < count; ++i) - ureg_MAD(shader, ureg_writemask(o_vmv[i], TGSI_WRITEMASK_XY), ureg_src(scale), vmv[i], ureg_src(t_vpos)); + ureg_MAD(shader, ureg_writemask(o_vmv[i], TGSI_WRITEMASK_XY), scale, vmv[i], ureg_src(t_vpos)); } ureg_release_temporary(shader, t_vtex); ureg_release_temporary(shader, t_vpos); - ureg_release_temporary(shader, scale); ureg_END(shader); @@ -685,13 +680,6 @@ init_buffers(struct vl_mpeg12_mc_renderer *r) for(i = 0; i < VL_NUM_MACROBLOCK_TYPES; ++i) init_mbtype_handler(r, i, vertex_elems); - r->vs_const_buf = pipe_buffer_create - ( - r->pipe->screen, - PIPE_BIND_CONSTANT_BUFFER, - sizeof(struct vertex_shader_consts) - ); - return true; } @@ -702,8 +690,6 @@ cleanup_buffers(struct vl_mpeg12_mc_renderer *r) assert(r); - pipe_resource_reference(&r->vs_const_buf, NULL); - for (i = 0; i < 3; ++i) { pipe_sampler_view_reference(&r->sampler_views.all[i], NULL); pipe_resource_reference(&r->vertex_bufs.all[i].buffer, NULL); @@ -869,29 +855,6 @@ flush_mbtype_handler(struct vl_mpeg12_mc_renderer *r, enum VL_MACROBLOCK_TYPE ty return num_macroblocks; } -static void -update_render_target(struct vl_mpeg12_mc_renderer *r) -{ - struct pipe_transfer *buf_transfer; - struct vertex_shader_consts *vs_consts; - - vs_consts = pipe_buffer_map - ( - r->pipe, r->vs_const_buf, - PIPE_TRANSFER_WRITE | PIPE_TRANSFER_DISCARD, - &buf_transfer - ); - - vs_consts->norm.x = 1.0f / r->surface->width; - vs_consts->norm.y = 1.0f / r->surface->height; - - pipe_buffer_unmap(r->pipe, r->vs_const_buf, buf_transfer); - - r->fb_state.cbufs[0] = r->surface; - - r->pipe->set_constant_buffer(r->pipe, PIPE_SHADER_VERTEX, 0, r->vs_const_buf); -} - static void get_motion_vectors(struct pipe_mpeg12_macroblock *mb, struct vertex2f mv[4]) { @@ -1203,7 +1166,6 @@ vl_mpeg12_mc_renderer_render_macroblocks(struct vl_mpeg12_mc_renderer pipe_surface_reference(&renderer->past, past); pipe_surface_reference(&renderer->future, future); renderer->fence = fence; - update_render_target(renderer); } while (num_macroblocks) { @@ -1251,6 +1213,7 @@ vl_mpeg12_mc_renderer_flush(struct vl_mpeg12_mc_renderer *renderer) upload_vertex_stream(renderer, num_verts); + renderer->fb_state.cbufs[0] = renderer->surface; renderer->pipe->bind_rasterizer_state(renderer->pipe, renderer->rs_state); renderer->pipe->set_framebuffer_state(renderer->pipe, &renderer->fb_state); renderer->pipe->set_viewport_state(renderer->pipe, &renderer->viewport); diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h index 0f110c0df35..6ce9cbe390c 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h @@ -78,7 +78,6 @@ struct vl_mpeg12_mc_renderer unsigned macroblocks_per_batch; struct pipe_viewport_state viewport; - struct pipe_resource *vs_const_buf; struct pipe_framebuffer_state fb_state; struct vl_idct idct_y, idct_cb, idct_cr;