gallium: add opcodes/cap for fine derivative support
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu> Reviewed-by: Marek Olšák <marek.olsak@amd.com> (v1) Reviewed-by: Roland Scheidegger <sroland@vmware.com> (v1) v2: Reuse opcode gaps as suggested by Marek
This commit is contained in:
@@ -116,8 +116,8 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
|
|||||||
{ 0, 1, 0, 0, 0, 1, NONE, "", 76 }, /* removed */
|
{ 0, 1, 0, 0, 0, 1, NONE, "", 76 }, /* removed */
|
||||||
{ 0, 0, 0, 1, 1, 1, NONE, "ELSE", TGSI_OPCODE_ELSE },
|
{ 0, 0, 0, 1, 1, 1, NONE, "ELSE", TGSI_OPCODE_ELSE },
|
||||||
{ 0, 0, 0, 0, 1, 0, NONE, "ENDIF", TGSI_OPCODE_ENDIF },
|
{ 0, 0, 0, 0, 1, 0, NONE, "ENDIF", TGSI_OPCODE_ENDIF },
|
||||||
{ 1, 0, 0, 0, 1, 0, NONE, "", 79 }, /* removed */
|
{ 1, 1, 0, 0, 0, 0, COMP, "DDX_FINE", TGSI_OPCODE_DDX_FINE },
|
||||||
{ 0, 0, 0, 0, 1, 0, NONE, "", 80 }, /* removed */
|
{ 1, 1, 0, 0, 0, 0, COMP, "DDY_FINE", TGSI_OPCODE_DDY_FINE },
|
||||||
{ 0, 1, 0, 0, 0, 0, NONE, "PUSHA", TGSI_OPCODE_PUSHA },
|
{ 0, 1, 0, 0, 0, 0, NONE, "PUSHA", TGSI_OPCODE_PUSHA },
|
||||||
{ 1, 0, 0, 0, 0, 0, NONE, "POPA", TGSI_OPCODE_POPA },
|
{ 1, 0, 0, 0, 0, 0, NONE, "POPA", TGSI_OPCODE_POPA },
|
||||||
{ 1, 1, 0, 0, 0, 0, COMP, "CEIL", TGSI_OPCODE_CEIL },
|
{ 1, 1, 0, 0, 0, 0, COMP, "CEIL", TGSI_OPCODE_CEIL },
|
||||||
|
@@ -245,6 +245,8 @@ tgsi_util_get_inst_usage_mask(const struct tgsi_full_instruction *inst,
|
|||||||
case TGSI_OPCODE_USNE:
|
case TGSI_OPCODE_USNE:
|
||||||
case TGSI_OPCODE_IMUL_HI:
|
case TGSI_OPCODE_IMUL_HI:
|
||||||
case TGSI_OPCODE_UMUL_HI:
|
case TGSI_OPCODE_UMUL_HI:
|
||||||
|
case TGSI_OPCODE_DDX_FINE:
|
||||||
|
case TGSI_OPCODE_DDY_FINE:
|
||||||
/* Channel-wise operations */
|
/* Channel-wise operations */
|
||||||
read_mask = write_mask;
|
read_mask = write_mask;
|
||||||
break;
|
break;
|
||||||
|
@@ -213,6 +213,8 @@ The integer capabilities:
|
|||||||
* ``PIPE_CAP_DRAW_INDIRECT``: Whether the driver supports taking draw arguments
|
* ``PIPE_CAP_DRAW_INDIRECT``: Whether the driver supports taking draw arguments
|
||||||
{ count, instance_count, start, index_bias } from a PIPE_BUFFER resource.
|
{ count, instance_count, start, index_bias } from a PIPE_BUFFER resource.
|
||||||
See pipe_draw_info.
|
See pipe_draw_info.
|
||||||
|
* ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE``: Whether the fragment shader supports
|
||||||
|
the FINE versions of DDX/DDY.
|
||||||
|
|
||||||
|
|
||||||
.. _pipe_capf:
|
.. _pipe_capf:
|
||||||
|
@@ -433,7 +433,11 @@ This instruction replicates its result.
|
|||||||
dst = \cos{src.x}
|
dst = \cos{src.x}
|
||||||
|
|
||||||
|
|
||||||
.. opcode:: DDX - Derivative Relative To X
|
.. opcode:: DDX, DDX_FINE - Derivative Relative To X
|
||||||
|
|
||||||
|
The fine variant is only used when ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE`` is
|
||||||
|
advertised. When it is, the fine version guarantees one derivative per row
|
||||||
|
while DDX is allowed to be the same for the entire 2x2 quad.
|
||||||
|
|
||||||
.. math::
|
.. math::
|
||||||
|
|
||||||
@@ -446,7 +450,11 @@ This instruction replicates its result.
|
|||||||
dst.w = partialx(src.w)
|
dst.w = partialx(src.w)
|
||||||
|
|
||||||
|
|
||||||
.. opcode:: DDY - Derivative Relative To Y
|
.. opcode:: DDY, DDY_FINE - Derivative Relative To Y
|
||||||
|
|
||||||
|
The fine variant is only used when ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE`` is
|
||||||
|
advertised. When it is, the fine version guarantees one derivative per column
|
||||||
|
while DDY is allowed to be the same for the entire 2x2 quad.
|
||||||
|
|
||||||
.. math::
|
.. math::
|
||||||
|
|
||||||
|
@@ -216,6 +216,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Stream output. */
|
/* Stream output. */
|
||||||
|
@@ -231,6 +231,7 @@ i915_get_param(struct pipe_screen *screen, enum pipe_cap cap)
|
|||||||
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
|
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
|
||||||
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
|
case PIPE_CAP_BUFFER_MAP_PERSISTENT_COHERENT:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
||||||
|
@@ -433,6 +433,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
case PIPE_CAP_MAX_VERTEX_STREAMS:
|
case PIPE_CAP_MAX_VERTEX_STREAMS:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@@ -248,6 +248,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_SAMPLE_SHADING:
|
case PIPE_CAP_SAMPLE_SHADING:
|
||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
case PIPE_CAP_FAKE_SW_MSAA:
|
case PIPE_CAP_FAKE_SW_MSAA:
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -148,6 +148,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_USER_VERTEX_BUFFERS:
|
case PIPE_CAP_USER_VERTEX_BUFFERS:
|
||||||
case PIPE_CAP_COMPUTE:
|
case PIPE_CAP_COMPUTE:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -200,6 +200,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
case PIPE_CAP_COMPUTE:
|
case PIPE_CAP_COMPUTE:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -184,6 +184,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
|
case PIPE_CAP_TGSI_VS_LAYER_VIEWPORT:
|
||||||
case PIPE_CAP_FAKE_SW_MSAA:
|
case PIPE_CAP_FAKE_SW_MSAA:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -178,6 +178,7 @@ static int r300_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* SWTCL-only features. */
|
/* SWTCL-only features. */
|
||||||
|
@@ -319,6 +319,7 @@ static int r600_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_SAMPLE_SHADING:
|
case PIPE_CAP_SAMPLE_SHADING:
|
||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Stream output. */
|
/* Stream output. */
|
||||||
|
@@ -254,6 +254,7 @@ static int si_get_param(struct pipe_screen* pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_FAKE_SW_MSAA:
|
case PIPE_CAP_FAKE_SW_MSAA:
|
||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
|
case PIPE_CAP_TEXTURE_BORDER_COLOR_QUIRK:
|
||||||
|
@@ -194,6 +194,7 @@ softpipe_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_SAMPLE_SHADING:
|
case PIPE_CAP_SAMPLE_SHADING:
|
||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
case PIPE_CAP_FAKE_SW_MSAA:
|
case PIPE_CAP_FAKE_SW_MSAA:
|
||||||
return 1;
|
return 1;
|
||||||
|
@@ -278,6 +278,7 @@ svga_get_param(struct pipe_screen *screen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
|
||||||
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT:
|
||||||
return 64;
|
return 64;
|
||||||
|
@@ -157,6 +157,7 @@ vc4_screen_get_param(struct pipe_screen *pscreen, enum pipe_cap param)
|
|||||||
case PIPE_CAP_MAX_TEXEL_OFFSET:
|
case PIPE_CAP_MAX_TEXEL_OFFSET:
|
||||||
case PIPE_CAP_MAX_VERTEX_STREAMS:
|
case PIPE_CAP_MAX_VERTEX_STREAMS:
|
||||||
case PIPE_CAP_DRAW_INDIRECT:
|
case PIPE_CAP_DRAW_INDIRECT:
|
||||||
|
case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Stream output. */
|
/* Stream output. */
|
||||||
|
@@ -562,6 +562,7 @@ enum pipe_cap {
|
|||||||
PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION = 99,
|
PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION = 99,
|
||||||
PIPE_CAP_MAX_VERTEX_STREAMS = 100,
|
PIPE_CAP_MAX_VERTEX_STREAMS = 100,
|
||||||
PIPE_CAP_DRAW_INDIRECT = 101,
|
PIPE_CAP_DRAW_INDIRECT = 101,
|
||||||
|
PIPE_CAP_TGSI_FS_FINE_DERIVATIVE = 102,
|
||||||
};
|
};
|
||||||
|
|
||||||
#define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
|
#define PIPE_QUIRK_TEXTURE_BORDER_COLOR_SWIZZLE_NV50 (1 << 0)
|
||||||
|
@@ -352,7 +352,10 @@ struct tgsi_property_data {
|
|||||||
#define TGSI_OPCODE_UIF 75
|
#define TGSI_OPCODE_UIF 75
|
||||||
#define TGSI_OPCODE_ELSE 77
|
#define TGSI_OPCODE_ELSE 77
|
||||||
#define TGSI_OPCODE_ENDIF 78
|
#define TGSI_OPCODE_ENDIF 78
|
||||||
/* gap */
|
|
||||||
|
#define TGSI_OPCODE_DDX_FINE 79
|
||||||
|
#define TGSI_OPCODE_DDY_FINE 80
|
||||||
|
|
||||||
#define TGSI_OPCODE_PUSHA 81
|
#define TGSI_OPCODE_PUSHA 81
|
||||||
#define TGSI_OPCODE_POPA 82
|
#define TGSI_OPCODE_POPA 82
|
||||||
#define TGSI_OPCODE_CEIL 83
|
#define TGSI_OPCODE_CEIL 83
|
||||||
|
Reference in New Issue
Block a user