summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/auxiliary/vl/vl_defines.h38
-rw-r--r--src/gallium/auxiliary/vl/vl_idct.c8
-rw-r--r--src/gallium/auxiliary/vl/vl_idct.h13
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.c7
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_mc_renderer.h2
-rw-r--r--src/gallium/auxiliary/vl/vl_vertex_buffers.c4
-rw-r--r--src/gallium/auxiliary/vl/vl_vertex_buffers.h7
-rw-r--r--src/gallium/drivers/softpipe/sp_video_context.c8
-rw-r--r--src/gallium/drivers/softpipe/sp_video_context.h35
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,