aboutsummaryrefslogtreecommitdiffstats
path: root/src/mesa/swrast/s_span.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/swrast/s_span.c')
-rw-r--r--src/mesa/swrast/s_span.c128
1 files changed, 26 insertions, 102 deletions
diff --git a/src/mesa/swrast/s_span.c b/src/mesa/swrast/s_span.c
index 0adab5ef163..4d0ccf5f1d0 100644
--- a/src/mesa/swrast/s_span.c
+++ b/src/mesa/swrast/s_span.c
@@ -35,6 +35,7 @@
#include "context.h"
#include "macros.h"
#include "imports.h"
+#include "image.h"
#include "s_atifragshader.h"
#include "s_alpha.h"
@@ -343,7 +344,9 @@ interpolate_colors(GLcontext *ctx, SWspan *span, GLboolean specular)
db = span->blueStep;
da = span->alphaStep;
}
+ /*
ASSERT(CHAN_TYPE == GL_FLOAT);
+ */
for (i = 0; i < n; i++) {
rgba[i][RCOMP] = r;
rgba[i][GCOMP] = g;
@@ -1217,107 +1220,30 @@ add_specular(GLcontext *ctx, SWspan *span)
static void
convert_color_type(GLcontext *ctx, SWspan *span, GLenum newType)
{
- const GLubyte *mask = span->array->mask;
- /* XXX NOTE: These all point to the same memory!
- * We need to use temporaray storage when converting, below.
- */
- GLubyte (*rgba1)[4] = span->array->color.sz1.rgba;
- GLushort (*rgba2)[4] = span->array->color.sz2.rgba;
- GLfloat (*rgba4)[4] = span->array->color.sz4.rgba;
+ GLvoid *src, *dst;
+ if (span->array->ChanType == GL_UNSIGNED_BYTE) {
+ src = span->array->color.sz1.rgba;
+ }
+ else if (span->array->ChanType == GL_UNSIGNED_BYTE) {
+ src = span->array->color.sz2.rgba;
+ }
+ else {
+ src = span->array->color.sz4.rgba;
+ }
+ if (newType == GL_UNSIGNED_BYTE) {
+ dst = span->array->color.sz1.rgba;
+ }
+ else if (newType == GL_UNSIGNED_BYTE) {
+ dst = span->array->color.sz2.rgba;
+ }
+ else {
+ dst = span->array->color.sz4.rgba;
+ }
- ASSERT(span->array->ChanType != newType);
+ _mesa_convert_colors(span->array->ChanType, src,
+ newType, dst,
+ span->end, span->array->mask);
- switch (span->array->ChanType) {
- case GL_UNSIGNED_BYTE:
- if (newType == GL_UNSIGNED_SHORT) {
- GLushort newVals[MAX_WIDTH][4];
- GLuint i;
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- newVals[i][RCOMP] = UBYTE_TO_USHORT(rgba1[i][RCOMP]);
- newVals[i][GCOMP] = UBYTE_TO_USHORT(rgba1[i][GCOMP]);
- newVals[i][BCOMP] = UBYTE_TO_USHORT(rgba1[i][BCOMP]);
- newVals[i][ACOMP] = UBYTE_TO_USHORT(rgba1[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba2, newVals, span->end * 4 * sizeof(GLushort));
- }
- else {
- GLfloat newVals[MAX_WIDTH][4];
- GLuint i;
- ASSERT(newType == GL_FLOAT);
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- newVals[i][RCOMP] = UBYTE_TO_FLOAT(rgba1[i][RCOMP]);
- newVals[i][GCOMP] = UBYTE_TO_FLOAT(rgba1[i][GCOMP]);
- newVals[i][BCOMP] = UBYTE_TO_FLOAT(rgba1[i][BCOMP]);
- newVals[i][ACOMP] = UBYTE_TO_FLOAT(rgba1[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba4, newVals, span->end * 4 * sizeof(GLfloat));
- }
- break;
- case GL_UNSIGNED_SHORT:
- if (newType == GL_UNSIGNED_BYTE) {
- GLubyte newVals[MAX_WIDTH][4];
- GLuint i;
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- newVals[i][RCOMP] = USHORT_TO_UBYTE(rgba2[i][RCOMP]);
- newVals[i][GCOMP] = USHORT_TO_UBYTE(rgba2[i][GCOMP]);
- newVals[i][BCOMP] = USHORT_TO_UBYTE(rgba2[i][BCOMP]);
- newVals[i][ACOMP] = USHORT_TO_UBYTE(rgba2[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba1, newVals, span->end * 4 * sizeof(GLubyte));
- }
- else {
- GLfloat newVals[MAX_WIDTH][4];
- GLuint i;
- ASSERT(newType == GL_FLOAT);
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- newVals[i][RCOMP] = USHORT_TO_FLOAT(rgba2[i][RCOMP]);
- newVals[i][GCOMP] = USHORT_TO_FLOAT(rgba2[i][GCOMP]);
- newVals[i][BCOMP] = USHORT_TO_FLOAT(rgba2[i][BCOMP]);
- newVals[i][ACOMP] = USHORT_TO_FLOAT(rgba2[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba4, newVals, span->end * 4 * sizeof(GLfloat));
- }
- break;
- case GL_FLOAT:
- if (newType == GL_UNSIGNED_BYTE) {
- GLubyte newVals[MAX_WIDTH][4];
- GLuint i;
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][RCOMP], rgba4[i][RCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][GCOMP], rgba4[i][GCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][BCOMP], rgba4[i][BCOMP]);
- UNCLAMPED_FLOAT_TO_UBYTE(newVals[i][ACOMP], rgba4[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba1, newVals, span->end * 4 * sizeof(GLubyte));
- }
- else {
- GLushort newVals[MAX_WIDTH][4];
- GLuint i;
- ASSERT(newType == GL_UNSIGNED_SHORT);
- for (i = 0; i < span->end; i++) {
- if (mask[i]) {
- UNCLAMPED_FLOAT_TO_USHORT(newVals[i][RCOMP], rgba4[i][RCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(newVals[i][GCOMP], rgba4[i][GCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(newVals[i][BCOMP], rgba4[i][BCOMP]);
- UNCLAMPED_FLOAT_TO_USHORT(newVals[i][ACOMP], rgba4[i][ACOMP]);
- }
- }
- _mesa_memcpy(rgba2, newVals, span->end * 4 * sizeof(GLushort));
- }
- break;
- default:
- _mesa_problem(ctx, "Invalid datatype in convert_color_type");
- }
span->array->ChanType = newType;
}
@@ -1594,7 +1520,7 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)
for (buf = 0; buf < numDrawBuffers; buf++) {
struct gl_renderbuffer *rb = fb->_ColorDrawBuffers[output][buf];
- ASSERT(rb->_BaseFormat == GL_RGBA);
+ ASSERT(rb->_BaseFormat == GL_RGBA || rb->_BaseFormat == GL_RGB);
if (ctx->Color._LogicOpEnabled) {
_swrast_logicop_rgba_span(ctx, rb, span);
@@ -1610,7 +1536,6 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)
if (span->arrayMask & SPAN_XY) {
/* array of pixel coords */
ASSERT(rb->PutValues);
- ASSERT(rb->_BaseFormat == GL_RGB || rb->_BaseFormat == GL_RGBA);
rb->PutValues(ctx, rb, span->end,
span->array->x, span->array->y,
span->array->rgba, span->array->mask);
@@ -1618,7 +1543,6 @@ _swrast_write_rgba_span( GLcontext *ctx, SWspan *span)
else {
/* horizontal run of pixels */
ASSERT(rb->PutRow);
- ASSERT(rb->_BaseFormat == GL_RGB || rb->_BaseFormat == GL_RGBA);
rb->PutRow(ctx, rb, span->end, span->x, span->y, span->array->rgba,
span->writeAll ? NULL: span->array->mask);
}