Covers use of the textureSize() glsl builtin with multisample samplers

Signed-off-by: Chris Forbes <[email protected]>
---
 tests/all.tests                       |  6 +++++
 tests/texturing/shaders/common.c      | 41 ++++++++++++++++++++++++++---
 tests/texturing/shaders/textureSize.c | 49 ++++++++++++++++++++++++-----------
 3 files changed, 78 insertions(+), 18 deletions(-)

diff --git a/tests/all.tests b/tests/all.tests
index 6c455c4..19d7cf9 100644
--- a/tests/all.tests
+++ b/tests/all.tests
@@ -850,6 +850,12 @@ add_concurrent_test(arb_texture_multisample, 
'arb_texture_multisample-sample-mas
 add_concurrent_test(arb_texture_multisample, 
'arb_texture_multisample-sample-mask-value')
 add_concurrent_test(arb_texture_multisample, 
'arb_texture_multisample-sample-mask-execution')
 add_concurrent_test(arb_texture_multisample, 
'arb_texture_multisample-sample-mask-execution -tex')
+textureSize_samplers_atm = ['sampler2DMS', 'isampler2DMS', 'usampler2DMS',
+                                                       'sampler2DMSArray', 
'isampler2DMSArray', 'usampler2DMSArray']
+for stage in ['vs', 'fs']:
+       # textureSize():
+       for sampler in textureSize_samplers_atm:
+               spec['ARB_texture_multisample/textureSize/' + stage + 
'-textureSize-' + sampler] = concurrent_test('textureSize ' + stage + ' ' + 
sampler)
 
 # Group AMD_shader_stencil_export
 spec['AMD_shader_stencil_export'] = Group()
diff --git a/tests/texturing/shaders/common.c b/tests/texturing/shaders/common.c
index aa69a5d..cf9c2b1 100644
--- a/tests/texturing/shaders/common.c
+++ b/tests/texturing/shaders/common.c
@@ -88,6 +88,27 @@ upload_miplevel_data(GLenum target, int level, void 
*level_image)
                glTexBuffer(GL_TEXTURE_BUFFER, internal_format, bo);
                break;
 
+       /* TODO: reconsider hardwired sample count */
+       /* TODO: perhaps render some initial content to the texture?
+        *     (direct uploads of multisample texture images are not allowed,
+        *     but we could render something) */
+       case GL_TEXTURE_2D_MULTISAMPLE:
+               glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4,
+                               internal_format,
+                               level_size[level][0],
+                               level_size[level][1],
+                               GL_TRUE);
+               break;
+       
+       case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
+               glTexImage3DMultisample(GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 4,
+                               internal_format,
+                               level_size[level][0],
+                               level_size[level][1],
+                               level_size[level][2],
+                               GL_TRUE);
+               break;
+
        default:
                assert(!"Not implemented yet.");
                break;
@@ -134,7 +155,9 @@ compute_miplevel_info()
        miplevels = (int) log2f(max_dimension) + 1;
 
        if (sampler.target == GL_TEXTURE_RECTANGLE ||
-           sampler.target == GL_TEXTURE_BUFFER)
+           sampler.target == GL_TEXTURE_BUFFER ||
+               sampler.target == GL_TEXTURE_2D_MULTISAMPLE ||
+               sampler.target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
                miplevels = 1;
 
        /* Compute the size of each miplevel */
@@ -159,7 +182,9 @@ has_height()
        return sampler.target == GL_TEXTURE_2D ||
               sampler.target == GL_TEXTURE_3D ||
               sampler.target == GL_TEXTURE_2D_ARRAY ||
-              sampler.target == GL_TEXTURE_RECTANGLE;
+              sampler.target == GL_TEXTURE_RECTANGLE ||
+              sampler.target == GL_TEXTURE_2D_MULTISAMPLE ||
+              sampler.target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
 }
 
 bool
@@ -173,7 +198,8 @@ is_array_sampler()
 {
        return sampler.target == GL_TEXTURE_1D_ARRAY ||
               sampler.target == GL_TEXTURE_2D_ARRAY ||
-              sampler.target == GL_TEXTURE_CUBE_MAP_ARRAY;
+              sampler.target == GL_TEXTURE_CUBE_MAP_ARRAY ||
+              sampler.target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY;
 }
 
 bool
