gallium: add separate PIPE_CAP_INT64_DIVMOD
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 5 Feb 2017 03:31:29 +0000 (22:31 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Thu, 9 Feb 2017 17:57:21 +0000 (12:57 -0500)
Nouveau does not currently have logic to implement this as a library
function. Even though such a library could be written, there's no big
advantage to do it that way for now given that int64 is a very uncommon
use-case. Allow a driver to expose INT64 without supporting division and
modulo operations.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
18 files changed:
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/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/r300/r300_screen.c
src/gallium/drivers/r600/r600_pipe.c
src/gallium/drivers/radeonsi/si_pipe.c
src/gallium/drivers/softpipe/sp_screen.c
src/gallium/drivers/svga/svga_screen.c
src/gallium/drivers/swr/swr_screen.cpp
src/gallium/drivers/vc4/vc4_screen.c
src/gallium/drivers/virgl/virgl_screen.c
src/gallium/include/pipe/p_defines.h
src/mesa/state_tracker/st_glsl_to_tgsi.cpp

index 4f5b4bb9c665993d23a0bba65aff24a651ef2312..74c8ceca20fddb18d5ef39807d435ce4169d0345 100644 (file)
@@ -376,6 +376,8 @@ The integer capabilities:
 * ``PIPE_CAP_DOUBLES``: Whether double precision floating-point operations
   are supported.
 * ``PIPE_CAP_INT64``: Whether 64-bit integer operations are supported.
+* ``PIPE_CAP_INT64_DIVMOD``: Whether 64-bit integer division/modulo
+  operations are supported.
 
 
 .. _pipe_capf:
index 8f2882f57310805c7ad8f8018316bb532547b3cc..e3090dc52c2c8a51e39a6bbc67293f82b598d4fe 100644 (file)
@@ -243,6 +243,7 @@ etna_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    /* Stream output. */
index bc8a2772b678bac938842f63aaf733d04a781e68..1122e29269d0846d491601956259f91057c3dcba 100644 (file)
@@ -300,6 +300,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
        case PIPE_CAP_TGSI_MUL_ZERO_WINS:
        case PIPE_CAP_DOUBLES:
        case PIPE_CAP_INT64:
+       case PIPE_CAP_INT64_DIVMOD:
                return 0;
 
        case PIPE_CAP_MAX_VIEWPORTS:
index 76f20fcc14cea1ddd254ba4ac130da196cf8e6a3..038cca1c67f193f73cdebc6d393c588746e97e21 100644 (file)
@@ -300,6 +300,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    case PIPE_CAP_MAX_VIEWPORTS:
index 0b12119201230910c0b9b742ae8365bc92c57964..76a30a6164349045a892e27168594275ae91636e 100644 (file)
@@ -269,6 +269,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_ARRAY_COMPONENTS:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 1;
 
    case PIPE_CAP_VENDOR_ID:
index b43d85288c6f0e907538d967e37b9c99b1e22635..6c58a0acce5ea7ecd8db8b5fcb1bf817c4b9726e 100644 (file)
@@ -210,6 +210,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index 32c3de32072a168f2b062437dc0df04a4866456a..aa756ed8c4c14c1e9b8aed5c4e7b089f49835892 100644 (file)
@@ -262,6 +262,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_TGSI_FS_FBFETCH:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index b995cde0e2268e3f87ff6973a4c1e7d702305af6..e99dc4cd89b6502263fa0b4408b768fe75e1800c 100644 (file)
@@ -282,6 +282,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
    case PIPE_CAP_NATIVE_FENCE_FD:
    case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index 1410740731c2e764ccefa605748615af4365cdf5..7ea6a1c16ad54e59e5f57e3b2ada55c1991a0bac 100644 (file)
@@ -232,6 +232,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
         case PIPE_CAP_TGSI_MUL_ZERO_WINS:
         case PIPE_CAP_DOUBLES:
         case PIPE_CAP_INT64:
+        case PIPE_CAP_INT64_DIVMOD:
             return 0;
 
         /* SWTCL-only features. */
index 2cc16b227a0a711771b92f18ee14886994c2595f..5290f40d6cb96857ead28ae50cb964c1c1cd9e10 100644 (file)
@@ -379,6 +379,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_GLSL_OPTIMIZE_CONSERVATIVELY:
        case PIPE_CAP_TGSI_FS_FBFETCH:
        case PIPE_CAP_INT64:
+       case PIPE_CAP_INT64_DIVMOD:
                return 0;
 
        case PIPE_CAP_DOUBLES:
index 8ce4d50f99a9bb04c1e6552d75a404283792906c..853d850ffab978879742c04e5adfb56770228daa 100644 (file)
@@ -419,6 +419,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
        case PIPE_CAP_DOUBLES:
                return HAVE_LLVM >= 0x0307;
        case PIPE_CAP_INT64:
+       case PIPE_CAP_INT64_DIVMOD:
                return HAVE_LLVM >= 0x0309;
 
        case PIPE_CAP_RESOURCE_FROM_USER_MEMORY:
index fd7ce2508a2240c994e0f3883917d8c34645e124..02eff918237c6c2018f0f8aa5218f7f897c549f1 100644 (file)
@@ -167,6 +167,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 1;
    case PIPE_CAP_CONSTANT_BUFFER_OFFSET_ALIGNMENT:
       return 16;
index f404fb5fbd8a0ceb4020befd1fbb8b58f89132ee..f9dfcd2158567cffdbe9a8a4622ac704d42da7e4 100644 (file)
@@ -426,6 +426,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_DOUBLES:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
    }
 
