mesa: nicer vertex setup

This commit is contained in:
Brian Paul
2009-09-10 19:56:35 -06:00
parent 4781c1f459
commit 0ef5b62787
+137 -127
View File
@@ -63,6 +63,10 @@
#include "drivers/common/meta.h"
/** Return offset in bytes of the field within a vertex struct */
#define OFFSET(FIELD) ((void *) offsetof(struct vertex, FIELD))
/**
* State which we may save/restore across meta ops.
* XXX this may be incomplete...
@@ -988,7 +992,10 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,
const GLint srcH = abs(srcY1 - srcY0);
const GLboolean srcFlipX = srcX1 < srcX0;
const GLboolean srcFlipY = srcY1 < srcY0;
GLfloat verts[4][4]; /* four verts of X,Y,S,T */
struct vertex {
GLfloat x, y, s, t;
};
struct vertex verts[4];
GLboolean newTex;
if (srcW > maxTexSize || srcH > maxTexSize) {
@@ -1027,10 +1034,8 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (2 * sizeof(GLfloat)));
_mesa_VertexPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -1043,23 +1048,23 @@ _mesa_meta_blit_framebuffer(GLcontext *ctx,
/* vertex positions/texcoords (after texture allocation!) */
{
verts[0][0] = (GLfloat) dstX0;
verts[0][1] = (GLfloat) dstY0;
verts[1][0] = (GLfloat) dstX1;
verts[1][1] = (GLfloat) dstY0;
verts[2][0] = (GLfloat) dstX1;
verts[2][1] = (GLfloat) dstY1;
verts[3][0] = (GLfloat) dstX0;
verts[3][1] = (GLfloat) dstY1;
verts[0].x = (GLfloat) dstX0;
verts[0].y = (GLfloat) dstY0;
verts[1].x = (GLfloat) dstX1;
verts[1].y = (GLfloat) dstY0;
verts[2].x = (GLfloat) dstX1;
verts[2].y = (GLfloat) dstY1;
verts[3].x = (GLfloat) dstX0;
verts[3].y = (GLfloat) dstY1;
verts[0][2] = 0.0F;
verts[0][3] = 0.0F;
verts[1][2] = tex->Sright;
verts[1][3] = 0.0F;
verts[2][2] = tex->Sright;
verts[2][3] = tex->Ttop;
verts[3][2] = 0.0F;
verts[3][3] = tex->Ttop;
verts[0].s = 0.0F;
verts[0].t = 0.0F;
verts[1].s = tex->Sright;
verts[1].t = 0.0F;
verts[2].s = tex->Sright;
verts[2].t = tex->Ttop;
verts[3].s = 0.0F;
verts[3].t = tex->Ttop;
/* upload new vertex data */
_mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);
@@ -1125,7 +1130,10 @@ void
_mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)
{
struct clear_state *clear = &ctx->Meta->Clear;
GLfloat verts[4][7]; /* four verts of X,Y,Z,R,G,B,A */
struct vertex {
GLfloat x, y, z, r, g, b, a;
};
struct vertex verts[4];
/* save all state but scissor, pixel pack/unpack */
GLbitfield metaSave = META_ALL - META_SCISSOR - META_PIXEL_STORE;
@@ -1150,10 +1158,8 @@ _mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_ColorPointer(4, GL_FLOAT, sizeof(verts[0]),
(void *) (3 * sizeof(GLfloat)));
_mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_ColorPointer(4, GL_FLOAT, sizeof(struct vertex), OFFSET(r));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_COLOR_ARRAY);
}
@@ -1203,22 +1209,25 @@ _mesa_meta_clear(GLcontext *ctx, GLbitfield buffers)
const GLfloat z = 1.0 - 2.0 * ctx->Depth.Clear;
GLuint i;
verts[0][0] = x0;
verts[0][1] = y0;
verts[0][2] = z;
verts[1][0] = x1;
verts[1][1] = y0;
verts[1][2] = z;
verts[2][0] = x1;
verts[2][1] = y1;
verts[2][2] = z;
verts[3][0] = x0;
verts[3][1] = y1;
verts[3][2] = z;
verts[0].x = x0;
verts[0].y = y0;
verts[0].z = z;
verts[1].x = x1;
verts[1].y = y0;
verts[1].z = z;
verts[2].x = x1;
verts[2].y = y1;
verts[2].z = z;
verts[3].x = x0;
verts[3].y = y1;
verts[3].z = z;
/* vertex colors */
for (i = 0; i < 4; i++) {
COPY_4FV(&verts[i][3], ctx->Color.ClearColor);
verts[i].r = ctx->Color.ClearColor[0];
verts[i].g = ctx->Color.ClearColor[1];
verts[i].b = ctx->Color.ClearColor[2];
verts[i].a = ctx->Color.ClearColor[3];
}
/* upload new vertex data */
@@ -1243,7 +1252,10 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,
{
struct copypix_state *copypix = &ctx->Meta->CopyPix;
struct temp_texture *tex = get_temp_texture(ctx);
GLfloat verts[4][5]; /* four verts of X,Y,Z,S,T */
struct vertex {
GLfloat x, y, z, s, t;
};
struct vertex verts[4];
GLboolean newTex;
GLenum intFormat = GL_RGBA;
@@ -1281,10 +1293,8 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (3 * sizeof(GLfloat)));
_mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -1303,26 +1313,26 @@ _mesa_meta_copy_pixels(GLcontext *ctx, GLint srcX, GLint srcY,
const GLfloat dstY1 = dstY + height * ctx->Pixel.ZoomY;
const GLfloat z = ctx->Current.RasterPos[2];
verts[0][0] = dstX0;
verts[0][1] = dstY0;
verts[0][2] = z;
verts[0][3] = 0.0F;
verts[0][4] = 0.0F;
verts[1][0] = dstX1;
verts[1][1] = dstY0;
verts[1][2] = z;
verts[1][3] = tex->Sright;
verts[1][4] = 0.0F;
verts[2][0] = dstX1;
verts[2][1] = dstY1;
verts[2][2] = z;
verts[2][3] = tex->Sright;
verts[2][4] = tex->Ttop;
verts[3][0] = dstX0;
verts[3][1] = dstY1;
verts[3][2] = z;
verts[3][3] = 0.0F;
verts[3][4] = tex->Ttop;
verts[0].x = dstX0;
verts[0].y = dstY0;
verts[0].z = z;
verts[0].s = 0.0F;
verts[0].t = 0.0F;
verts[1].x = dstX1;
verts[1].y = dstY0;
verts[1].z = z;
verts[1].s = tex->Sright;
verts[1].t = 0.0F;
verts[2].x = dstX1;
verts[2].y = dstY1;
verts[2].z = z;
verts[2].s = tex->Sright;
verts[2].t = tex->Ttop;
verts[3].x = dstX0;
verts[3].y = dstY1;
verts[3].z = z;
verts[3].s = 0.0F;
verts[3].t = tex->Ttop;
/* upload new vertex data */
_mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);
@@ -1496,7 +1506,10 @@ _mesa_meta_draw_pixels(GLcontext *ctx,
struct temp_texture *tex = get_temp_texture(ctx);
const struct gl_pixelstore_attrib unpackSave = ctx->Unpack;
const GLuint origStencilMask = ctx->Stencil.WriteMask[0];
GLfloat verts[4][5]; /* four verts of X,Y,Z,S,T */
struct vertex {
GLfloat x, y, z, s, t;
};
struct vertex verts[4];
GLenum texIntFormat;
GLboolean fallback, newTex;
GLbitfield metaExtraSave = 0x0;
@@ -1593,10 +1606,8 @@ _mesa_meta_draw_pixels(GLcontext *ctx,
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (3 * sizeof(GLfloat)));
_mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
}
@@ -1615,26 +1626,26 @@ _mesa_meta_draw_pixels(GLcontext *ctx,
const GLfloat y1 = y + height * ctx->Pixel.ZoomY;
const GLfloat z = ctx->Current.RasterPos[2];
verts[0][0] = x0;
verts[0][1] = y0;
verts[0][2] = z;
verts[0][3] = 0.0F;
verts[0][4] = 0.0F;
verts[1][0] = x1;
verts[1][1] = y0;
verts[1][2] = z;
verts[1][3] = tex->Sright;
verts[1][4] = 0.0F;
verts[2][0] = x1;
verts[2][1] = y1;
verts[2][2] = z;
verts[2][3] = tex->Sright;
verts[2][4] = tex->Ttop;
verts[3][0] = x0;
verts[3][1] = y1;
verts[3][2] = z;
verts[3][3] = 0.0F;
verts[3][4] = tex->Ttop;
verts[0].x = x0;
verts[0].y = y0;
verts[0].z = z;
verts[0].s = 0.0F;
verts[0].t = 0.0F;
verts[1].x = x1;
verts[1].y = y0;
verts[1].z = z;
verts[1].s = tex->Sright;
verts[1].t = 0.0F;
verts[2].x = x1;
verts[2].y = y1;
verts[2].z = z;
verts[2].s = tex->Sright;
verts[2].t = tex->Ttop;
verts[3].x = x0;
verts[3].y = y1;
verts[3].z = z;
verts[3].s = 0.0F;
verts[3].t = tex->Ttop;
/* upload new vertex data */
_mesa_BufferSubDataARB(GL_ARRAY_BUFFER_ARB, 0, sizeof(verts), verts);
@@ -1733,7 +1744,10 @@ _mesa_meta_bitmap(GLcontext *ctx,
struct temp_texture *tex = get_bitmap_temp_texture(ctx);
const GLenum texIntFormat = GL_ALPHA;
const struct gl_pixelstore_attrib unpackSave = *unpack;
GLfloat verts[4][9]; /* four verts of X,Y,Z,S,T,R,G,B,A */
struct vertex {
GLfloat x, y, z, s, t, r, g, b, a;
};
struct vertex verts[4];
GLboolean newTex;
GLubyte *bitmap8;
@@ -1776,13 +1790,9 @@ _mesa_meta_bitmap(GLcontext *ctx,
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(3, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (3 * sizeof(GLfloat)));
_mesa_ColorPointer(4, GL_FLOAT, sizeof(verts[0]),
(void *) (5 * sizeof(GLfloat)));
_mesa_VertexPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_TexCoordPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(s));
_mesa_ColorPointer(4, GL_FLOAT, sizeof(struct vertex), OFFSET(r));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
_mesa_EnableClientState(GL_COLOR_ARRAY);
@@ -1803,32 +1813,32 @@ _mesa_meta_bitmap(GLcontext *ctx,
const GLfloat z = ctx->Current.RasterPos[2];
GLuint i;
verts[0][0] = x0;
verts[0][1] = y0;
verts[0][2] = z;
verts[0][3] = 0.0F;
verts[0][4] = 0.0F;
verts[1][0] = x1;
verts[1][1] = y0;
verts[1][2] = z;
verts[1][3] = tex->Sright;
verts[1][4] = 0.0F;
verts[2][0] = x1;
verts[2][1] = y1;
verts[2][2] = z;
verts[2][3] = tex->Sright;
verts[2][4] = tex->Ttop;
verts[3][0] = x0;
verts[3][1] = y1;
verts[3][2] = z;
verts[3][3] = 0.0F;
verts[3][4] = tex->Ttop;
verts[0].x = x0;
verts[0].y = y0;
verts[0].z = z;
verts[0].s = 0.0F;
verts[0].t = 0.0F;
verts[1].x = x1;
verts[1].y = y0;
verts[1].z = z;
verts[1].s = tex->Sright;
verts[1].t = 0.0F;
verts[2].x = x1;
verts[2].y = y1;
verts[2].z = z;
verts[2].s = tex->Sright;
verts[2].t = tex->Ttop;
verts[3].x = x0;
verts[3].y = y1;
verts[3].z = z;
verts[3].s = 0.0F;
verts[3].t = tex->Ttop;
for (i = 0; i < 4; i++) {
verts[i][5] = ctx->Current.RasterColor[0];
verts[i][6] = ctx->Current.RasterColor[1];
verts[i][7] = ctx->Current.RasterColor[2];
verts[i][8] = ctx->Current.RasterColor[3];
verts[i].r = ctx->Current.RasterColor[0];
verts[i].g = ctx->Current.RasterColor[1];
verts[i].b = ctx->Current.RasterColor[2];
verts[i].a = ctx->Current.RasterColor[3];
}
/* upload new vertex data */
@@ -1870,7 +1880,10 @@ _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target,
struct gl_texture_object *texObj)
{
struct gen_mipmap_state *mipmap = &ctx->Meta->Mipmap;
struct { GLfloat x, y, s, t, r; } verts[4];
struct vertex {
GLfloat x, y, s, t, r;
};
struct vertex verts[4];
const GLuint baseLevel = texObj->BaseLevel;
const GLuint maxLevel = texObj->MaxLevel;
const GLenum minFilterSave = texObj->MinFilter;
@@ -1911,11 +1924,8 @@ _mesa_meta_generate_mipmap(GLcontext *ctx, GLenum target,
NULL, GL_DYNAMIC_DRAW_ARB);
/* setup vertex arrays */
_mesa_VertexPointer(2, GL_FLOAT, sizeof(verts[0]),
(void *) (0 * sizeof(GLfloat)));
_mesa_TexCoordPointer(3, GL_FLOAT, sizeof(verts[0]),
(void *) (2 * sizeof(GLfloat)));
_mesa_VertexPointer(2, GL_FLOAT, sizeof(struct vertex), OFFSET(x));
_mesa_TexCoordPointer(3, GL_FLOAT, sizeof(struct vertex), OFFSET(s));
_mesa_EnableClientState(GL_VERTEX_ARRAY);
_mesa_EnableClientState(GL_TEXTURE_COORD_ARRAY);
}