Am 04.04.2013 17:48, schrieb Brian Paul: > On 04/04/2013 09:33 AM, Roland Scheidegger wrote: >> Am 04.04.2013 01:55, schrieb Brian Paul: >>> On 04/03/2013 05:14 PM, [email protected] wrote: >>>> From: Roland Scheidegger<[email protected]> >>>> >>>> Similar to arb_shader_texture_lod-texgrad, but using cube maps instead. >>>> Given the somewhat undefined behavior of explicit gradients with cube >>>> maps, the main purpose of the test is really to test that those work at >>>> all, as there doesn't seem to be any other test covering this. >>>> That said, drivers which simply drop explicit derivatives on the floor >>>> (like softpipe) pass this perfectly as it simply compares implicit vs. >>>> explicit behavior (which, given the fuzzy specification, might not be >>>> really required to be the same here, though given the chosen values, >>>> that >>>> is the major axis derivatives being zero, it might seem like a >>>> reasonable >>>> assumption). >>>> I guess something which would also test that the implementation is >>>> really >>>> using explicit derivatives instead of implicit ones would also be >>>> desirable, >>>> but I'll leave that for now, I couldn't really come up with something. >>>> --- >>>> .../execution/CMakeLists.gl.txt | 1 + >>>> .../arb_shader_texture_lod/execution/texgradcube.c | 195 >>>> ++++++++++++++++++++ >>>> 2 files changed, 196 insertions(+) >>>> create mode 100644 >>>> tests/spec/arb_shader_texture_lod/execution/texgradcube.c >>>> >>>> diff --git >>>> a/tests/spec/arb_shader_texture_lod/execution/CMakeLists.gl.txt >>>> b/tests/spec/arb_shader_texture_lod/execution/CMakeLists.gl.txt >>>> index c403939..2366fa9 100644 >>>> --- a/tests/spec/arb_shader_texture_lod/execution/CMakeLists.gl.txt >>>> +++ b/tests/spec/arb_shader_texture_lod/execution/CMakeLists.gl.txt >>>> @@ -10,5 +10,6 @@ link_libraries ( >>>> ) >>>> >>>> piglit_add_executable (arb_shader_texture_lod-texgrad texgrad.c) >>>> +piglit_add_executable (arb_shader_texture_lod-texgradcube >>>> texgradcube.c) >>>> >>>> # vim: ft=cmake: >>>> diff --git a/tests/spec/arb_shader_texture_lod/execution/texgradcube.c >>>> b/tests/spec/arb_shader_texture_lod/execution/texgradcube.c >>>> new file mode 100644 >>>> index 0000000..90f7ddc >>>> --- /dev/null >>>> +++ b/tests/spec/arb_shader_texture_lod/execution/texgradcube.c >>>> @@ -0,0 +1,195 @@ >>>> +/* >>>> + * Copyright (c) 2013 VMware, Inc. >>>> + * >>>> + * Permission is hereby granted, free of charge, to any person >>>> obtaining a >>>> + * copy of this software and associated documentation files (the >>>> "Software"), >>>> + * to deal in the Software without restriction, including without >>>> limitation >>>> + * on the rights to use, copy, modify, merge, publish, distribute, sub >>>> + * license, and/or sell copies of the Software, and to permit persons >>>> to whom >>>> + * the Software is furnished to do so, subject to the following >>>> conditions: >>>> + * >>>> + * The above copyright notice and this permission notice (including >>>> the next >>>> + * paragraph) shall be included in all copies or substantial portions >>>> of the >>>> + * Software. >>>> + * >>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, >>>> + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF >>>> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND >>>> + * NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS AND/OR THEIR >>>> + * SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, >>>> + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, >>>> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER >>>> + * DEALINGS IN THE SOFTWARE. >>>> + * >>>> + * Authors: >>>> + * Roland Scheidegger<[email protected]> >>>> + * >>>> + * Based on arb_shader_texture_lod-texgrad: >>>> + * Marek Olšák<[email protected]> >>>> + */ >>>> + >>>> +#include "piglit-util-gl-common.h" >>>> + >>>> +PIGLIT_GL_TEST_CONFIG_BEGIN >>>> + >>>> + config.supports_gl_compat_version = 10; >>>> + >>>> + config.window_width = 512; >>>> + config.window_height = 256; >>>> + config.window_visual = PIGLIT_GL_VISUAL_RGB | >>>> PIGLIT_GL_VISUAL_DOUBLE; >>>> + >>>> +PIGLIT_GL_TEST_CONFIG_END >>>> + >>>> +#define TEX_WIDTH 256 >>>> +#define TEX_HEIGHT 256 >>>> + >>>> +static const float colors[][3] = { >>>> + {1.0, 0.0, 0.0}, >>>> + {0.0, 1.0, 0.0}, >>>> + {0.0, 0.0, 1.0}, >>>> + {1.0, 1.0, 0.0}, >>>> + {0.0, 1.0, 1.0}, >>>> + {1.0, 0.0, 1.0}, >>>> + {0.5, 0.0, 0.5}, >>>> + {1.0, 1.0, 1.0}, >>>> +}; >>>> + >>>> +static const char *sh_tex = >>>> + "uniform samplerCube tex;" >>>> + "void main()" >>>> + "{" >>>> + " gl_FragColor = textureCube(tex, gl_TexCoord[0].xyz);" >>>> + "}"; >>>> + >>>> +static const char *sh_texgrad = >>>> + "#extension GL_ARB_shader_texture_lod : enable\n" >>>> + "uniform samplerCube tex;" >>>> + "void main()" >>>> + "{" >>>> + " gl_FragColor = textureCubeGradARB(tex, gl_TexCoord[0].xyz," >>>> + " dFdx(gl_TexCoord[0].xyz)," >>>> + " dFdy(gl_TexCoord[0].xyz));" >>>> + "}"; >>>> + >>>> +static GLint prog_tex, prog_texgrad; >>>> + >>>> +void piglit_init(int argc, char **argv) >>>> +{ >>>> + GLuint tex, fb; >>>> + GLenum status; >>>> + int i, j, dim; >>>> + static GLuint fs_tex, fs_texgrad; >>>> + >>>> + piglit_require_GLSL(); >>>> + piglit_require_extension("GL_EXT_framebuffer_object"); >>>> + piglit_require_extension("GL_ARB_shader_texture_lod"); >>>> + >>>> + fs_tex = piglit_compile_shader_text(GL_FRAGMENT_SHADER, sh_tex); >>>> + fs_texgrad = piglit_compile_shader_text(GL_FRAGMENT_SHADER, >>>> sh_texgrad); >>>> + prog_tex = piglit_link_simple_program(0, fs_tex); >>>> + prog_texgrad = piglit_link_simple_program(0, fs_texgrad); >>>> + >>>> + glGenTextures(1,&tex); >>>> + glBindTexture(GL_TEXTURE_CUBE_MAP, tex); >>>> + >>>> + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, >>>> GL_LINEAR_MIPMAP_LINEAR); >>>> + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, >>>> GL_LINEAR); >>>> + >>>> + for (j = GL_TEXTURE_CUBE_MAP_POSITIVE_X; j<= >>>> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; j++) { >>>> + for (i = 0, dim = TEX_WIDTH; dim>0; i++, dim /= 2) { >>>> + glTexImage2D(j, i, GL_RGBA, >>>> + dim, dim, >>>> + 0, >>>> + GL_RGBA, GL_UNSIGNED_BYTE, NULL); >>>> + } >>>> + } >>>> + assert(glGetError() == 0); >>>> + >>>> + glBindTexture(GL_TEXTURE_CUBE_MAP, 0); >>>> + glDisable(GL_TEXTURE_CUBE_MAP); >>>> + >>>> + glGenFramebuffersEXT(1,&fb); >>>> + glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb); >>>> + >>>> + for (j = GL_TEXTURE_CUBE_MAP_POSITIVE_X; j<= >>>> GL_TEXTURE_CUBE_MAP_NEGATIVE_Z; j++) { >>>> + for (i = 0, dim = TEX_WIDTH; dim>0; i++, dim /= 2) { >>>> + glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, >>>> + GL_COLOR_ATTACHMENT0_EXT, >>>> + j, >>>> + tex, >>>> + i); >>>> + >>>> + status = glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT); >>>> + if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { >>>> + fprintf(stderr, "FBO incomplete\n"); >>>> + piglit_report_result(PIGLIT_SKIP); >>>> + } >>>> + >>>> + glClearColor(colors[i][0], >>>> + colors[i][1], >>>> + colors[i][2], >>>> + 0.0); >>>> + glClear(GL_COLOR_BUFFER_BIT); >>>> + >>>> + assert(glGetError() == 0); >>>> + } >>>> + } >>>> + >>>> + glDeleteFramebuffersEXT(1,&fb); >>>> + glBindTexture(GL_TEXTURE_CUBE_MAP, tex); >>>> + >>>> + glMatrixMode(GL_PROJECTION); >>>> + glLoadIdentity(); >>>> + glFrustum(-0.1, 0.1, -0.1, 0.1, 0.1, 1000.0); >>>> + >>>> + glMatrixMode(GL_MODELVIEW); >>>> + glLoadIdentity(); >>>> + glTranslatef(-0.5, -0.5, -1.2); >>>> + glRotatef(68, 0, 1, 0); >>>> + glScalef(2000, 1, 1); >>>> + >>>> + glEnable(GL_TEXTURE_CUBE_MAP); >>>> + glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); >>>> + >>>> + piglit_set_tolerance_for_bits(7, 7, 7, 7); >>>> + >>>> + printf("Left: textureCube, Right: textureCubeGradARB\n"); >>>> +} >>>> + >>>> +static void draw_quad() >>>> +{ >>>> + glBegin(GL_QUADS); >>>> + glTexCoord3f(-0.5, -0.5, 1); >>>> + glVertex2f(0, 0); >>>> + glTexCoord3f(0.5, -0.5, 1); >>>> + glVertex2f(1, 0); >>>> + glTexCoord3f(0.5, 0.5, 1); >>>> + glVertex2f(1, 1); >>>> + glTexCoord3f(-0.5, 0.5, 1); >>>> + glVertex2f(0, 1); >>>> + glEnd(); >>>> +} >>>> + >>>> +enum piglit_result piglit_display(void) >>>> +{ >>>> + GLboolean pass = GL_TRUE; >>>> + >>>> + glViewport(0, 0, piglit_width, piglit_height); >>>> + glClearColor(0.5, 0.5, 0.5, 0.5); >>>> + glClear(GL_COLOR_BUFFER_BIT); >>>> + >>>> + glViewport(0, 0, piglit_width/2, piglit_height); >>>> + glUseProgram(prog_tex); >>>> + draw_quad(); >>>> + >>>> + glViewport(piglit_width/2, 0, piglit_width/2, piglit_height); >>>> + glUseProgram(prog_texgrad); >>>> + draw_quad(); >>>> + >>>> + if (!piglit_probe_rect_halves_equal_rgba(0, 0, piglit_width, >>>> piglit_height)) >>>> + pass = GL_FALSE; >>>> + >>>> + piglit_present_results(); >>>> + >>>> + return pass ? PIGLIT_PASS : PIGLIT_FAIL; >>>> +} >>> >>> It looks like you're building a complete mipmap but only testing the 0th >>> mipmap level. Could you hit those other levels by drawing some smaller >>> quads? >> No the test does hit all mip levels (or rather, 6 out of 8 here). Don't >> ask me how but that's the same as the noncube version. > > Ah, so the texcoords "cross" multiple mipmap levels? I see. Yes exactly.
> > >> It is true however that only one cube face is hit (but it doesn't matter >> which one in any case as they are all the same color, and just the same >> the texel doesn't matter neither - only the derivatives matter for >> picking the right level). I guess I could make the faces which are >> supposed to not get picked a different color though. > > Your call. I actually decided against this since because how the test works it wouldn't really matter - if the wrong face would be chosen for explicit derivatives surely the wrong face would be chosen for implicit derivatives too. Roland _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
