[Mesa-dev] [PATCH] st/mesa: fix integer texture border color for some formats
Marek Olšák
maraeo at gmail.com
Mon Oct 15 06:24:55 PDT 2012
And the clear color too, though that maybe an issue only with GL_RGB if it's
actually RGBA in the driver.
NOTE: This is a candidate for the stable branches.
---
src/mesa/state_tracker/st_atom_sampler.c | 8 +-
src/mesa/state_tracker/st_cb_clear.c | 13 +++-
src/mesa/state_tracker/st_format.c | 118 ++++++++++++++++++++----------
src/mesa/state_tracker/st_format.h | 2 +-
4 files changed, 99 insertions(+), 42 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index adcc7b5..1a58a65 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -34,6 +34,7 @@
#include "main/macros.h"
#include "main/mtypes.h"
+#include "main/glformats.h"
#include "main/samplerobj.h"
#include "main/texobj.h"
@@ -172,12 +173,17 @@ convert_sampler(struct st_context *st,
msamp->BorderColor.ui[2] ||
msamp->BorderColor.ui[3]) {
struct gl_texture_image *teximg;
+ GLboolean is_integer = GL_FALSE;
teximg = texobj->Image[0][texobj->BaseLevel];
+ if (teximg) {
+ is_integer = _mesa_is_enum_format_integer(teximg->InternalFormat);
+ }
+
st_translate_color(msamp->BorderColor.f,
teximg ? teximg->_BaseFormat : GL_RGBA,
- sampler->border_color.f);
+ sampler->border_color.f, is_integer);
}
sampler->max_anisotropy = (msamp->MaxAnisotropy == 1.0 ?
diff --git a/src/mesa/state_tracker/st_cb_clear.c b/src/mesa/state_tracker/st_cb_clear.c
index e731b6b..4795baf 100644
--- a/src/mesa/state_tracker/st_cb_clear.c
+++ b/src/mesa/state_tracker/st_cb_clear.c
@@ -37,6 +37,7 @@
#include "main/accum.h"
#include "main/formats.h"
#include "main/macros.h"
+#include "main/glformats.h"
#include "program/prog_instruction.h"
#include "st_context.h"
#include "st_atom.h"
@@ -301,9 +302,12 @@ clear_with_quad(struct gl_context *ctx,
cso_set_geometry_shader_handle(st->cso_context, NULL);
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
+ struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0];
+ GLboolean is_integer = _mesa_is_enum_format_integer(rb->InternalFormat);
+
st_translate_color(ctx->Color.ClearColor.f,
- ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
- clearColor.f);
+ ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
+ clearColor.f, is_integer);
}
/* draw quad matching scissor rect */
@@ -540,9 +544,12 @@ st_Clear(struct gl_context *ctx, GLbitfield mask)
clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
+ struct gl_renderbuffer *rb = ctx->DrawBuffer->_ColorDrawBuffers[0];
+ GLboolean is_integer = _mesa_is_enum_format_integer(rb->InternalFormat);
+
st_translate_color(ctx->Color.ClearColor.f,
ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
- clearColor.f);
+ clearColor.f, is_integer);
}
st->pipe->clear(st->pipe, clear_buffers, &clearColor,
diff --git a/src/mesa/state_tracker/st_format.c b/src/mesa/state_tracker/st_format.c
index a9ff2cd..7f49540 100644
--- a/src/mesa/state_tracker/st_format.c
+++ b/src/mesa/state_tracker/st_format.c
@@ -1687,43 +1687,87 @@ st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
*/
void
st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
- GLfloat colorOut[4])
+ GLfloat colorOut[4], GLboolean is_integer)
{
- switch (baseFormat) {
- case GL_RED:
- colorOut[0] = colorIn[0];
- colorOut[1] = 0.0F;
- colorOut[2] = 0.0F;
- colorOut[3] = 1.0F;
- break;
- case GL_RG:
- colorOut[0] = colorIn[0];
- colorOut[1] = colorIn[1];
- colorOut[2] = 0.0F;
- colorOut[3] = 1.0F;
- break;
- case GL_RGB:
- colorOut[0] = colorIn[0];
- colorOut[1] = colorIn[1];
- colorOut[2] = colorIn[2];
- colorOut[3] = 1.0F;
- break;
- case GL_ALPHA:
- colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
- colorOut[3] = colorIn[3];
- break;
- case GL_LUMINANCE:
- colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
- colorOut[3] = 1.0;
- break;
- case GL_LUMINANCE_ALPHA:
- colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
- colorOut[3] = colorIn[3];
- break;
- case GL_INTENSITY:
- colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
- break;
- default:
- COPY_4V(colorOut, colorIn);
+ if (is_integer) {
+ int *icolorIn = (int*)colorIn;
+ int *icolorOut = (int*)colorOut;
+
+ switch (baseFormat) {
+ case GL_RED:
+ icolorOut[0] = icolorIn[0];
+ icolorOut[1] = 0;
+ icolorOut[2] = 0;
+ icolorOut[3] = 1;
+ break;
+ case GL_RG:
+ icolorOut[0] = icolorIn[0];
+ icolorOut[1] = icolorIn[1];
+ icolorOut[2] = 0;
+ icolorOut[3] = 1;
+ break;
+ case GL_RGB:
+ icolorOut[0] = icolorIn[0];
+ icolorOut[1] = icolorIn[1];
+ icolorOut[2] = icolorIn[2];
+ icolorOut[3] = 1;
+ break;
+ case GL_ALPHA:
+ icolorOut[0] = icolorOut[1] = icolorOut[2] = 0;
+ icolorOut[3] = icolorIn[3];
+ break;
+ case GL_LUMINANCE:
+ icolorOut[0] = icolorOut[1] = icolorOut[2] = icolorIn[0];
+ icolorOut[3] = 1;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ icolorOut[0] = icolorOut[1] = icolorOut[2] = icolorIn[0];
+ icolorOut[3] = icolorIn[3];
+ break;
+ case GL_INTENSITY:
+ icolorOut[0] = icolorOut[1] = icolorOut[2] = icolorOut[3] = icolorIn[0];
+ break;
+ default:
+ COPY_4V(icolorOut, icolorIn);
+ }
+ }
+ else {
+ switch (baseFormat) {
+ case GL_RED:
+ colorOut[0] = colorIn[0];
+ colorOut[1] = 0.0F;
+ colorOut[2] = 0.0F;
+ colorOut[3] = 1.0F;
+ break;
+ case GL_RG:
+ colorOut[0] = colorIn[0];
+ colorOut[1] = colorIn[1];
+ colorOut[2] = 0.0F;
+ colorOut[3] = 1.0F;
+ break;
+ case GL_RGB:
+ colorOut[0] = colorIn[0];
+ colorOut[1] = colorIn[1];
+ colorOut[2] = colorIn[2];
+ colorOut[3] = 1.0F;
+ break;
+ case GL_ALPHA:
+ colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
+ colorOut[3] = colorIn[3];
+ break;
+ case GL_LUMINANCE:
+ colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
+ colorOut[3] = 1.0;
+ break;
+ case GL_LUMINANCE_ALPHA:
+ colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
+ colorOut[3] = colorIn[3];
+ break;
+ case GL_INTENSITY:
+ colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
+ break;
+ default:
+ COPY_4V(colorOut, colorIn);
+ }
}
}
diff --git a/src/mesa/state_tracker/st_format.h b/src/mesa/state_tracker/st_format.h
index 2eef2c0..d87ef3d 100644
--- a/src/mesa/state_tracker/st_format.h
+++ b/src/mesa/state_tracker/st_format.h
@@ -76,6 +76,6 @@ st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2);
extern void
st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
- GLfloat colorOut[4]);
+ GLfloat colorOut[4], GLboolean is_integer);
#endif /* ST_FORMAT_H */
--
1.7.9.5
More information about the mesa-dev
mailing list