---
src/mesa/main/blend.c | 28 +++-
src/mesa/main/blend.h |8
src/mesa/main/fbobject.c| 10 ++
src/mesa/main/framebuffer.c |1 +
src/mesa/main/mtypes.h |4 +++-
src/mesa/main/readpix.c |5 +++--
src/mesa/main/state.c | 29 +++--
7 files changed, 55 insertions(+), 30 deletions(-)
diff --git a/src/mesa/main/blend.c b/src/mesa/main/blend.c
index 309f1d5..876cbf2 100644
--- a/src/mesa/main/blend.c
+++ b/src/mesa/main/blend.c
@@ -782,7 +782,34 @@ _mesa_ClampColor(GLenum target, GLenum clamp)
}
}
+static GLboolean _mesa_get_clamp_color(const struct gl_framebuffer *fb,
+ GLenum clamp)
+{
+ if (clamp == GL_TRUE || clamp == GL_FALSE)
+ return clamp;
+
+ ASSERT(clamp == GL_FIXED_ONLY);
+ if (!fb)
+ return GL_TRUE;
+ return fb-_AllColorBuffersFixedPoint;
+}
+
+GLboolean _mesa_get_clamp_fragment_color(const struct gl_context *ctx)
+{
+ return _mesa_get_clamp_color(ctx-DrawBuffer,
+ctx-Color.ClampFragmentColor);
+}
+
+GLboolean _mesa_get_clamp_vertex_color(const struct gl_context *ctx)
+{
+ return _mesa_get_clamp_color(ctx-DrawBuffer, ctx-Light.ClampVertexColor);
+}
+
+GLboolean _mesa_get_clamp_read_color(const struct gl_context *ctx)
+{
+ return _mesa_get_clamp_color(ctx-ReadBuffer, ctx-Color.ClampReadColor);
+}
/**/
@@ -835,7 +862,6 @@ void _mesa_init_color( struct gl_context * ctx )
ctx-Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
ctx-Color._ClampFragmentColor = GL_TRUE;
ctx-Color.ClampReadColor = GL_FIXED_ONLY_ARB;
- ctx-Color._ClampReadColor = GL_TRUE;
if (ctx-API == API_OPENGLES2) {
/* GLES 3 behaves as though GL_FRAMEBUFFER_SRGB is always enabled. */
diff --git a/src/mesa/main/blend.h b/src/mesa/main/blend.h
index a539aa8..694fc5a 100644
--- a/src/mesa/main/blend.h
+++ b/src/mesa/main/blend.h
@@ -99,6 +99,14 @@ _mesa_ColorMaski( GLuint buf, GLboolean red, GLboolean green,
extern void GLAPIENTRY
_mesa_ClampColor(GLenum target, GLenum clamp);
+extern GLboolean
+_mesa_get_clamp_fragment_color(const struct gl_context *ctx);
+
+extern GLboolean
+_mesa_get_clamp_vertex_color(const struct gl_context *ctx);
+
+extern GLboolean
+_mesa_get_clamp_read_color(const struct gl_context *ctx);
extern void
_mesa_init_color( struct gl_context * ctx );
diff --git a/src/mesa/main/fbobject.c b/src/mesa/main/fbobject.c
index c1f5299..67c1161 100644
--- a/src/mesa/main/fbobject.c
+++ b/src/mesa/main/fbobject.c
@@ -784,6 +784,7 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
numImages = 0;
fb-Width = 0;
fb-Height = 0;
+ fb-_AllColorBuffersFixedPoint = GL_TRUE;
/* Start at -2 to more easily loop over all attachment points.
* -2: depth buffer
@@ -900,6 +901,15 @@ _mesa_test_framebuffer_completeness(struct gl_context *ctx,
/* check if integer color */
fb-_IntegerColor = _mesa_is_format_integer_color(attFormat);
+ /* Update _AllColorBuffersFixedPoint. */
+ if (i = 0) {
+ GLenum type = _mesa_get_format_datatype(attFormat);
+
+ fb-_AllColorBuffersFixedPoint =
+fb-_AllColorBuffersFixedPoint
+(type == GL_UNSIGNED_NORMALIZED || type == GL_SIGNED_NORMALIZED);
+ }
+
/* Error-check width, height, format */
if (numImages == 1) {
/* save format */
diff --git a/src/mesa/main/framebuffer.c b/src/mesa/main/framebuffer.c
index 619aaa3..5fb3677 100644
--- a/src/mesa/main/framebuffer.c
+++ b/src/mesa/main/framebuffer.c
@@ -154,6 +154,7 @@ _mesa_initialize_window_framebuffer(struct gl_framebuffer
*fb,
fb-Delete = _mesa_destroy_framebuffer;
fb-_Status = GL_FRAMEBUFFER_COMPLETE_EXT;
+ fb-_AllColorBuffersFixedPoint = !visual-floatMode;
compute_depth_max(fb);
}
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index a0e7e28..8c64a5b 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -683,7 +683,6 @@ struct gl_colorbuffer_attrib
GLenum ClampFragmentColor; /** GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
GLboolean _ClampFragmentColor; /** with GL_FIXED_ONLY_ARB resolved */
GLenum ClampReadColor; /** GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
- GLboolean _ClampReadColor; /** with GL_FIXED_ONLY_ARB resolved */
GLboolean sRGBEnabled; /** Framebuffer sRGB blending/updating
requested */
};
@@ -2670,6 +2669,9 @@ struct gl_framebuffer
/** Integer color values */
GLboolean _IntegerColor;
+ /* ARB_color_buffer_float */
+ GLboolean _AllColorBuffersFixedPoint; /* no integer, no float */
+
/** Array of all renderbuffer attachments, indexed by BUFFER_* tokens. */
struct gl_renderbuffer_attachment Attachment[BUFFER_COUNT];
diff --git a/src/mesa/main/readpix.c b/src/mesa/main/readpix.c
index d3d09de..0dee380