summaryrefslogtreecommitdiff
path: root/src/mesa/state_tracker
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/state_tracker')
-rw-r--r--src/mesa/state_tracker/st_cb_clear.c29
-rw-r--r--src/mesa/state_tracker/st_cb_drawpixels.c12
-rw-r--r--src/mesa/state_tracker/st_draw.c72
-rw-r--r--src/mesa/state_tracker/st_draw.h12
4 files changed, 111 insertions, 14 deletions
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index f6c65ff466..bd050ca2cd 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -38,11 +38,17 @@
#include "st_context.h"
#include "st_cb_clear.h"
#include "st_cb_fbo.h"
+#include "st_draw.h"
#include "st_program.h"
#include "st_public.h"
+
#include "pipe/p_context.h"
+#include "pipe/p_state.h"
#include "pipe/p_defines.h"
+#include "pipe/p_winsys.h"
+
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
+
#include "vf/vf.h"
@@ -215,8 +221,8 @@ draw_quad(GLcontext *ctx,
const GLfloat color[4])
{
static const GLuint attribs[2] = {
- VF_ATTRIB_POS,
- VF_ATTRIB_COLOR0
+ 0, /* pos */
+ 3 /* color */
};
GLfloat verts[4][2][4]; /* four verts, two attribs, XYZW */
GLuint i;
@@ -244,8 +250,7 @@ draw_quad(GLcontext *ctx,
verts[i][1][3] = color[3];
}
- ctx->st->pipe->draw_vertices(ctx->st->pipe, PIPE_PRIM_QUADS,
- 4, (GLfloat *) verts, 2, attribs);
+ st_draw_vertices(ctx, PIPE_PRIM_QUADS, 4, (float *) verts, 2, attribs);
}
@@ -343,6 +348,21 @@ clear_with_quad(GLcontext *ctx,
st->pipe->set_fs_state(st->pipe, &fs);
}
+ /* vertex shader state: color/position pass-through */
+ {
+ static struct st_vertex_program *stvp = NULL;
+ struct pipe_shader_state vs;
+ if (!stvp) {
+ stvp = make_vertex_shader(st);
+ }
+ memset(&vs, 0, sizeof(vs));
+ vs.inputs_read = stvp->Base.Base.InputsRead;
+ vs.outputs_written = stvp->Base.Base.OutputsWritten;
+ vs.tokens = &stvp->tokens[0];
+ vs.constants = NULL;
+ st->pipe->set_vs_state(st->pipe, &vs);
+ }
+
/* draw quad matching scissor rect (XXX verify coord round-off) */
draw_quad(ctx, x0, y0, x1, y1, ctx->Depth.Clear, ctx->Color.ClearColor);
@@ -351,6 +371,7 @@ clear_with_quad(GLcontext *ctx,
st->pipe->set_blend_state(st->pipe, &st->state.blend);
st->pipe->set_depth_state(st->pipe, &st->state.depth);
st->pipe->set_fs_state(st->pipe, &st->state.fs);
+ st->pipe->set_vs_state(st->pipe, &st->state.vs);
st->pipe->set_setup_state(st->pipe, &st->state.setup);
st->pipe->set_stencil_state(st->pipe, &st->state.stencil);
/* OR:
diff --git a/src/mesa/state_tracker/st_cb_drawpixels.c b/src/mesa/state_tracker/st_cb_drawpixels.c
index 11261f1d99..1aa56fcf8b 100644
--- a/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -38,6 +38,7 @@
#include "st_program.h"
#include "st_cb_drawpixels.h"
#include "st_cb_texture.h"
+#include "st_draw.h"
#include "st_format.h"
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
@@ -193,12 +194,12 @@ free_mipmap_tree(struct pipe_context *pipe, struct pipe_mipmap_tree *mt)
* Y=0=top
*/
static void
-draw_quad(struct st_context *st, GLfloat x0, GLfloat y0, GLfloat z,
+draw_quad(GLcontext *ctx, GLfloat x0, GLfloat y0, GLfloat z,
GLfloat x1, GLfloat y1)
{
static const GLuint attribs[2] = {
- VF_ATTRIB_POS,
- VF_ATTRIB_TEX0
+ 0, /* pos */
+ 8 /* tex0 */
};
GLfloat verts[4][2][4]; /* four verts, two attribs, XYZW */
GLuint i;
@@ -235,8 +236,7 @@ draw_quad(struct st_context *st, GLfloat x0, GLfloat y0, GLfloat z,
verts[i][1][3] = 1.0; /*Q*/
}
- st->pipe->draw_vertices(st->pipe, PIPE_PRIM_QUADS,
- 4, (GLfloat *) verts, 2, attribs);
+ st_draw_vertices(ctx, PIPE_PRIM_QUADS, 4, (GLfloat *) verts, 2, attribs);
}
@@ -310,7 +310,7 @@ draw_textured_quad(GLcontext *ctx, GLint x, GLint y, GLfloat z,
y1 = ctx->DrawBuffer->Height - 1 - (y + height * ctx->Pixel.ZoomY);
/* draw textured quad */
- draw_quad(ctx->st, x0, y0, z, x1, y1);
+ draw_quad(ctx, x0, y0, z, x1, y1);
/* restore GL state */
pipe->set_setup_state(pipe, &ctx->st->state.setup);
diff --git a/src/mesa/state_tracker/st_draw.c b/src/mesa/state_tracker/st_draw.c
index e82f7cff2b..a409dd9764 100644
--- a/src/mesa/state_tracker/st_draw.c
+++ b/src/mesa/state_tracker/st_draw.c
@@ -66,7 +66,9 @@
static GLboolean draw( GLcontext * ctx, struct tnl_pipeline_stage *stage )
{
struct st_context *st = st_context(ctx);
+#if 0
struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb;
+#endif
/* Validate driver and pipe state:
*/
@@ -74,7 +76,9 @@ static GLboolean draw( GLcontext * ctx, struct tnl_pipeline_stage *stage )
/* Call into the new draw code to handle the VB:
*/
+#if 0
st->pipe->draw_vb( st->pipe, VB );
+#endif
/* Finished
*/
@@ -289,6 +293,72 @@ draw_vbo(GLcontext *ctx,
+/**
+ * Utility function for drawing simple primitives (such as quads for
+ * glClear and glDrawPixels). Coordinates are in screen space.
+ * \param mode one of PIPE_PRIM_x
+ * \param numVertex number of vertices
+ * \param verts vertex data (all attributes are float[4])
+ * \param numAttribs number of attributes per vertex
+ * \param attribs index of each attribute (0=pos, 3=color, etc)
+ */
+void
+st_draw_vertices(GLcontext *ctx, unsigned prim,
+ unsigned numVertex, float *verts,
+ unsigned numAttribs, const unsigned attribs[])
+{
+ const float width = ctx->DrawBuffer->Width;
+ const float height = ctx->DrawBuffer->Height;
+ const unsigned vertex_bytes = numVertex * numAttribs * 4 * sizeof(float);
+ struct pipe_context *pipe = ctx->st->pipe;
+ struct pipe_buffer_handle *vbuf;
+ struct pipe_vertex_buffer vbuffer;
+ struct pipe_vertex_element velement;
+ unsigned i;
+
+ assert(numAttribs > 0);
+ assert(attribs[0] == 0); /* position */
+
+ /* convert to clip coords */
+ for (i = 0; i < numVertex; i++) {
+ float x = verts[i * numAttribs * 4 + 0];
+ float y = verts[i * numAttribs * 4 + 1];
+ x = x / width * 2.0 - 1.0;
+ y = y / height * 2.0 - 1.0;
+ verts[i * numAttribs * 4 + 0] = x;
+ verts[i * numAttribs * 4 + 1] = y;
+ }
+
+ /* XXX create one-time */
+ vbuf = pipe->winsys->buffer_create(pipe->winsys, 32);
+ pipe->winsys->buffer_data(pipe->winsys, vbuf, vertex_bytes, verts);
+
+ /* tell pipe about the vertex buffer */
+ vbuffer.buffer = vbuf;
+ vbuffer.pitch = numAttribs * 4 * sizeof(float); /* vertex size */
+ vbuffer.buffer_offset = 0;
+ pipe->set_vertex_buffer(pipe, 0, &vbuffer);
+
+ /* tell pipe about the vertex attributes */
+ for (i = 0; i < numAttribs; i++) {
+ velement.src_offset = i * 4 * sizeof(GLfloat);
+ velement.vertex_buffer_index = 0;
+ velement.src_format = PIPE_FORMAT_R32G32B32A32_FLOAT;
+ velement.dst_offset = 0;
+ pipe->set_vertex_element(pipe, attribs[i], &velement);
+ }
+
+ /* draw */
+ pipe->draw_arrays(pipe, prim, 0, numVertex);
+
+ /* XXX: do one-time */
+ pipe->winsys->buffer_unreference(pipe->winsys, &vbuf);
+}
+
+
+
+
+
/* This is all a hack to keep using tnl until we have vertex programs
* up and running.
@@ -307,8 +377,10 @@ void st_init_draw( struct st_context *st )
vbo->draw_prims = draw_vbo;
#endif
+#if 0
_tnl_destroy_pipeline( ctx );
_tnl_install_pipeline( ctx, st_pipeline );
+#endif
/* USE_NEW_DRAW */
_tnl_ProgramCacheInit( ctx );
diff --git a/src/mesa/state_tracker/st_draw.h b/src/mesa/state_tracker/st_draw.h
index 0afadab577..0005fbc51f 100644
--- a/src/mesa/state_tracker/st_draw.h
+++ b/src/mesa/state_tracker/st_draw.h
@@ -1,6 +1,6 @@
/**************************************************************************
*
- * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright 2004 Tungsten Graphics, Inc., Cedar Park, Texas.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
@@ -34,11 +34,15 @@
#ifndef ST_DRAW_H
#define ST_DRAW_H
+
void st_init_draw( struct st_context *st );
+
void st_destroy_draw( struct st_context *st );
-/** XXX temporary here */
-void st_clear(struct st_context *st, GLboolean color, GLboolean depth,
- GLboolean stencil);
+void
+st_draw_vertices(GLcontext *ctx, unsigned prim,
+ unsigned numVertex, float *verts,
+ unsigned numAttribs, const unsigned attribs[]);
+
#endif