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 Marektags/10.3-branchpoint
| @@ -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, 0, 0, 1, 1, 1, NONE, "ELSE", TGSI_OPCODE_ELSE }, | |||
| { 0, 0, 0, 0, 1, 0, NONE, "ENDIF", TGSI_OPCODE_ENDIF }, | |||
| { 1, 0, 0, 0, 1, 0, NONE, "", 79 }, /* removed */ | |||
| { 0, 0, 0, 0, 1, 0, NONE, "", 80 }, /* removed */ | |||
| { 1, 1, 0, 0, 0, 0, COMP, "DDX_FINE", TGSI_OPCODE_DDX_FINE }, | |||
| { 1, 1, 0, 0, 0, 0, COMP, "DDY_FINE", TGSI_OPCODE_DDY_FINE }, | |||
| { 0, 1, 0, 0, 0, 0, NONE, "PUSHA", TGSI_OPCODE_PUSHA }, | |||
| { 1, 0, 0, 0, 0, 0, NONE, "POPA", TGSI_OPCODE_POPA }, | |||
| { 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_IMUL_HI: | |||
| case TGSI_OPCODE_UMUL_HI: | |||
| case TGSI_OPCODE_DDX_FINE: | |||
| case TGSI_OPCODE_DDY_FINE: | |||
| /* Channel-wise operations */ | |||
| read_mask = write_mask; | |||
| break; | |||
| @@ -213,6 +213,8 @@ The integer capabilities: | |||
| * ``PIPE_CAP_DRAW_INDIRECT``: Whether the driver supports taking draw arguments | |||
| { count, instance_count, start, index_bias } from a PIPE_BUFFER resource. | |||
| See pipe_draw_info. | |||
| * ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE``: Whether the fragment shader supports | |||
| the FINE versions of DDX/DDY. | |||
| .. _pipe_capf: | |||
| @@ -433,7 +433,11 @@ This instruction replicates its result. | |||
| 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:: | |||
| @@ -446,7 +450,11 @@ This instruction replicates its result. | |||
| 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:: | |||
| @@ -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_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| /* 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_BUFFER_MAP_PERSISTENT_COHERENT: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| 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_MAX_VERTEX_STREAMS: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| default: | |||
| @@ -248,6 +248,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum pipe_cap param) | |||
| case PIPE_CAP_SAMPLE_SHADING: | |||
| case PIPE_CAP_TEXTURE_GATHER_OFFSETS: | |||
| case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| case PIPE_CAP_FAKE_SW_MSAA: | |||
| 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_COMPUTE: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| 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_COMPUTE: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| 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_FAKE_SW_MSAA: | |||
| case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| 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_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| /* 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_TEXTURE_GATHER_OFFSETS: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| /* 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_TEXTURE_GATHER_OFFSETS: | |||
| case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| 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_TEXTURE_GATHER_OFFSETS: | |||
| case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| case PIPE_CAP_FAKE_SW_MSAA: | |||
| 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_TGSI_VS_WINDOW_SPACE_POSITION: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| case PIPE_CAP_MIN_MAP_BUFFER_ALIGNMENT: | |||
| 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_VERTEX_STREAMS: | |||
| case PIPE_CAP_DRAW_INDIRECT: | |||
| case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE: | |||
| return 0; | |||
| /* Stream output. */ | |||
| @@ -562,6 +562,7 @@ enum pipe_cap { | |||
| PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION = 99, | |||
| PIPE_CAP_MAX_VERTEX_STREAMS = 100, | |||
| PIPE_CAP_DRAW_INDIRECT = 101, | |||
| PIPE_CAP_TGSI_FS_FINE_DERIVATIVE = 102, | |||
| }; | |||
| #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_ELSE 77 | |||
| #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_POPA 82 | |||
| #define TGSI_OPCODE_CEIL 83 | |||