@@ -207,6 +233,8 @@ select_sampler(const char *name)
                { "sampler2DArray",         GL_SAMPLER_2D_ARRAY,                
    GL_TEXTURE_2D_ARRAY       },
                { "samplerCubeArray",       GL_SAMPLER_CUBE_MAP_ARRAY,          
    GL_TEXTURE_CUBE_MAP_ARRAY },
                { "samplerBuffer",          GL_SAMPLER_BUFFER,                  
    GL_TEXTURE_BUFFER },
+               { "sampler2DMS",            GL_SAMPLER_2D_MULTISAMPLE,          
    GL_TEXTURE_2D_MULTISAMPLE },
+               { "sampler2DMSArray",       GL_SAMPLER_2D_MULTISAMPLE_ARRAY,    
    GL_TEXTURE_2D_MULTISAMPLE_ARRAY },
 
                { "sampler1DShadow",        GL_SAMPLER_1D_SHADOW,               
    GL_TEXTURE_1D             },
                { "sampler2DShadow",        GL_SAMPLER_2D_SHADOW,               
    GL_TEXTURE_2D             },
@@ -225,6 +253,8 @@ select_sampler(const char *name)
                { "isampler2DArray",        GL_INT_SAMPLER_2D_ARRAY,            
    GL_TEXTURE_2D_ARRAY       },
                { "isamplerCubeArray",      GL_INT_SAMPLER_CUBE_MAP_ARRAY,      
    GL_TEXTURE_CUBE_MAP_ARRAY },
                { "isamplerBuffer",         GL_INT_SAMPLER_BUFFER,              
    GL_TEXTURE_BUFFER },
+               { "isampler2DMS",           GL_INT_SAMPLER_2D_MULTISAMPLE,      
    GL_TEXTURE_2D_MULTISAMPLE },
+               { "isampler2DMSArray",      
GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY,    GL_TEXTURE_2D_MULTISAMPLE_ARRAY },
 
                { "usampler1D",             GL_UNSIGNED_INT_SAMPLER_1D,         
    GL_TEXTURE_1D             },
                { "usampler2D",             GL_UNSIGNED_INT_SAMPLER_2D,         
    GL_TEXTURE_2D             },
@@ -235,6 +265,8 @@ select_sampler(const char *name)
                { "usampler2DArray",        GL_UNSIGNED_INT_SAMPLER_2D_ARRAY,   
    GL_TEXTURE_2D_ARRAY       },
                { "usamplerCubeArray",      
GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY, GL_TEXTURE_CUBE_MAP_ARRAY },
                { "usamplerBuffer",         GL_UNSIGNED_INT_SAMPLER_BUFFER,     
    GL_TEXTURE_BUFFER },
+               { "usampler2DMS",           
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE, GL_TEXTURE_2D_MULTISAMPLE },
+               { "usampler2DMSArray",      
GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY, GL_TEXTURE_2D_MULTISAMPLE_ARRAY },
        };
 
        for (i = 0; i < ARRAY_SIZE(samplers); i++) {
@@ -321,6 +353,9 @@ require_GL_features(enum shader_target test_stage)
        case GL_TEXTURE_BUFFER:
                piglit_require_extension("GL_ARB_texture_buffer_object");
                break;
+       case GL_TEXTURE_2D_MULTISAMPLE:
+       case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
+               piglit_require_extension("GL_ARB_texture_multisample");
        }
 
        /* If testing in the VS, check for VS texture units */
diff --git a/tests/texturing/shaders/textureSize.c 
b/tests/texturing/shaders/textureSize.c
index 6adca7f..eef3855 100644
--- a/tests/texturing/shaders/textureSize.c
+++ b/tests/texturing/shaders/textureSize.c
@@ -60,7 +60,7 @@ PIGLIT_GL_TEST_CONFIG_END
 static int lod_location;
 static int vertex_location;
 
