diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/vl/vl_defines.h | 38 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_idct.c | 8 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_idct.h | 13 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c | 7 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h | 2 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_vertex_buffers.c | 4 | ||||
-rw-r--r-- | src/gallium/auxiliary/vl/vl_vertex_buffers.h | 7 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_video_context.c | 8 | ||||
-rw-r--r-- | src/gallium/drivers/softpipe/sp_video_context.h | 35 |
9 files changed, 82 insertions, 40 deletions
diff --git a/src/gallium/auxiliary/vl/vl_defines.h b/src/gallium/auxiliary/vl/vl_defines.h new file mode 100644 index 00000000000..668991f904f --- /dev/null +++ b/src/gallium/auxiliary/vl/vl_defines.h @@ -0,0 +1,38 @@ +/************************************************************************** + * + * Copyright 2011 Christian König + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef vl_defines_h +#define vl_defines_h + +/* constants usually used with all known codecs */ +#define MACROBLOCK_WIDTH 16 +#define MACROBLOCK_HEIGHT 16 + +#define BLOCK_WIDTH 8 +#define BLOCK_HEIGHT 8 + +#endif diff --git a/src/gallium/auxiliary/vl/vl_idct.c b/src/gallium/auxiliary/vl/vl_idct.c index e0307376a38..6b0010a04bb 100644 --- a/src/gallium/auxiliary/vl/vl_idct.c +++ b/src/gallium/auxiliary/vl/vl_idct.c @@ -27,6 +27,7 @@ #include "vl_idct.h" #include "vl_vertex_buffers.h" +#include "vl_defines.h" #include "util/u_draw.h" #include <assert.h> #include <pipe/p_context.h> @@ -37,9 +38,6 @@ #include <tgsi/tgsi_ureg.h> #include "vl_types.h" -#define BLOCK_WIDTH 8 -#define BLOCK_HEIGHT 8 - #define SCALE_FACTOR_16_TO_9 (32768.0f / 256.0f) #define NR_RENDER_TARGETS 4 @@ -504,6 +502,8 @@ cleanup_textures(struct vl_idct *idct, struct vl_idct_buffer *buffer) struct pipe_resource * vl_idct_upload_matrix(struct pipe_context *pipe) { + const float scale = sqrtf(SCALE_FACTOR_16_TO_9); + struct pipe_resource template, *matrix; struct pipe_transfer *buf_transfer; unsigned i, j, pitch; @@ -544,7 +544,7 @@ vl_idct_upload_matrix(struct pipe_context *pipe) for(i = 0; i < BLOCK_HEIGHT; ++i) for(j = 0; j < BLOCK_WIDTH; ++j) // transpose and scale - f[i * pitch + j] = const_matrix[j][i] * sqrtf(SCALE_FACTOR_16_TO_9); + f[i * pitch + j] = const_matrix[j][i] * scale; pipe->transfer_unmap(pipe, buf_transfer); pipe->transfer_destroy(pipe, buf_transfer); diff --git a/src/gallium/auxiliary/vl/vl_idct.h b/src/gallium/auxiliary/vl/vl_idct.h index 264ad2bd226..913034e7ab4 100644 --- a/src/gallium/auxiliary/vl/vl_idct.h +++ b/src/gallium/auxiliary/vl/vl_idct.h @@ -31,6 +31,9 @@ #include <pipe/p_state.h> #include "vl_vertex_buffers.h" +/* shader based inverse distinct cosinus transformation + * expect usage of vl_vertex_buffers as a todo list + */ struct vl_idct { struct pipe_context *pipe; @@ -57,6 +60,7 @@ struct vl_idct struct pipe_resource *matrix; }; +/* a set of buffers to work with */ struct vl_idct_buffer { struct pipe_viewport_state viewport[2]; @@ -88,25 +92,34 @@ struct vl_idct_buffer short *texels; }; +/* upload the idct matrix, which can be shared by all idct instances of a pipe */ struct pipe_resource *vl_idct_upload_matrix(struct pipe_context *pipe); +/* init an idct instance */ bool vl_idct_init(struct vl_idct *idct, struct pipe_context *pipe, unsigned buffer_width, unsigned buffer_height, unsigned blocks_x, unsigned blocks_y, int color_swizzle, struct pipe_resource *matrix); +/* destroy an idct instance */ void vl_idct_cleanup(struct vl_idct *idct); +/* init a buffer assosiated with agiven idct instance */ struct pipe_resource *vl_idct_init_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer); +/* cleanup a buffer of an idct instance */ void vl_idct_cleanup_buffer(struct vl_idct *idct, struct vl_idct_buffer *buffer); +/* map a buffer for use with vl_idct_add_block */ void vl_idct_map_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer); +/* add an block of to be tranformed data a the given x and y coordinate */ void vl_idct_add_block(struct vl_idct_buffer *buffer, unsigned x, unsigned y, short *block); +/* unmaps the buffers before flushing */ void vl_idct_unmap_buffers(struct vl_idct *idct, struct vl_idct_buffer *buffer); +/* flush the buffer and start rendering, vertex buffers needs to be setup before calling this */ void vl_idct_flush(struct vl_idct *idct, struct vl_idct_buffer *buffer, unsigned num_verts); #endif diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c index 5b675349481..df3373ebd88 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c @@ -26,6 +26,8 @@ **************************************************************************/ #include "vl_mpeg12_mc_renderer.h" +#include "vl_vertex_buffers.h" +#include "vl_defines.h" #include "util/u_draw.h" #include <assert.h> #include <pipe/p_context.h> @@ -38,11 +40,6 @@ #include <util/u_draw.h> #include <tgsi/tgsi_ureg.h> -#define MACROBLOCK_WIDTH 16 -#define MACROBLOCK_HEIGHT 16 -#define BLOCK_WIDTH 8 -#define BLOCK_HEIGHT 8 - enum VS_OUTPUT { VS_O_VPOS, diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h index db8f2fff749..805fec530b0 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h +++ b/src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h @@ -32,8 +32,6 @@ #include <pipe/p_state.h> #include <pipe/p_video_state.h> #include "vl_types.h" -#include "vl_idct.h" -#include "vl_vertex_buffers.h" struct pipe_context; struct pipe_macroblock; diff --git a/src/gallium/auxiliary/vl/vl_vertex_buffers.c b/src/gallium/auxiliary/vl/vl_vertex_buffers.c index 41e9809f744..c5366e8e4fc 100644 --- a/src/gallium/auxiliary/vl/vl_vertex_buffers.c +++ b/src/gallium/auxiliary/vl/vl_vertex_buffers.c @@ -26,10 +26,6 @@ **************************************************************************/ #include <assert.h> -#include <pipe/p_context.h> -#include <pipe/p_screen.h> -#include <util/u_memory.h> -#include <util/u_inlines.h> #include <util/u_format.h> #include "vl_vertex_buffers.h" #include "vl_types.h" diff --git a/src/gallium/auxiliary/vl/vl_vertex_buffers.h b/src/gallium/auxiliary/vl/vl_vertex_buffers.h index 0f7f47f2703..88e0270c170 100644 --- a/src/gallium/auxiliary/vl/vl_vertex_buffers.h +++ b/src/gallium/auxiliary/vl/vl_vertex_buffers.h @@ -27,11 +27,16 @@ #ifndef vl_vertex_buffers_h #define vl_vertex_buffers_h -#include <assert.h> #include <pipe/p_state.h> #include <pipe/p_video_state.h> #include "vl_types.h" +/* vertex buffers act as a todo list + * uploading all the usefull informations to video ram + * so a vertex shader can work with them + */ + +/* inputs to the vertex shaders */ enum VS_INPUT { VS_I_RECT, diff --git a/src/gallium/drivers/softpipe/sp_video_context.c b/src/gallium/drivers/softpipe/sp_video_context.c index 32398e4ff08..7e3519e694f 100644 --- a/src/gallium/drivers/softpipe/sp_video_context.c +++ b/src/gallium/drivers/softpipe/sp_video_context.c @@ -36,13 +36,7 @@ #include <util/u_rect.h> #include <util/u_video.h> #include <util/u_surface.h> -#include "sp_public.h" -#include "sp_texture.h" - -#define MACROBLOCK_WIDTH 16 -#define MACROBLOCK_HEIGHT 16 -#define BLOCK_WIDTH 8 -#define BLOCK_HEIGHT 8 +#include <vl/vl_defines.h> #define NUM_BUFFERS 2 diff --git a/src/gallium/drivers/softpipe/sp_video_context.h b/src/gallium/drivers/softpipe/sp_video_context.h index 2e3e4ec729f..04368a64a53 100644 --- a/src/gallium/drivers/softpipe/sp_video_context.h +++ b/src/gallium/drivers/softpipe/sp_video_context.h @@ -29,29 +29,13 @@ #define SP_VIDEO_CONTEXT_H #include <pipe/p_video_context.h> +#include <vl/vl_idct.h> #include <vl/vl_mpeg12_mc_renderer.h> #include <vl/vl_compositor.h> struct pipe_screen; struct pipe_context; -struct sp_mpeg12_buffer -{ - struct vl_vertex_buffer vertex_stream; - - union - { - struct pipe_vertex_buffer all[2]; - struct { - struct pipe_vertex_buffer quad, stream; - } individual; - } vertex_bufs; - - struct vl_idct_buffer idct_y, idct_cb, idct_cr; - - struct vl_mpeg12_mc_buffer mc; -}; - struct sp_mpeg12_context { struct pipe_video_context base; @@ -76,6 +60,23 @@ struct sp_mpeg12_context enum pipe_format decode_format; }; +struct sp_mpeg12_buffer +{ + struct vl_vertex_buffer vertex_stream; + + union + { + struct pipe_vertex_buffer all[2]; + struct { + struct pipe_vertex_buffer quad, stream; + } individual; + } vertex_bufs; + + struct vl_idct_buffer idct_y, idct_cb, idct_cr; + + struct vl_mpeg12_mc_buffer mc; +}; + struct pipe_video_context * sp_video_create(struct pipe_screen *screen, enum pipe_video_profile profile, enum pipe_video_chroma_format chroma_format, |