summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Berry <stereotype441@gmail.com>2012-07-06 13:07:48 -0700
committerPaul Berry <stereotype441@gmail.com>2012-07-17 12:40:52 -0700
commit79fefb56133e012a9567e6698918364be721f27d (patch)
treee402763b9b922d60eb632360aecc2bb62b2311af
parent95f00a1202a3b935ee4388ed0905ddad335708dc (diff)
msaa/formats: Test signed normalized formats.
The GL spec mandates that signed normalized color formats be clamped to [0, 1] when in GL_FIXED_ONLY mode, despite the fact that they can represent values in the range [-1, 1]. So, when testing these formats, we use a color clamping mode of GL_FALSE. Note: it would have been easier to simply use a color clamping mode of GL_FALSE for all formats, however since part of the purpose of the test is to verify that unnecessary clipping does not occur, we want to give as many opportunities as possible for the implementation to incorrectly clip. Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
-rw-r--r--tests/all.tests1
-rw-r--r--tests/spec/ext_framebuffer_multisample/formats.cpp30
2 files changed, 31 insertions, 0 deletions
diff --git a/tests/all.tests b/tests/all.tests
index 27a59c97c..9ea22d73d 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -1635,6 +1635,7 @@ add_texwrap_test2(ext_texture_shared_exponent, '2D', 'GL_RGB9_E5')
ext_texture_snorm = Group()
spec['EXT_texture_snorm'] = ext_texture_snorm
add_fbo_formats_tests('spec/EXT_texture_snorm', 'GL_EXT_texture_snorm')
+add_msaa_formats_tests(ext_texture_snorm, 'GL_EXT_texture_snorm')
add_texwrap_test2(ext_texture_snorm, '2D', 'GL_R8_SNORM')
add_texwrap_test2(ext_texture_snorm, '2D', 'GL_RG8_SNORM')
add_texwrap_test2(ext_texture_snorm, '2D', 'GL_RGB8_SNORM')
diff --git a/tests/spec/ext_framebuffer_multisample/formats.cpp b/tests/spec/ext_framebuffer_multisample/formats.cpp
index 1d11024b6..960814d7f 100644
--- a/tests/spec/ext_framebuffer_multisample/formats.cpp
+++ b/tests/spec/ext_framebuffer_multisample/formats.cpp
@@ -73,6 +73,7 @@ class PatternRenderer
public:
bool try_setup(GLenum internalformat);
void set_piglit_tolerance();
+ void set_color_clamping_mode();
void draw();
float *read_image(GLenum base_format);
@@ -110,6 +111,15 @@ public:
*/
float color_scale;
+ /**
+ * Color clamping setting that should be used for this test.
+ * Normally GL_FIXED_ONLY (the default setting) works fine,
+ * however the GL spec mandates that signed normalized formats
+ * be clamped to [0, 1] when in GL_FIXED_ONLY mode. So when
+ * testing signed normalized formats, this is GL_FALSE.
+ */
+ GLenum color_clamping_mode;
+
Fbo fbo_msaa;
Fbo fbo_downsampled;
};
@@ -151,6 +161,7 @@ PatternRenderer::try_setup(GLenum internalformat)
GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE,
(GLint *) &component_type);
+ color_clamping_mode = GL_FIXED_ONLY;
switch (component_type) {
case GL_INT:
test_pattern = test_pattern_ivec4;
@@ -184,6 +195,12 @@ PatternRenderer::try_setup(GLenum internalformat)
color_scale = 20.0;
}
break;
+ case GL_SIGNED_NORMALIZED:
+ test_pattern = test_pattern_vec4;
+ color_offset = -1.0;
+ color_scale = 2.0;
+ color_clamping_mode = GL_FALSE;
+ break;
default:
printf("Unrecognized component type: %s\n",
piglit_get_gl_enum_name(component_type));
@@ -260,6 +277,17 @@ void PatternRenderer::set_piglit_tolerance()
/**
+ * Set up the appropriate color clamping mode for testing this format.
+ */
+void
+PatternRenderer::set_color_clamping_mode()
+{
+ glClampColor(GL_CLAMP_FRAGMENT_COLOR, color_clamping_mode);
+ glClampColor(GL_CLAMP_READ_COLOR, color_clamping_mode);
+}
+
+
+/**
* Draw the test pattern into the MSAA framebuffer, and then blit it
* to the downsampled FBO to force an MSAA resolve.
*/
@@ -269,6 +297,7 @@ PatternRenderer::draw()
/* Draw into the MSAA fbo */
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, fbo_msaa.handle);
fbo_msaa.set_viewport();
+ set_color_clamping_mode();
test_pattern->draw_with_scale_and_offset(TestPattern::no_projection,
color_scale, color_offset);
@@ -323,6 +352,7 @@ PatternRenderer::read_image(GLenum base_format)
unsigned array_size = components*pattern_width*pattern_height;
float *image = (float *) malloc(sizeof(float)*array_size);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo_downsampled.handle);
+ set_color_clamping_mode();
if (base_format == GL_INTENSITY) {
/* GL_INTENSITY is not allowed for ReadPixels so
* substitute GL_LUMINANCE.