-static char *cube_map_array_extension = "";
+static char *extension = "";
 
 /**
  * Returns the number of components expected from textureSize().
@@ -76,10 +76,12 @@ sampler_size()
        case GL_TEXTURE_1D_ARRAY:
        case GL_TEXTURE_CUBE_MAP:
        case GL_TEXTURE_RECTANGLE:
+       case GL_TEXTURE_2D_MULTISAMPLE:
                return 2;
        case GL_TEXTURE_3D:
        case GL_TEXTURE_2D_ARRAY:
        case GL_TEXTURE_CUBE_MAP_ARRAY:
+       case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
                return 3;
        default:
                assert(!"Should not get here.");
@@ -181,10 +183,12 @@ generate_texture()
 
        glGenTextures(1, &tex);
        glBindTexture(target, tex);
-       if (target == GL_TEXTURE_BUFFER) {
-               /* Texture buffers only use texelFetch() and
-                * textureSize(), so setting the filter parameters on
-                * them is invalid.
+       if (target == GL_TEXTURE_BUFFER ||
+               target == GL_TEXTURE_2D_MULTISAMPLE ||
+               target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY) {
+               /* Texture buffers, multisample textures and multisample
+                * texture arrays only use texelFetch() and textureSize(),
+                * so setting the filter parameters on them is invalid.
                 */
        } else if (target == GL_TEXTURE_RECTANGLE) {
                glTexParameteri(target, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
@@ -195,7 +199,9 @@ generate_texture()
                glTexParameteri(target, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        }
 
-       if (target != GL_TEXTURE_BUFFER) {
+       if (target != GL_TEXTURE_BUFFER &&
+               target != GL_TEXTURE_2D_MULTISAMPLE &&
+               target != GL_TEXTURE_2D_MULTISAMPLE_ARRAY) {
                glTexParameteri(target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
                glTexParameteri(target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
        }
@@ -212,6 +218,19 @@ generate_texture()
        }
 }
 
+bool
+has_lod(void)
+{
+       switch (sampler.target) {
+               case GL_TEXTURE_RECTANGLE:
+               case GL_TEXTURE_BUFFER:
+               case GL_TEXTURE_2D_MULTISAMPLE:
+               case GL_TEXTURE_2D_MULTISAMPLE_ARRAY:
+                       return false;
+               default:
+                       return true;
+       }
+}
 
 int
 generate_GLSL(enum shader_target test_stage)
@@ -226,13 +245,10 @@ generate_GLSL(enum shader_target test_stage)
        const int size = sampler_size();
 
        /* The GLSL 1.40 sampler2DRect/samplerBuffer samplers don't
-        * take a lod argument.
+        * take a lod argument. Neither do ARB_texture_multisample's
+        * sampler2DMS/sampler2DMSArray samplers.
         */
-       if (sampler.target == GL_TEXTURE_RECTANGLE ||
-           sampler.target == GL_TEXTURE_BUFFER)
-               lod_arg = "";
-       else
-               lod_arg = ", lod";
+       lod_arg = has_lod() ? ", lod" : "";
 
        switch (test_stage) {
        case VS:
@@ -248,7 +264,7 @@ generate_GLSL(enum shader_target test_stage)
                         "    size = textureSize(tex%s);\n"
                         "    gl_Position = vertex;\n"
                         "}\n",
-                        shader_version, cube_map_array_extension, 
sampler.name, size, lod_arg);
+                        shader_version, extension, sampler.name, size, 
lod_arg);
                asprintf(&fs_code,
                         "#version %d\n"
                         "#define ivec1 int\n"
@@ -279,7 +295,7 @@ generate_GLSL(enum shader_target test_stage)
                         "    ivec%d size = textureSize(tex%s);\n"
                         "    gl_FragColor = vec4(0.01 * size,%s 1);\n"
                         "}\n",
-                        shader_version, cube_map_array_extension, 
sampler.name, size, lod_arg,
+                        shader_version, extension, sampler.name, size, lod_arg,
                         zeroes[3 - size]);
                break;
        default:
@@ -342,7 +358,10 @@ piglit_init(int argc, char **argv)
        require_GL_features(test_stage);
 
        if (sampler.target == GL_TEXTURE_CUBE_MAP_ARRAY)
-               cube_map_array_extension = "#extension 
GL_ARB_texture_cube_map_array : enable\n";
+               extension = "#extension GL_ARB_texture_cube_map_array : 
enable\n";
+       if (sampler.target == GL_TEXTURE_2D_MULTISAMPLE
+               || sampler.target == GL_TEXTURE_2D_MULTISAMPLE_ARRAY)
+               extension = "#extension GL_ARB_texture_multisample : enable\n";
 
        prog = generate_GLSL(test_stage);
        if (!prog)
-- 
1.8.1

_______________________________________________
Piglit mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to