This test is to check whether updating sub-sections of ETC1_RGB8_OES textures when GL_EXT_compressed_ETC1_RGB8_sub_texture is available works as expected.
Signed-off-by: Plamena Manolova <[email protected]> --- tests/all.py | 5 + tests/spec/CMakeLists.txt | 1 + .../CMakeLists.gles2.txt | 6 + .../CMakeLists.txt | 1 + .../update-test.c | 279 +++++++++++++++++++++ .../waffles-compressed-etc1-64x32-miptree.ktx | Bin 0 -> 1476 bytes .../waffles-decompressed-rgb-64x32-miptree.ktx | Bin 0 -> 8288 bytes 7 files changed, 292 insertions(+) create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-compressed-etc1-64x32-miptree.ktx create mode 100644 tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-decompressed-rgb-64x32-miptree.ktx diff --git a/tests/all.py b/tests/all.py index 74ffb42..3c31b3e 100644 --- a/tests/all.py +++ b/tests/all.py @@ -2884,6 +2884,11 @@ with profile.test_list.group_manager( g(['vp-clipdistance-04'], run_concurrent=False) with profile.test_list.group_manager( + PiglitGLTest, + grouptools.join('spec', 'ext_compressed_etc1_rgb8_sub_texture')) as g: + g(['ext_compressed_etc1_rgb8_sub_texture-update-test']) + +with profile.test_list.group_manager( PiglitGLTest, grouptools.join('spec', 'ext_framebuffer_blit')) as g: g(['fbo-blit'], run_concurrent=False) g(['fbo-copypix'], run_concurrent=False) diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt index 548515d..ae37280 100644 --- a/tests/spec/CMakeLists.txt +++ b/tests/spec/CMakeLists.txt @@ -154,3 +154,4 @@ add_subdirectory (ext_window_rectangles) add_subdirectory (arb_shader_texture_image_samples) add_subdirectory (arb_texture_barrier) add_subdirectory (intel_conservative_rasterization) +add_subdirectory (ext_compressed_etc1_rgb8_sub_texture) diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt new file mode 100644 index 0000000..5e2d499 --- /dev/null +++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.gles2.txt @@ -0,0 +1,6 @@ +include_directories( + ${GLEXT_INCLUDE_DIR} + ${OPENGL_INCLUDE_PATH} +) +link_libraries(piglitutil_${piglit_target_api}) +piglit_add_executable (ext_compressed_etc1_rgb8_sub_texture-update-test update-test.c) diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt new file mode 100644 index 0000000..4a012b9 --- /dev/null +++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/CMakeLists.txt @@ -0,0 +1 @@ +piglit_include_target_api() \ No newline at end of file diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c new file mode 100644 index 0000000..cf07002 --- /dev/null +++ b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/update-test.c @@ -0,0 +1,279 @@ +/* + * Copyright (c) 2015 Intel Corporation. + * + * 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 + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * 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 NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS 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. + */ + +/* + * This test is to check whether updating sub-sections of ETC1_RGB8_OES + * textures when GL_EXT_compressed_ETC1_RGB8_sub_texture is available works + * as expected. + */ + +#include "piglit-util-gl.h" +#include "piglit_ktx.h" + +#define NUM_LEVELS 7 +#define LEVEL0_WIDTH 64 +#define LEVEL0_HEIGHT 32 + +PIGLIT_GL_TEST_CONFIG_BEGIN + config.supports_gl_es_version = 20; + config.window_width = LEVEL0_WIDTH; + config.window_height = LEVEL0_HEIGHT; + config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE; +PIGLIT_GL_TEST_CONFIG_END + +static GLuint prog, vbo, tex_id; + +static const char *vs_text = + "#version 310 es\n" + "in vec2 pos_in;\n" + "in vec2 tex_in;\n" + "out vec2 tex_out;\n" + "void main()\n" + "{\n" + " tex_out = tex_in;\n" + " gl_Position = vec4(pos_in, 0.0, 1.0);\n" + "}\n"; + +static const char *fs_text = + "#version 310 es\n" + "precision highp float;\n" + "in vec2 tex_out;" + "out vec4 color;\n" + "uniform sampler2D sampler;\n" + "void main()\n" + "{\n" + " color = texture(sampler, tex_out);\n" + "}\n"; + +static GLuint +make_shader_program(void) +{ + GLuint prog; + + prog = piglit_build_simple_program(vs_text, fs_text); + glUseProgram(prog); + + glBindAttribLocation(prog, 0, "pos_in"); + glBindAttribLocation(prog, 1, "tex_in"); + + glLinkProgram(prog); + glUseProgram(prog); + + glUniform1i(glGetUniformLocation(prog, "sampler"), 0); + + if (!piglit_check_gl_error(GL_NO_ERROR)) { + piglit_report_result(PIGLIT_FAIL); + } + + return prog; +} + +/* + * We can't use piglit_probe_image_ubyte here since our decompressed image is + * in GL_RGB/GL_UNSIGNED_BYTE format and those are conflicting parameters for + * glReadPixels and if we use GL_RGBA there's a format component mismatch. We + * need this custom probe function to account for these limitations. + */ + +int +probe_image(const struct piglit_ktx_image *decompressed, int x, int y, int w, int h) +{ + GLubyte *pixels = malloc(w * h * 4 * sizeof(GLubyte)); + GLubyte *image = (GLubyte*)decompressed->data; + int i, j, p, k; + + glReadPixels(x, y, w, h, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + for (j = 0; j < h; j++) { + for (i = 0; i < w; i++) { + const GLubyte *expected = &image[(j * w + i) * 3]; + const GLubyte *probe = &pixels[(j * w + i) * 4]; + + for (p = 0; p < 3; ++p) { + const int tolerance = ceil(0.01 * 255); + if (abs((int)probe[p] - (int)expected[p]) < tolerance) + continue; + + printf("Probe at (%i,%i)\n", x + i, y + j); + printf(" Expected:"); + for (k = 0; k < 3; ++k) + printf(" %u", expected[k]); + printf("\n Observed:"); + for (k = 0; k < 3; ++k) + printf(" %u", probe[k]); + printf("\n"); + + free(pixels); + return 0; + } + } + } + + free(pixels); + return 1; +} + +static struct piglit_ktx* +load_image(const char *filename) +{ + struct piglit_ktx *ktx; + const struct piglit_ktx_info *info; + char filepath[4096]; + + piglit_join_paths(filepath, sizeof(filepath), 5, + piglit_source_dir(), + "tests", + "spec", + "oes_compressed_etc1_rgb8_texture", + filename); + + ktx = piglit_ktx_read_file(filepath); + if (ktx == NULL) + piglit_report_result(PIGLIT_FAIL); + + info = piglit_ktx_get_info(ktx); + assert(info->num_miplevels == NUM_LEVELS); + assert(info->target == GL_TEXTURE_2D); + assert(info->pixel_width == LEVEL0_WIDTH); + assert(info->pixel_height== LEVEL0_HEIGHT); + + return ktx; +} + +static GLuint +make_texture(struct piglit_ktx* ktx) +{ + GLuint tex_id = 0; + + if (!piglit_ktx_load_texture(ktx, &tex_id, NULL)) + piglit_report_result(PIGLIT_FAIL); + + glActiveTexture(GL_TEXTURE0); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_NEAREST_MIPMAP_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D, tex_id); + + if (!piglit_check_gl_error(GL_NO_ERROR)) + piglit_report_result(PIGLIT_FAIL); + + return tex_id; +} + +static GLuint +make_vbo(void) +{ + static const float pos_tc[6][4] = { + { -1.0, -1.0, 0.0, 0.0 }, + { 1.0, -1.0, 1.0, 0.0 }, + { 1.0, 1.0, 1.0, 1.0 }, + { 1.0, 1.0, 1.0, 1.0 }, + { -1.0, 1.0, 0.0, 1.0 }, + { -1.0, -1.0, 0.0, 0.0 } + }; + const int stride = sizeof(pos_tc[0]); + GLuint vbo, vao; + + glGenVertexArrays(1, &vao); + glBindVertexArray(vao); + + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, sizeof(pos_tc), pos_tc, GL_STATIC_DRAW); + + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, stride, (void *) 0); + glEnableVertexAttribArray(0); + + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, stride, + (void*) (sizeof(GLfloat) * 2)); + glEnableVertexAttribArray(1); + + if (!piglit_check_gl_error(GL_NO_ERROR)) { + piglit_report_result(PIGLIT_FAIL); + } + + return vbo; +} + +void +piglit_init(int argc, char **argv) +{ + piglit_require_extension("GL_OES_compressed_ETC1_RGB8_texture"); + piglit_require_extension("GL_EXT_compressed_ETC1_RGB8_sub_texture"); + + glClearColor(0.0, 0.0, 0.0, 1.0); + + vbo = make_vbo(); + prog = make_shader_program(); +} + +enum piglit_result +piglit_display(void) +{ + bool pass = true; + const struct piglit_ktx_image *compressed_image, *decompressed_image; + const struct piglit_ktx_image *compressed_image_4; + struct piglit_ktx *compressed_ktx, *decompressed_ktx; + + compressed_ktx = load_image("waffles-compressed-etc1-64x32-miptree.ktx"); + decompressed_ktx = load_image("waffles-decompressed-rgb-64x32-miptree.ktx"); + tex_id = make_texture(compressed_ktx); + + compressed_image = piglit_ktx_get_image(compressed_ktx, 1, 0); + decompressed_image = piglit_ktx_get_image(decompressed_ktx, 1, 0); + compressed_image_4 = piglit_ktx_get_image(compressed_ktx, 5, 0); + + glViewport(0, 0, piglit_width, piglit_height); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | + GL_STENCIL_BUFFER_BIT); + + /* + * This should fail since xoffset, yoffset, width and height should + * be multiples of 4. + */ + + glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 1, 1, 2, 1, GL_ETC1_RGB8_OES, + compressed_image_4->size, compressed_image_4->data); + if (piglit_check_gl_error(GL_NO_ERROR)) + pass = false; + + glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 16, GL_ETC1_RGB8_OES, + compressed_image->size, compressed_image->data); + if (piglit_check_gl_error(GL_NO_ERROR)) + pass = false; + + glCompressedTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 16, GL_ETC1_RGB8_OES, + compressed_image->size, compressed_image->data); + glDrawArrays(GL_TRIANGLES, 0, 6); + + piglit_present_results(); + + pass = piglit_check_gl_error(GL_NO_ERROR) && + probe_image(decompressed_image, 0, 0, 32, 16) && pass; + + piglit_ktx_destroy(compressed_ktx); + piglit_ktx_destroy(decompressed_ktx); + glDeleteTextures(1, &tex_id); + + return pass ? PIGLIT_PASS : PIGLIT_FAIL; +} diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-compressed-etc1-64x32-miptree.ktx b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-compressed-etc1-64x32-miptree.ktx new file mode 100644 index 0000000000000000000000000000000000000000..71356c10a5edfcdad6ab56b434931eddbb1f4d00 GIT binary patch literal 1476 zcmZ8hX;70#7~Ui(5fHvWIXr4YKu~m$$l-xX6e-YHigF23#|ml)ZBP>l5=O0|7$6)$ z?!&4Sxfvsh+)ytfh7TA)L=q6NiZtXH5WZ^QYv?q8`poP;@9xgK&(3>nH7)Qci9%^v zZLrn=gT?6qEilWI7LjQH=&u2Qs<lblp~LdIzHXuQ=*&1y7LT-;4WxO6@cD%|hm$<d zDfmr-S3K(BZnEB)S~|$w!MwilB@d#_g8<{cWNSysSf;Q&eM{A5KAemUwLS#Bs6}62 z9}@r+Ew5;lv7p_f*K*6VLe8wSkLRZ4aH2jrgh#R;SuFs(%@+4kDu6&3BY~~-yRj)Z zkes$8{&Q%*gO#zRtW&}`My3ICGKCQW`4cIrtrJ-W-emihGR^O{H1y;<+H;O+AV+iW zNlCnyaCiqf6&Vm*H%3)hseHH%fWw3yxONVJ1x{3ass;y1;I7^etXF(meL~s|VcSto zN={kBzyb%)rR?&>qI|w{4%?G0nFT+Ddy%|T(bt5~P;>e^d?%Nm<iu89(IidhLW6kt zkU(8z>P^8n+Gy^q4Hi55kGzZB7GtJ)vRV=6;$n10)iuA+vJHSLl1B5G127!18ksZ1 z-d+sv9eUdl0Tl+knLrp8d%w)Sd^5>}fNCizuUtwYNS1D2JrJo;jjK%!Obt#0zR=Z{ zw1<g;4;TCa-*O&ziD7EG%5`kG1P%q6uu}GU@QPucvts1bBzITz<@)&5O~K{~k}FVa zV_A0PX~n}BX+>hK88bBE^_|FT4EK4AqMciVf0k)JI@9<70M@SQ>G^1YAMMiR>)zEP zXBSlXJ@)2yPJeaWrG|R%kHaNkG!GNM-ahL@F)JmJHlMt1Z5d^OV-sN?DN+-jEBOUi zCZ(@s&1A;=rTgurbrj{#l^n%H5{U`xL_gZboVMl)+C#tc;T$qvgfH680KQ5O9m`1p zcu0To(+~^bP?b&}>8vSaLB*qW$*v+{kWIn!Ti@Gplg(@H3pV(j1s#e2q7}nqfnb*6 zMrE6P>8gKoL0d1KRr+NIAg?LRWMmN?WSd<^(RMnhAgVJ~sBf+DK0#g8jQl}MaUy2m zCVB3hm1?I=Xj8NU=v8e%ktKbMhlHoom&s;cFSo;F|4=Lh6lh!8-oF7jNv=+I)c~N7 zqi}6IfgqDs#zsge1VKhB!^|s4R-eH2#hyYhgoL#+0qwmFs{p=;p#$R5BqFlGp3}<| zEj7D4N^GFy_r?3pOXm9b_i%T{0V4#N(`Xz429@jdr>0cezWEGfGTFcH_&*O04obCs zCF<!G_niYq%H}qI@7`IL+1f%EA9ryk?_<?&Z_9;#4pL2G;t2d6q<8Z-2ZQqY4cVkL z#e}l0j=S-$v$2(tyfAQ4tJ|s5)$#I&k$BvV+40VT6BS^^5)$%D$Au7WVvFx5xWKc2 z#AAgm^0asen4ngVUySBaz|)B0k~&dPB6P#|+psn7S(obqw&N;1R0?H8$kwd$G4Tz} z5!eUD9qu;LJ4Xc8Zr@$1Jas_r*eRsS%XuP)D#}a6NS+87Up|Z=s3F(~Ky{ppi~u!_ zrbn+VIOxS|`N@98#V(HPSXU(J=lK%@)%9@}btb>@0zL>0V=>S;JT3G*f;UtLza4*@ zp^XjF(<4K)DeOZK1gk&+kT(|$JArhxp?F6~K2N;!Me4@$7=mQrV*@E$0{Z!N@orMg zdPMwRY-gxiXS)B^EIUpmUBbq+kYPPTd1KZCJ0)Q~-2JKzTD3&(uKabm9+c1X*+@UZ z3YOn@;ZC^^9Mklc)&mdp8Kk{K5QZ;!L~vMyi+mbaCaJIDwR^S6!E+`AmGQD&UwGC} OOX#xQc$1%{CGZb;o3R!E literal 0 HcmV?d00001 diff --git a/tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-decompressed-rgb-64x32-miptree.ktx b/tests/spec/ext_compressed_etc1_rgb8_sub_texture/waffles-decompressed-rgb-64x32-miptree.ktx new file mode 100644 index 0000000000000000000000000000000000000000..5f3b106a665b820ed1c1fe12aca3ab806834adb5 GIT binary patch literal 8288 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 literal 0 HcmV?d00001 -- 2.4.3 _______________________________________________ Piglit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/piglit
