gallium: Redefine the max texture 2d cap from _LEVELS to _SIZE.
authorEric Anholt <eric@anholt.net>
Mon, 29 Apr 2019 22:38:24 +0000 (15:38 -0700)
committerEric Anholt <eric@anholt.net>
Mon, 13 May 2019 19:03:08 +0000 (12:03 -0700)
The _LEVELS assumes that the max is always power of two.  For V3D 4.2, we
can support up to 7680 non-power-of-two MSAA textures, which will let X11
support dual 4k displays on newer hardware.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
35 files changed:
src/gallium/auxiliary/util/u_screen.c
src/gallium/auxiliary/vl/vl_video_buffer.c
src/gallium/docs/source/screen.rst
src/gallium/drivers/etnaviv/etnaviv_screen.c
src/gallium/drivers/freedreno/freedreno_screen.c
src/gallium/drivers/i915/i915_screen.c
src/gallium/drivers/iris/iris_screen.c
src/gallium/drivers/lima/lima_screen.c
src/gallium/drivers/llvmpipe/lp_screen.c
src/gallium/drivers/nouveau/nv30/nv30_screen.c
src/gallium/drivers/nouveau/nv50/nv50_screen.c
src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
src/gallium/drivers/panfrost/pan_screen.c
src/gallium/drivers/r300/r300_screen.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/r600/r600_test_dma.c
src/gallium/drivers/radeonsi/si_get.c
src/gallium/drivers/radeonsi/si_test_dma.c
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/softpipe/sp_tile_cache.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/swr/swr_screen.cpp
src/gallium/drivers/v3d/v3d_screen.c
src/gallium/drivers/vc4/vc4_screen.c
src/gallium/drivers/virgl/virgl_screen.c
src/gallium/include/pipe/p_defines.h
src/gallium/state_trackers/clover/core/device.cpp
src/gallium/state_trackers/nine/adapter9.c
src/gallium/state_trackers/osmesa/osmesa.c
src/gallium/state_trackers/vdpau/mixer.c
src/gallium/state_trackers/vdpau/query.c
src/gallium/state_trackers/wgl/stw_device.c
src/mesa/state_tracker/st_cb_bitmap.c
src/mesa/state_tracker/st_cb_drawpixels.c
src/mesa/state_tracker/st_extensions.c

index 410f17421e6365e8bed87604217ae7b4ba374ec5..f1f9bfa0d627fa719f0ef5b3e3ce972bf4ec551d 100644 (file)
@@ -51,7 +51,7 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen,
    case PIPE_CAP_TEXTURE_SWIZZLE:
       return 0;
 
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
       unreachable("driver must implement these.");