index 52c60493cd9f2b0c5a9f029fd525868a2e0ff196..f4fe1f39458de20af861da5bf78a7a9f04d3fb02 100644 (file)
@@ -318,6 +318,7 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_FS_FBFETCH:
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
 
    case PIPE_CAP_VENDOR_ID:
index 76f12acb39f0d597ffe6c327bbb952094a651637..5cc0b04dc15f4f030bc58dedbafdb70b18c4adc3 100644 (file)
@@ -246,6 +246,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
         case PIPE_CAP_TGSI_MUL_ZERO_WINS:
         case PIPE_CAP_DOUBLES:
         case PIPE_CAP_INT64:
+        case PIPE_CAP_INT64_DIVMOD:
                 return 0;
 
                 /* Stream output. */
index 39df5f689d4f2aa2614a18a692aec85670754df2..49df4f2e439a0214b737c40b19f454e478fb0817 100644 (file)
@@ -255,6 +255,7 @@ virgl_get_param(struct pipe_screen *screen, enum pipe_cap param)
    case PIPE_CAP_TGSI_FS_FBFETCH:
    case PIPE_CAP_TGSI_MUL_ZERO_WINS:
    case PIPE_CAP_INT64:
+   case PIPE_CAP_INT64_DIVMOD:
       return 0;
    case PIPE_CAP_VENDOR_ID:
       return 0x1af4;
index 9915957590eff05babe6d0e595b1465338353332..1d6d2640557cbe1430d15cae57bb5bf888e979a0 100644 (file)
@@ -754,6 +754,7 @@ enum pipe_cap
    PIPE_CAP_TGSI_MUL_ZERO_WINS,
    PIPE_CAP_DOUBLES,
    PIPE_CAP_INT64,
+   PIPE_CAP_INT64_DIVMOD,
 };
 
 #define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
index fc981ab0b2211a35ea169627b689fbc3dd9ca8fc..630f5af821c5b794be192109c5ef91d3e91ccc5e 100644 (file)
@@ -7042,6 +7042,9 @@ st_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
                                              options->EmitNoIndirectUniform);
       }
 
+      if (!pscreen->get_param(pscreen, PIPE_CAP_INT64_DIVMOD))
+         lower_64bit_integer_instructions(ir, DIV64 | MOD64);
+
       if (ctx->Extensions.ARB_shading_language_packing) {
          unsigned lower_inst = LOWER_PACK_SNORM_2x16 |
                                LOWER_UNPACK_SNORM_2x16 |