gallium: implement seamless cubemap extensions
authorMarek Olšák <maraeo@gmail.com>
Mon, 2 May 2011 00:37:46 +0000 (02:37 +0200)
committerMarek Olšák <maraeo@gmail.com>
Fri, 6 May 2011 18:06:30 +0000 (20:06 +0200)
Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/docs/source/cso/sampler.rst
src/gallium/include/pipe/p_defines.h
src/gallium/include/pipe/p_state.h
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_extensions.c

index 9bbb784de8edf492a4d6d515c7f971d192bbcbee..648b5cc60eab1295d85975538459ba5de478fa62 100644 (file)
@@ -107,3 +107,7 @@ max_anisotropy
     Set to zero to disable anisotropic filtering.  Any other setting enables
     anisotropic filtering, however it's not unexpected some drivers only will
     change their filtering with a setting of 2 and higher.
+seamless_cube_map
+    If set, the bilinear filter of a cube map may take samples from adjacent
+    cube map faces when sampled near a texture border to produce a seamless
+    look.
\ No newline at end of file
index 5f7dd96516c5965431905bca37025bd666908412..c0c2a7c7fd26fa48d5a6669b7dd2424d30d0eaf0 100644 (file)
@@ -466,6 +466,8 @@ enum pipe_cap {
    PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR = 44,
    PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL = 45,
    PIPE_CAP_MIXED_COLORBUFFER_FORMATS = 46,
+   PIPE_CAP_SEAMLESS_CUBE_MAP = 47,
+   PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE = 48,
 };
 
 /* Shader caps not specific to any single stage */
index 0c1f509a1597e9688e680e76343f978fde870c85..86ef255cd2e6b784bc0bee576aa38a7e4593b190 100644 (file)
@@ -269,6 +269,7 @@ struct pipe_sampler_state
    unsigned compare_func:3;      /**< PIPE_FUNC_x */
    unsigned normalized_coords:1; /**< Are coords normalized to [0,1]? */
    unsigned max_anisotropy:6;
+   unsigned seamless_cube_map:1;
    float lod_bias;               /**< LOD/lambda bias */
    float min_lod, max_lod;       /**< LOD clamp range, after bias */
    float border_color[4];
index 56da010b3856e0a4e47dadfce816e0c49020c30b..e3d6cbb8e12ead2eb4e94ba92f8ce51785e85dd4 100644 (file)
@@ -201,6 +201,9 @@ update_samplers(struct st_context *st)
                = st_compare_func_to_pipe(msamp->CompareFunc);
          }
 
+         sampler->seamless_cube_map =
+               st->ctx->Texture.CubeMapSeamless || msamp->CubeMapSeamless;
+
          st->state.num_samplers = su + 1;
 
          /*printf("%s su=%u non-null\n", __FUNCTION__, su);*/
index 030bbc797fb1030cf117af604a4d491884b288fd..ad8e6bb9ec94a4c6796fdd3ec8c706aa4dc1a285 100644 (file)
@@ -595,4 +595,12 @@ void st_init_extensions(struct st_context *st)
                                    PIPE_BIND_SAMPLER_VIEW)) {
       ctx->Extensions.EXT_packed_float = GL_TRUE;
    }
+
+   if (screen->get_param(screen, PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE)) {
+      ctx->Extensions.ARB_seamless_cube_map = GL_TRUE;
+      ctx->Extensions.AMD_seamless_cubemap_per_texture = GL_TRUE;
+   }
+   else if (screen->get_param(screen, PIPE_CAP_SEAMLESS_CUBE_MAP)) {
+      ctx->Extensions.ARB_seamless_cube_map = GL_TRUE;
+   }
 }