index 5b54ee1dd685ef60639c9e356626d63189455e26..71b8f88b2a425fd1dae7c4e247bc7bd8cc8c5944 100644 (file)
@@ -206,11 +206,7 @@ vl_video_buffer_is_format_supported(struct pipe_screen *screen,
 unsigned
 vl_video_buffer_max_size(struct pipe_screen *screen)
 {
-   uint32_t max_2d_texture_level;
-
-   max_2d_texture_level = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-
-   return 1 << (max_2d_texture_level-1);
+   return screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 }
 
 void
index 57554d0681d5a1a66c8c45706f1819ef658bb368..1cf89eed2f9bafb28912c842a709ee2a389605ba 100644 (file)
@@ -34,8 +34,7 @@ The integer capabilities:
 * ``PIPE_CAP_QUERY_TIME_ELAPSED``: Whether PIPE_QUERY_TIME_ELAPSED queries are available.
 * ``PIPE_CAP_TEXTURE_SWIZZLE``: Whether swizzling through sampler views is
   supported.
-* ``PIPE_CAP_MAX_TEXTURE_2D_LEVELS``: The maximum number of mipmap levels available
-  for a 2D texture.
+* ``PIPE_CAP_MAX_TEXTURE_2D_SIZE``: The maximum size of 2D (and 1D) textures.
 * ``PIPE_CAP_MAX_TEXTURE_3D_LEVELS``: The maximum number of mipmap levels available
   for a 3D texture.
 * ``PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS``: The maximum number of mipmap levels available
index 62b6f1c80fae9e8a6f5da8cecea418b7fcf13276..ce3147a7011ec45907d5d77926a8bb25565c0c15 100644 (file)
@@ -318,7 +318,8 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
       return 255;
 
    /* Texturing. */
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return screen->specs.max_texture_size;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
    {
       int log2_max_tex_size = util_last_bit(screen->specs.max_texture_size);
index 889737ae30c2e3c56460c19628dd6f4fe6266622..0ec0ad996dcfc1dfaa92dbb032689a9fa56ab56c 100644 (file)
@@ -371,7 +371,8 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                return 0;
 
        /* Texturing. */
-       case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+       case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+               return 1 << (MAX_MIP_LEVELS - 1);
        case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                return MAX_MIP_LEVELS;
        case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
index 78707c66e624d9c09c6c34934f1007d5e47131f2..d95b06968456bf37bb54be398bcc7d12e5cc0787 100644 (file)
@@ -365,12 +365,12 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
       return is->debug.lie ? 1 : 0;
 
    /* Texturing. */
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return I915_MAX_TEXTURE_2D_LEVELS;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1);
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return I915_MAX_TEXTURE_3D_LEVELS;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
-      return I915_MAX_TEXTURE_2D_LEVELS;
+      return 1 << (I915_MAX_TEXTURE_2D_LEVELS - 1);
    case PIPE_CAP_MIN_TEXEL_OFFSET:
    case PIPE_CAP_MAX_TEXEL_OFFSET:
    case PIPE_CAP_MIN_TEXTURE_GATHER_OFFSET:
index 4fd3e040a4559cb76a0f553601b46125a18026ba..e01fd1b74aac32ebba707ce6cb1e9ecba9632a79 100644 (file)
@@ -202,7 +202,8 @@ iris_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
       return 1;
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return BRW_MAX_DRAW_BUFFERS;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 16384;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
       return IRIS_MAX_MIPLEVELS; /* 16384x16384 */
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
index 31478c76f34a57149328b98f603e49db36b09070..7cced495696054798d7f9a43abc07c6f48e4d85e 100644 (file)
@@ -119,7 +119,8 @@ lima_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL:
       return 1;
 
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 1 << (LIMA_MAX_MIP_LEVELS - 1);
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
       return LIMA_MAX_MIP_LEVELS;
index 510346d2abf05aefbddd5e3f677a7bbc50229173..551d71e00e0a40e6032a64f2ef40117db366e95f 100644 (file)
@@ -140,8 +140,8 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
    case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET:
       return 0;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return LP_MAX_TEXTURE_2D_LEVELS;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 1 << (LP_MAX_TEXTURE_2D_LEVELS - 1);
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return LP_MAX_TEXTURE_3D_LEVELS;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
index b5dc033bd2d43a34fd8e7ae3651a7cd0a3b11bcf..a65e4d579039668e7344463b02f02d09f76cb60e 100644 (file)
@@ -58,8 +58,8 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    /* non-boolean capabilities */
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return (eng3d->oclass >= NV40_3D_CLASS) ? 4 : 1;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return 13;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 4096;
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return 10;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
index 6c865d75f6d28e3089529dec438a87f08c8b913b..e1cf4485ff7a40c5fde711834b08219166dc737a 100644 (file)
@@ -94,8 +94,8 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 
    switch (param) {
    /* non-boolean caps */
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return 14;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 8192;
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return 12;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
index fe80c7e91037eb178a7d3cb8bcaa0f8757a3209f..5c2d50ef559f6032dad39c1b3d8da3ede2b3cb15 100644 (file)
@@ -112,7 +112,8 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
 
    switch (param) {
    /* non-boolean caps */
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 16384;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
       return 15;
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
index 10e9ee21576130bc8f80cdd8a0925a0b5d52e705..b24bdffc2da7e1d054e3f3bb8ec5311550b265bf 100644 (file)
@@ -117,7 +117,8 @@ panfrost_get_param(struct pipe_screen *screen, enum pipe_cap param)
         case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
                 return 1;
 
-        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+        case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+                return 4096;
         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                 return 13;
index be0b475e5efc987f5c39a4ff1c9cb904d4ac15ff..5c1d37eef6ca096facd12b6d417ff3029961c357 100644 (file)
@@ -286,7 +286,8 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
             return 0;
 
         /* Texturing. */
-        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+        case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+            return is_r500 ? 4096 : 2048;
         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
             /* 13 == 4096, 12 == 2048 */
index 41a878ab9d249615adbdc2b16e73504a2a09ac09..5c915e0f91a0ed38e36e0ff250395aee384b2c65 100644 (file)
@@ -497,7 +497,11 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
                return 2048;
 
        /* Texturing. */
-       case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+       case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+               if (family >= CHIP_CEDAR)
+                       return 16384;
+               else
+                       return 8192;
        case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                if (family >= CHIP_CEDAR)
                        return 15;
index af86ad386f6d81d1518af58f83b29f50ffa3e1d9..512e7742021ba99645e2f73959d977a8e2783a85 100644 (file)
@@ -177,11 +177,10 @@ void r600_test_dma(struct r600_common_screen *rscreen)
        struct pipe_context *ctx = screen->context_create(screen, NULL, 0);
        struct r600_common_context *rctx = (struct r600_common_context*)ctx;
        uint64_t max_alloc_size;
-       unsigned i, iterations, num_partial_copies, max_levels, max_tex_side;
+       unsigned i, iterations, num_partial_copies, max_tex_side;
        unsigned num_pass = 0, num_fail = 0;
 
-       max_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-       max_tex_side = 1 << (max_levels - 1);
+       max_tex_side = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 
        /* Max 128 MB allowed for both textures. */
        max_alloc_size = 128 * 1024 * 1024;
index eb23d4fe88a13669305ac866b51c65cd9ccf2c7a..d97aca1de23cc69bcdc3643e8cdc80b3854ad9c1 100644 (file)
@@ -276,7 +276,8 @@ static int si_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                return 2048;
 
        /* Texturing. */
-       case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+       case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+               return 16384;
        case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                return 15; /* 16384 */
        case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
index 7e396e671be3ae09552502ba5810ae25bbfd5688..effdd9e82c16cb3056d58374d68af4534b8d7f17 100644 (file)
@@ -192,11 +192,10 @@ void si_test_dma(struct si_screen *sscreen)
        struct pipe_context *ctx = screen->context_create(screen, NULL, 0);
        struct si_context *sctx = (struct si_context*)ctx;
        uint64_t max_alloc_size;
-       unsigned i, iterations, num_partial_copies, max_levels, max_tex_side;
+       unsigned i, iterations, num_partial_copies, max_tex_side;
        unsigned num_pass = 0, num_fail = 0;
 
-       max_levels = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-       max_tex_side = 1 << (max_levels - 1);
+       max_tex_side = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 
        /* Max 128 MB allowed for both textures. */
        max_alloc_size = 128 * 1024 * 1024;
index 5d44824e20284725fc93314820d982e1757b6fc7..b1b777b47554fa27423a1967b73f8b4cd416702f 100644 (file)
@@ -95,8 +95,8 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
    case PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET:
       return 0;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return SP_MAX_TEXTURE_2D_LEVELS;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return 1 << (SP_MAX_TEXTURE_2D_LEVELS - 1);
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return SP_MAX_TEXTURE_3D_LEVELS;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
index 998939bdf30e3512142590d660a8d24bfd7fa698..075d322f8024e6e0ff265f7f4966ed5a52621838 100644 (file)
@@ -92,13 +92,10 @@ sp_create_tile_cache( struct pipe_context *pipe )
 {
    struct softpipe_tile_cache *tc;
    uint pos;
-   MAYBE_UNUSED int maxTexSize;
-   int maxLevels;
 
    /* sanity checking: max sure MAX_WIDTH/HEIGHT >= largest texture image */
-   maxLevels = pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-   maxTexSize = 1 << (maxLevels - 1);
-   assert(MAX_WIDTH >= maxTexSize);
+   assert(MAX_WIDTH >= pipe->screen->get_param(pipe->screen,
+                                               PIPE_CAP_MAX_TEXTURE_2D_SIZE));
 
    STATIC_ASSERT(sizeof(union tile_address) == 4);
 
index f747ff78bcfeebdd01eb927e32643967b7bfbf59..02c1a99b2db8920d9262e0e7ed4a4f62c8204bbe 100644 (file)
@@ -221,18 +221,18 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
       return 256;
 
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
       {
-         unsigned levels = SVGA_MAX_TEXTURE_LEVELS;
+         unsigned size = 1 << (SVGA_MAX_TEXTURE_LEVELS - 1);
          if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_WIDTH, &result))
-            levels = MIN2(util_logbase2(result.u) + 1, levels);
+            size = MIN2(result.u, size);
          else
-            levels = 12 /* 2048x2048 */;
+            size = 2048;
          if (sws->get_cap(sws, SVGA3D_DEVCAP_MAX_TEXTURE_HEIGHT, &result))
-            levels = MIN2(util_logbase2(result.u) + 1, levels);
+            size = MIN2(result.u, size);
          else
-            levels = 12 /* 2048x2048 */;
-         return levels;
+            size = 2048;
+         return size;
       }
 
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
@@ -245,7 +245,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
        * No mechanism to query the host, and at least limited to 2048x2048 on
        * certain hardware.
        */
-      return MIN2(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
+      return MIN2(util_last_bit(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE)),
                   12 /* 2048x2048 */);
 
    case PIPE_CAP_MAX_TEXTURE_ARRAY_LAYERS:
index 3a2a6133127701e2d8f2b7147f80a7c996e0da91..0b1347793f5c000a35ff7b0a7874d7f7190e67be 100644 (file)
@@ -52,7 +52,7 @@
  * XXX Check max texture size values against core and sampler.
  */
 #define SWR_MAX_TEXTURE_SIZE (2 * 1024 * 1024 * 1024ULL) /* 2GB */
-#define SWR_MAX_TEXTURE_2D_LEVELS 14  /* 8K x 8K for now */
+#define SWR_MAX_TEXTURE_2D_SIZE 8192
 #define SWR_MAX_TEXTURE_3D_LEVELS 12  /* 2K x 2K x 2K for now */
 #define SWR_MAX_TEXTURE_CUBE_LEVELS 14  /* 8K x 8K for now */
 #define SWR_MAX_TEXTURE_ARRAY_LAYERS 512 /* 8K x 512 / 8K x 8K x 512 */
@@ -162,8 +162,8 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
       /* limits */
    case PIPE_CAP_MAX_RENDER_TARGETS:
       return PIPE_MAX_COLOR_BUFS;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
-      return SWR_MAX_TEXTURE_2D_LEVELS;
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+      return SWR_MAX_TEXTURE_2D_SIZE;
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       return SWR_MAX_TEXTURE_3D_LEVELS;
    case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
index 6a2dc15179d7fcede852fcee513b4608f8beb81d..e902be0547439760d0ac3ea50d794eb3c6c4e802 100644 (file)
@@ -205,7 +205,11 @@ v3d_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                 return V3D_MAX_FS_INPUTS / 4;
 
                 /* Texturing. */
-        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+        case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+                if (screen->devinfo.ver < 40)
+                        return 2048;
+                else
+                        return 4096;
         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
                 if (screen->devinfo.ver < 40)
index 5fc8c35f8a952dcefcd418476601e9a9f6a64659..a9441d7ceb0eeb168bb22cb205fc5fdcd0e2d223 100644 (file)
@@ -171,7 +171,8 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
                 return 1;
 
                 /* Texturing. */
-        case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+        case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
+                return 2048;
         case PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS:
                 return VC4_MAX_MIP_LEVELS;
         case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
index 65106dbb6160c819c5b6c1503c97f2481be9a0f5..66cb6b7a21955fd338277f9da1ab27f1917fa72e 100644 (file)
@@ -82,10 +82,10 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
       return vscreen->caps.caps.v1.bset.mirror_clamp;
    case PIPE_CAP_TEXTURE_SWIZZLE:
       return 1;
-   case PIPE_CAP_MAX_TEXTURE_2D_LEVELS:
+   case PIPE_CAP_MAX_TEXTURE_2D_SIZE:
       if (vscreen->caps.caps.v2.max_texture_2d_size)
-         return 1 + util_logbase2(vscreen->caps.caps.v2.max_texture_2d_size);
-      return 15; /* 16K x 16K */
+         return vscreen->caps.caps.v2.max_texture_2d_size;
+      return 16384;
    case PIPE_CAP_MAX_TEXTURE_3D_LEVELS:
       if (vscreen->caps.caps.v2.max_texture_3d_size)
          return 1 + util_logbase2(vscreen->caps.caps.v2.max_texture_3d_size);
index e59a92ea529f3d9b7ae24e1406f88bcc83bd7d73..ed7c81b793cb836474a1055e49b304920a8ca679 100644 (file)
@@ -691,7 +691,7 @@ enum pipe_cap
    PIPE_CAP_OCCLUSION_QUERY,
    PIPE_CAP_QUERY_TIME_ELAPSED,
    PIPE_CAP_TEXTURE_SWIZZLE,
-   PIPE_CAP_MAX_TEXTURE_2D_LEVELS,
+   PIPE_CAP_MAX_TEXTURE_2D_SIZE,
    PIPE_CAP_MAX_TEXTURE_3D_LEVELS,
    PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS,
    PIPE_CAP_TEXTURE_MIRROR_CLAMP,
index de635454857941f2804a6256ff0f9f8999a3c5ec..c7aea827938f03785a2d0f18c7edfcf7dcac48c5 100644 (file)
@@ -25,6 +25,7 @@
 #include "core/platform.hpp"
 #include "pipe/p_screen.h"
 #include "pipe/p_state.h"
+#include "util/bitscan.h"
 #include "util/u_debug.h"
 
 using namespace clover;
@@ -108,7 +109,7 @@ device::max_image_buffer_size() const {
 
 cl_uint
 device::max_image_levels_2d() const {
-   return pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+   return util_last_bit(pipe->get_param(pipe, PIPE_CAP_MAX_TEXTURE_2D_SIZE));
 }
 
 cl_uint
index 3aa95b93b2ffcd7af9af1f64dc9a9669a7fddbcb..7ed27de3070d2f0ba108faea7aec25356e3bdea8 100644 (file)
@@ -685,7 +685,7 @@ NineAdapter9_GetDeviceCaps( struct NineAdapter9 *This,
         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_NONPOW2CONDITIONAL) |
         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_CUBEMAP_POW2) |
         D3DNPIPECAP(NPOT_TEXTURES, D3DPTEXTURECAPS_VOLUMEMAP_POW2) |
-        D3DPIPECAP(MAX_TEXTURE_2D_LEVELS, D3DPTEXTURECAPS_MIPMAP) |
+        D3DPIPECAP(MAX_TEXTURE_2D_SIZE, D3DPTEXTURECAPS_MIPMAP) |
         D3DPIPECAP(MAX_TEXTURE_3D_LEVELS, D3DPTEXTURECAPS_MIPVOLUMEMAP) |
         D3DPIPECAP(MAX_TEXTURE_CUBE_LEVELS, D3DPTEXTURECAPS_MIPCUBEMAP);
 
@@ -726,8 +726,8 @@ NineAdapter9_GetDeviceCaps( struct NineAdapter9 *This,
         pCaps->LineCaps |= D3DLINECAPS_ANTIALIAS;
     }
 
-    pCaps->MaxTextureWidth =
-        1 << (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+    pCaps->MaxTextureWidth =screen->get_param(screen,
+                                              PIPE_CAP_MAX_TEXTURE_2D_SIZE);
     pCaps->MaxTextureHeight = pCaps->MaxTextureWidth;
     pCaps->MaxVolumeExtent =
         1 << (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS) - 1);
index e7e0ab13acb9c65e7923eb8e85325840db02e1f4..e70c391a905ce67971852a6778479c5b7248e3dc 100644 (file)
@@ -885,9 +885,7 @@ OSMesaGetIntegerv(GLint pname, GLint *value)
    case OSMESA_MAX_HEIGHT:
       {
          struct pipe_screen *screen = get_st_manager()->screen;
-         int maxLevels = screen->get_param(screen,
-                                           PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-         *value = 1 << (maxLevels - 1);
+         *value = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
       }
       return;
    default:
index 76b52255ef2aa9a36e20b67dae2658bde4220b48..a50232bfac3592aac9652a273472fc118d23e2e0 100644 (file)
@@ -49,7 +49,6 @@ vlVdpVideoMixerCreate(VdpDevice device,
    vlVdpVideoMixer *vmixer = NULL;
    VdpStatus ret;
    struct pipe_screen *screen;
-   uint32_t max_2d_texture_level;
    unsigned max_size, i;
 
    vlVdpDevice *dev = vlGetDataHTAB(device);
@@ -148,8 +147,7 @@ vlVdpVideoMixerCreate(VdpDevice device,
       goto no_params;
    }
 
-   max_2d_texture_level = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
-   max_size = pow(2, max_2d_texture_level-1);
+   max_size = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
    if (vmixer->video_width < 48 || vmixer->video_width > max_size) {
       VDPAU_MSG(VDPAU_WARN, "[VDPAU] 48 < %u < %u not valid for width\n",
                 vmixer->video_width, max_size);
index 2c4ebe62e19563904adfa379ef7fa9c1008c6ccd..5f644bbeea00ca743bf06e8496a0d167c4853645 100644 (file)
@@ -69,7 +69,7 @@ vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chrom
 {
    vlVdpDevice *dev;
    struct pipe_screen *pscreen;
-   uint32_t max_2d_texture_level;
+   uint32_t max_2d_texture_size;
 
    if (!(is_supported && max_width && max_height))
       return VDP_STATUS_INVALID_POINTER;
@@ -86,13 +86,12 @@ vlVdpVideoSurfaceQueryCapabilities(VdpDevice device, VdpChromaType surface_chrom
 
    /* XXX: Current limits */
    *is_supported = true;
-   max_2d_texture_level = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+   max_2d_texture_size = pscreen->get_param(pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
    mtx_unlock(&dev->mutex);
-   if (!max_2d_texture_level)
+   if (!max_2d_texture_size)
       return VDP_STATUS_RESOURCES;
 
-   /* I am not quite sure if it is max_2d_texture_level-1 or just max_2d_texture_level */
-   *max_width = *max_height = pow(2,max_2d_texture_level-1);
+   *max_width = *max_height = max_2d_texture_size;
 
    return VDP_STATUS_OK;
 }
@@ -251,15 +250,15 @@ vlVdpOutputSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba
       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
    );
    if (*is_supported) {
-      uint32_t max_2d_texture_level = pscreen->get_param(
-         pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+      uint32_t max_2d_texture_size = pscreen->get_param(
+         pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 
-      if (!max_2d_texture_level) {
+      if (!max_2d_texture_size) {
          mtx_unlock(&dev->mutex);
          return VDP_STATUS_ERROR;
       }
 
-      *max_width = *max_height = pow(2, max_2d_texture_level - 1);
+      *max_width = *max_height = max_2d_texture_size;
    } else {
       *max_width = 0;
       *max_height = 0;
@@ -451,15 +450,15 @@ vlVdpBitmapSurfaceQueryCapabilities(VdpDevice device, VdpRGBAFormat surface_rgba
       PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET
    );
    if (*is_supported) {
-      uint32_t max_2d_texture_level = pscreen->get_param(
-         pscreen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+      uint32_t max_2d_texture_size = pscreen->get_param(
+         pscreen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 
-      if (!max_2d_texture_level) {
+      if (!max_2d_texture_size) {
          mtx_unlock(&dev->mutex);
          return VDP_STATUS_ERROR;
       }
 
-      *max_width = *max_height = pow(2, max_2d_texture_level - 1);
+      *max_width = *max_height = max_2d_texture_size;
    } else {
       *max_width = 0;
       *max_height = 0;
index f04689a974dfdf99a585922a3e59ef18b3de29ad..f1b1dfd9a14af9bdc10e89cb7ff074396a0379a1 100644 (file)
@@ -121,8 +121,8 @@ stw_init(const struct stw_winsys *stw_winsys)
    stw_dev->smapi->get_param = stw_get_param;
    stw_dev->screen = screen;
 
-   stw_dev->max_2d_levels =
-         screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS);
+   stw_dev->max_2d_levels = util_last_bit(screen->get_param(screen,
+                                                            PIPE_CAP_MAX_TEXTURE_2D_SIZE));
    stw_dev->max_2d_length = 1 << (stw_dev->max_2d_levels - 1);
 
    InitializeCriticalSection(&stw_dev->ctx_mutex);
index d7e2ccb3815df7757a408aee35306e04dd35bf9f..948b5819300d9d54abe82707d8e78871e099b423 100644 (file)
@@ -304,8 +304,7 @@ draw_bitmap_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
        * it up into chunks.
        */
       GLuint MAYBE_UNUSED maxSize =
-         1 << (pipe->screen->get_param(pipe->screen,
-                                       PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+         pipe->screen->get_param(pipe->screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
       assert(width <= (GLsizei) maxSize);
       assert(height <= (GLsizei) maxSize);
    }
index 6f6b42596e6f3fe51855f914a3395bc70bb95365..59868d3ff1debd70043830bc1a918924264fc7c1 100644 (file)
@@ -758,8 +758,8 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
    /* XXX if DrawPixels image is larger than max texture size, break
     * it up into chunks.
     */
-   maxSize = 1 << (pipe->screen->get_param(pipe->screen,
-                                        PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+   maxSize = pipe->screen->get_param(pipe->screen,
+                                     PIPE_CAP_MAX_TEXTURE_2D_SIZE);
    assert(width <= maxSize);
    assert(height <= maxSize);
 
@@ -1181,9 +1181,8 @@ static void
 clamp_size(struct pipe_context *pipe, GLsizei *width, GLsizei *height,
            struct gl_pixelstore_attrib *unpack)
 {
-   const int maxSize =
-      1 << (pipe->screen->get_param(pipe->screen,
-                                    PIPE_CAP_MAX_TEXTURE_2D_LEVELS) - 1);
+   const int maxSize = pipe->screen->get_param(pipe->screen,
+                                               PIPE_CAP_MAX_TEXTURE_2D_SIZE);
 
    if (*width > maxSize) {
       if (unpack->RowLength == 0)
index 77cb83d5c57505a91a5a17396079bb4eb3691752..86b68542e7bc47da10eec62a3b799f20fe557abf 100644 (file)
@@ -84,11 +84,8 @@ void st_init_limits(struct pipe_screen *screen,
    bool can_ubo = true;
    int temp;
 
-   int max_texture_levels =
-      _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
-           MAX_TEXTURE_LEVELS);
-
-   c->MaxTextureSize = 1 << (max_texture_levels - 1);
+   c->MaxTextureSize = screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_SIZE);
+   c->MaxTextureSize = MIN2(c->MaxTextureSize, 1 << (MAX_TEXTURE_LEVELS - 1));
 
    c->Max3DTextureLevels
       = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),