[Piglit] [PATCH] getteximage-formats: test GetTexImage after rendering to textures
Marek Olšák
maraeo at gmail.com
Thu Feb 7 08:15:28 PST 2013
On Thu, Feb 7, 2013 at 4:10 PM, Brian Paul <brianp at vmware.com> wrote:
> On 02/06/2013 05:06 PM, Marek Olšák wrote:
>>
>> This tests whether our GetTexImage doesn't actually rely on TexImage being
>> called first. In this test, TexImage is not used to store data.
>> ---
>> tests/all.tests | 1 +
>> tests/texturing/getteximage-formats.c | 75
>> +++++++++++++++++++++++++--------
>> 2 files changed, 58 insertions(+), 18 deletions(-)
>>
>> diff --git a/tests/all.tests b/tests/all.tests
>> index 5a76926..00756f7 100644
>> --- a/tests/all.tests
>> +++ b/tests/all.tests
>> @@ -1607,6 +1607,7 @@ add_plain_test(ext_framebuffer_object,
>> 'fbo-readpixels-depth-formats')
>> add_plain_test(ext_framebuffer_object, 'fbo-scissor-bitmap')
>> add_plain_test(ext_framebuffer_object, 'fbo-storage-completeness')
>> add_plain_test(ext_framebuffer_object, 'fbo-storage-formats')
>> +add_plain_test(ext_framebuffer_object, 'getteximage-formats
>> init-by-rendering')
>>
>>
>> ext_packed_depth_stencil = Group()
>> diff --git a/tests/texturing/getteximage-formats.c
>> b/tests/texturing/getteximage-formats.c
>> index affcfd5..1643f14 100644
>> --- a/tests/texturing/getteximage-formats.c
>> +++ b/tests/texturing/getteximage-formats.c
>> @@ -48,9 +48,10 @@ PIGLIT_GL_TEST_CONFIG_END
>> static const char *TestName = "getteximage-formats";
>>
>> static const GLfloat clearColor[4] = { 0.4, 0.4, 0.4, 0.0 };
>> +static GLuint texture_id;
>> +static GLboolean init_by_rendering;
>>
>> -#define TEX_WIDTH 128
>> -#define TEX_HEIGHT 128
>> +#define TEX_SIZE 128
>>
>> #define DO_BLEND 1
>>
>> @@ -64,13 +65,14 @@ static const GLfloat clearColor[4] = { 0.4, 0.4, 0.4,
>> 0.0 };
>> static GLboolean
>> make_texture_image(GLenum intFormat, GLubyte upperRightTexel[4])
>> {
>> - GLubyte tex[TEX_HEIGHT][TEX_WIDTH][4];
>> + GLubyte tex[TEX_SIZE][TEX_SIZE][4];
>> int i, j;
>> + GLuint fb, status;
>>
>> - for (i = 0; i< TEX_HEIGHT; i++) {
>> - for (j = 0; j< TEX_WIDTH; j++) {
>> - tex[i][j][0] = j * 255 / TEX_WIDTH;
>> - tex[i][j][1] = i * 255 / TEX_HEIGHT;
>> + for (i = 0; i< TEX_SIZE; i++) {
>> + for (j = 0; j< TEX_SIZE; j++) {
>> + tex[i][j][0] = j * 255 / TEX_SIZE;
>> + tex[i][j][1] = i * 255 / TEX_SIZE;
>> tex[i][j][2] = 128;
>> if (((i>> 4) ^ (j>> 4))& 1)
>>
>> tex[i][j][3] = 255; /* opaque */
>> @@ -79,10 +81,38 @@ make_texture_image(GLenum intFormat, GLubyte
>> upperRightTexel[4])
>> }
>> }
>>
>> - memcpy(upperRightTexel, tex[TEX_HEIGHT-1][TEX_WIDTH-1], 4);
>> + memcpy(upperRightTexel, tex[TEX_SIZE-1][TEX_SIZE-1], 4);
>>
>> - glTexImage2D(GL_TEXTURE_2D, 0, intFormat, TEX_WIDTH, TEX_HEIGHT,
>> 0,
>> - GL_RGBA, GL_UNSIGNED_BYTE, tex);
>> + glTexImage2D(GL_TEXTURE_2D, 0, intFormat, TEX_SIZE, TEX_SIZE, 0,
>> + GL_RGBA, GL_UNSIGNED_BYTE, init_by_rendering ? NULL :
>> tex);
>> +
>> + if (init_by_rendering) {
>> + /* Initialize the mipmap levels. */
>> + for (i = TEX_SIZE>> 1, j = 1; i; i>>= 1, j++) {
>> + glTexImage2D(GL_TEXTURE_2D, j, intFormat, i, i, 0,
>> + GL_RGBA, GL_UNSIGNED_BYTE, NULL);
>> + }
>
>
> Minor nit: I'd restructure the code to generate all the empty mipmap levels
> inside the if (init_by_rendering) clause, and then do the non-rendering
> glTexImage2D call in an else clause. Not a big deal though.
>
>> +
>> + /* Initialize the texture with glDrawPixels. */
>> + glGenFramebuffers(1,&fb);
>> + glBindFramebuffer(GL_FRAMEBUFFER, fb);
>> + glFramebufferTexture2D(GL_FRAMEBUFFER,
>> GL_COLOR_ATTACHMENT0,
>> + GL_TEXTURE_2D, texture_id, 0);
>> + status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
>> + if (status != GL_FRAMEBUFFER_COMPLETE) {
>> + glDeleteFramebuffers(1,&fb);
>> + return GL_FALSE;
>> + }
>> +
>> + glViewport(0, 0, TEX_SIZE, TEX_SIZE);
>> +
>> + glWindowPos2iARB(0, 0);
>> + glDrawPixels(TEX_SIZE, TEX_SIZE, GL_RGBA,
>> GL_UNSIGNED_BYTE, tex);
>> + glGenerateMipmap(GL_TEXTURE_2D);
>> +
>> + glDeleteFramebuffers(1,&fb);
>> + glViewport(0, 0, piglit_width, piglit_height);
>> + }
>>
>> return glGetError() == GL_NO_ERROR;
>> }
>> @@ -324,8 +354,8 @@ test_format(const struct test_desc *test,
>> const struct format_desc *fmt)
>> {
>> int x, y;
>> - int w = TEX_WIDTH, h = TEX_HEIGHT;
>> - GLfloat readback[TEX_HEIGHT][TEX_WIDTH][4];
>> + int w = TEX_SIZE, h = TEX_SIZE;
>> + GLfloat readback[TEX_SIZE][TEX_SIZE][4];
>> GLubyte upperRightTexel[4];
>> int level;
>> GLfloat expected[4], pix[4], tolerance[4];
>> @@ -357,7 +387,7 @@ test_format(const struct test_desc *test,
>> glDisable(GL_TEXTURE_2D);
>> glDisable(GL_BLEND);
>>
>> - x += TEX_WIDTH + 20;
>> + x += TEX_SIZE + 20;
>>
>> level = 0;
>> while (w> 0) {
>> @@ -485,21 +515,30 @@ piglit_display(void)
>> void
>> piglit_init(int argc, char **argv)
>> {
>> - GLuint t;
>> + int i;
>>
>> if ((piglit_get_gl_version()< 14)&&
>> !piglit_is_extension_supported("GL_ARB_window_pos")) {
>>
>> printf("Requires GL 1.4 or GL_ARB_window_pos");
>> piglit_report_result(PIGLIT_SKIP);
>> }
>>
>> - fbo_formats_init(argc, argv, !piglit_automatic);
>> + fbo_formats_init(1, argv, !piglit_automatic);
>
>
> What's that change for?
fbo_formats_init fails if it receives a parameter it doesn't know (in
this case it's "init-by-rendering"). We don't use the parameters
expected by fbo_formats_init anyway.
Marek
More information about the Piglit
mailing list