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>tags/17.1-branchpoint
@@ -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: |
@@ -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. */ |
@@ -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: |
@@ -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: |
@@ -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: |
@@ -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: |
@@ -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: |
@@ -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: |
@@ -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. */ |
@@ -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: |
@@ -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: |
@@ -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; |
@@ -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; | |||
} | |||
@@ -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: |
@@ -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. */ |
@@ -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; |
@@ -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) |
@@ -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 | |