[Piglit] [PATCH 3/7] texsubimage: Move sub-region selection higher in the dispatch
Topi Pohjolainen
topi.pohjolainen at intel.com
Tue Mar 1 10:13:24 UTC 2016
Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
tests/texturing/texsubimage.c | 92 +++++++++++++++++++++++++++----------------
1 file changed, 59 insertions(+), 33 deletions(-)
diff --git a/tests/texturing/texsubimage.c b/tests/texturing/texsubimage.c
index 7a5fdc6..8bebbd7 100644
--- a/tests/texturing/texsubimage.c
+++ b/tests/texturing/texsubimage.c
@@ -107,6 +107,10 @@ static const GLenum *test_targets;
* from a PBO */
static GLboolean use_pbo = GL_FALSE;
+struct sub_region {
+ int tx, ty, tz, tw, th, td;
+};
+
static const char fragment_1d_array[] =
"#extension GL_EXT_texture_array : require\n"
"uniform sampler1DArray tex;\n"
@@ -319,7 +323,7 @@ test_region(GLuint pbo, GLenum target, GLenum internal_format,
const unsigned char *updated_img,
const unsigned char *updated_ref,
unsigned w, unsigned h, unsigned d,
- int tx, int ty, int tz, int tw, int th, int td)
+ const struct sub_region *region)
{
bool pass = true;
GLuint tex;
@@ -333,19 +337,23 @@ test_region(GLuint pbo, GLenum target, GLenum internal_format,
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
/* replace texture region with data from updated image */
- glPixelStorei(GL_UNPACK_SKIP_PIXELS, tx);
- glPixelStorei(GL_UNPACK_SKIP_ROWS, ty);
- glPixelStorei(GL_UNPACK_SKIP_IMAGES, tz);
+ glPixelStorei(GL_UNPACK_SKIP_PIXELS, region->tx);
+ glPixelStorei(GL_UNPACK_SKIP_ROWS, region->ty);
+ glPixelStorei(GL_UNPACK_SKIP_IMAGES, region->tz);
if (d > 1) {
- glTexSubImage3D(target, 0, tx, ty, tz, tw, th, td,
+ glTexSubImage3D(target, 0,
+ region->tx, region->ty, region->tz,
+ region->tw, region->th, region->td,
srcFormat, GL_UNSIGNED_BYTE,
use_pbo ? NULL : updated_img);
} else if (h > 1) {
- glTexSubImage2D(target, 0, tx, ty, tw, th,
+ glTexSubImage2D(target, 0,
+ region->tx, region->ty,
+ region->tw, region->th,
srcFormat, GL_UNSIGNED_BYTE,
use_pbo ? NULL : updated_img);
} else if (w > 1) {
- glTexSubImage1D(target, 0, tx, tw,
+ glTexSubImage1D(target, 0, region->tx, region->tw,
srcFormat, GL_UNSIGNED_BYTE,
use_pbo ? NULL : updated_img);
} else {
@@ -366,12 +374,14 @@ test_region(GLuint pbo, GLenum target, GLenum internal_format,
if (!equal_images(target,
original_ref, updated_ref, test_img,
w, h, d,
- tx, ty, tz, tw, th, td)) {
+ region->tx, region->ty, region->tz,
+ region->tw, region->th, region->td)) {
printf("texsubimage failed\n");
printf(" target: %s\n", piglit_get_gl_enum_name(target));
printf(" internal format: %s\n",
piglit_get_gl_enum_name(internal_format));
- printf(" region: %d, %d %d x %d\n", tx, ty, tw, th);
+ printf(" region: %d, %d %d x %d\n",
+ region->tx, region->ty, region->tw, region->th);
pass = false;
}
@@ -399,18 +409,14 @@ test_region(GLuint pbo, GLenum target, GLenum internal_format,
*/
static GLboolean
test_format(GLenum target, GLenum intFormat,
- unsigned w, unsigned h, unsigned d)
+ unsigned w, unsigned h, unsigned d,
+ const struct sub_region *regions, unsigned num_regions)
{
GLuint tex, i, j, k, n, t;
GLubyte *original_img, *original_ref;
GLubyte *updated_img, *updated_ref;
GLboolean pass = GL_TRUE;
- GLuint bw, bh, bb, wMask, hMask, dMask;
GLuint pbo = 0;
- piglit_get_compressed_block_size(intFormat, &bw, &bh, &bb);
- wMask = ~(bw-1);
- hMask = ~(bh-1);
- dMask = ~0;
original_img = (GLubyte *) malloc(w * h * d * 4);
original_ref = (GLubyte *) malloc(w * h * d * 4);
@@ -467,26 +473,11 @@ test_format(GLenum target, GLenum intFormat,
draw_and_read_texture(w, h, d, updated_ref);
glDeleteTextures(1, &tex);
- for (t = 0; t < 10; t++) {
- /* Choose random region of texture to update.
- * Use sizes and positions that are multiples of
- * the compressed block size.
- */
- GLint tw = (rand() % w) & wMask;
- GLint th = (rand() % h) & hMask;
- GLint td = (rand() % d) & dMask;
- GLint tx = (rand() % (w - tw)) & wMask;
- GLint ty = (rand() % (h - th)) & hMask;
- GLint tz = (rand() % (d - td)) & dMask;
-
- assert(tx + tw <= w);
- assert(ty + th <= h);
- assert(tz + td <= d);
-
+ for (t = 0; t < num_regions; t++) {
if (!test_region(pbo, target, intFormat,
original_img, original_ref,
updated_img, updated_ref,
- w, h, d, tx, ty, tz, tw, th, td)) {
+ w, h, d, ®ions[t])) {
pass = GL_FALSE;
break;
}
@@ -502,6 +493,35 @@ test_format(GLenum target, GLenum intFormat,
return pass;
}
+static void
+select_regions(unsigned w, unsigned h, unsigned d, GLenum internal_format,
+ struct sub_region *regions, unsigned num_regions)
+{
+ int i;
+ GLuint bw, bh, bb, wMask, hMask, dMask;
+
+ piglit_get_compressed_block_size(internal_format, &bw, &bh, &bb);
+ wMask = ~(bw-1);
+ hMask = ~(bh-1);
+ dMask = ~0;
+
+ for (i = 0; i < num_regions; i++) {
+ /* Choose random region of texture to update.
+ * Use sizes and positions that are multiples of
+ * the compressed block size.
+ */
+ regions[i].tw = (rand() % w) & wMask;
+ regions[i].th = (rand() % h) & hMask;
+ regions[i].td = (rand() % d) & dMask;
+ regions[i].tx = (rand() % (w - regions[i].tw)) & wMask;
+ regions[i].ty = (rand() % (h - regions[i].th)) & hMask;
+ regions[i].tz = (rand() % (d - regions[i].td)) & dMask;
+
+ assert(regions[i].tx + regions[i].tw <= w);
+ assert(regions[i].ty + regions[i].th <= h);
+ assert(regions[i].tz + regions[i].td <= d);
+ }
+}
/**
* Test all formats in texsubimage_test_sets[] for the given
@@ -561,9 +581,15 @@ test_formats(GLenum target, unsigned w, unsigned h, unsigned d)
/* loop over formats in the set */
for (j = 0; j < set->num_formats; j++) {
+ struct sub_region regions[10];
+
+ select_regions(w, h, d, set->format[j].internalformat,
+ regions, ARRAY_SIZE(regions));
+
if (!test_format(target,
set->format[j].internalformat,
- w, h, d)) {
+ w, h, d,
+ regions, ARRAY_SIZE(regions))) {
pass = GL_FALSE;
}
}
--
2.5.0
More information about the Piglit
mailing list