| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright 2002-2003 Jason Edmeades | 
					
						
							|  |  |  |  * Copyright 2002-2003 Raphael Junqueira | 
					
						
							|  |  |  |  * Copyright 2004 Christian Costa | 
					
						
							|  |  |  |  * Copyright 2005 Oliver Stieber | 
					
						
							|  |  |  |  * Copyright 2006 Ivan Gyurdiev | 
					
						
							|  |  |  |  * Copyright 2007-2008, 2013 Stefan Dösinger for CodeWeavers | 
					
						
							|  |  |  |  * Copyright 2009-2011 Henri Verbeet for CodeWeavers | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2.1 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License along with this library; if not, write to the Free Software | 
					
						
							|  |  |  |  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "vkd3d_shader_private.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <stdio.h>
 | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  | #include <math.h>
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  | static const char * const shader_register_names[] = | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:56 -05:00
										 |  |  |     [VKD3DSPR_ADDR              ] = "a", | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |     [VKD3DSPR_ATTROUT           ] = "oD", | 
					
						
							|  |  |  |     [VKD3DSPR_COLOROUT          ] = "oC", | 
					
						
							|  |  |  |     [VKD3DSPR_COMBINED_SAMPLER  ] = "s", | 
					
						
							|  |  |  |     [VKD3DSPR_CONST             ] = "c", | 
					
						
							|  |  |  |     [VKD3DSPR_CONSTBOOL         ] = "b", | 
					
						
							|  |  |  |     [VKD3DSPR_CONSTBUFFER       ] = "cb", | 
					
						
							|  |  |  |     [VKD3DSPR_CONSTINT          ] = "i", | 
					
						
							|  |  |  |     [VKD3DSPR_COVERAGE          ] = "vCoverage", | 
					
						
							|  |  |  |     [VKD3DSPR_DEPTHOUT          ] = "oDepth", | 
					
						
							|  |  |  |     [VKD3DSPR_DEPTHOUTGE        ] = "oDepthGE", | 
					
						
							|  |  |  |     [VKD3DSPR_DEPTHOUTLE        ] = "oDepthLE", | 
					
						
							|  |  |  |     [VKD3DSPR_FORKINSTID        ] = "vForkInstanceId", | 
					
						
							|  |  |  |     [VKD3DSPR_FUNCTIONBODY      ] = "fb", | 
					
						
							|  |  |  |     [VKD3DSPR_FUNCTIONPOINTER   ] = "fp", | 
					
						
							|  |  |  |     [VKD3DSPR_GROUPSHAREDMEM    ] = "g", | 
					
						
							|  |  |  |     [VKD3DSPR_GSINSTID          ] = "vGSInstanceID", | 
					
						
							|  |  |  |     [VKD3DSPR_IDXTEMP           ] = "x", | 
					
						
							|  |  |  |     [VKD3DSPR_IMMCONST          ] = "l", | 
					
						
							|  |  |  |     [VKD3DSPR_IMMCONST64        ] = "d", | 
					
						
							|  |  |  |     [VKD3DSPR_IMMCONSTBUFFER    ] = "icb", | 
					
						
							|  |  |  |     [VKD3DSPR_INCONTROLPOINT    ] = "vicp", | 
					
						
							|  |  |  |     [VKD3DSPR_INPUT             ] = "v", | 
					
						
							|  |  |  |     [VKD3DSPR_JOININSTID        ] = "vJoinInstanceId", | 
					
						
							|  |  |  |     [VKD3DSPR_LABEL             ] = "l", | 
					
						
							|  |  |  |     [VKD3DSPR_LOCALTHREADID     ] = "vThreadIDInGroup", | 
					
						
							|  |  |  |     [VKD3DSPR_LOCALTHREADINDEX  ] = "vThreadIDInGroupFlattened", | 
					
						
							|  |  |  |     [VKD3DSPR_LOOP              ] = "aL", | 
					
						
							|  |  |  |     [VKD3DSPR_NULL              ] = "null", | 
					
						
							|  |  |  |     [VKD3DSPR_OUTCONTROLPOINT   ] = "vocp", | 
					
						
							|  |  |  |     [VKD3DSPR_OUTPOINTID        ] = "vOutputControlPointID", | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:56 -05:00
										 |  |  |     [VKD3DSPR_OUTPUT            ] = "o", | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |     [VKD3DSPR_OUTSTENCILREF     ] = "oStencilRef", | 
					
						
							|  |  |  |     [VKD3DSPR_PARAMETER         ] = "parameter", | 
					
						
							|  |  |  |     [VKD3DSPR_PATCHCONST        ] = "vpc", | 
					
						
							|  |  |  |     [VKD3DSPR_POINT_COORD       ] = "vPointCoord", | 
					
						
							|  |  |  |     [VKD3DSPR_PREDICATE         ] = "p", | 
					
						
							|  |  |  |     [VKD3DSPR_PRIMID            ] = "primID", | 
					
						
							|  |  |  |     [VKD3DSPR_RASTERIZER        ] = "rasterizer", | 
					
						
							|  |  |  |     [VKD3DSPR_RESOURCE          ] = "t", | 
					
						
							|  |  |  |     [VKD3DSPR_SAMPLEMASK        ] = "oMask", | 
					
						
							|  |  |  |     [VKD3DSPR_SAMPLER           ] = "s", | 
					
						
							|  |  |  |     [VKD3DSPR_SSA               ] = "sr", | 
					
						
							|  |  |  |     [VKD3DSPR_STREAM            ] = "m", | 
					
						
							|  |  |  |     [VKD3DSPR_TEMP              ] = "r", | 
					
						
							|  |  |  |     [VKD3DSPR_TESSCOORD         ] = "vDomainLocation", | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:56 -05:00
										 |  |  |     [VKD3DSPR_TEXCRDOUT         ] = "oT", | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:56 -05:00
										 |  |  |     [VKD3DSPR_TEXTURE           ] = "t", | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |     [VKD3DSPR_THREADGROUPID     ] = "vThreadGroupID", | 
					
						
							|  |  |  |     [VKD3DSPR_THREADID          ] = "vThreadID", | 
					
						
							|  |  |  |     [VKD3DSPR_UAV               ] = "u", | 
					
						
							|  |  |  |     [VKD3DSPR_UNDEF             ] = "undef", | 
					
						
							|  |  |  |     [VKD3DSPR_WAVELANECOUNT     ] = "vWaveLaneCount", | 
					
						
							|  |  |  |     [VKD3DSPR_WAVELANEINDEX     ] = "vWaveLaneIndex", | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  | struct vkd3d_d3d_asm_colours | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *reset; | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |     const char *error; | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     const char *literal; | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |     const char *modifier; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     const char *opcode; | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |     const char *reg; | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:04 +01:00
										 |  |  |     const char *swizzle; | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:07 +01:00
										 |  |  |     const char *version; | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:03 +01:00
										 |  |  |     const char *write_mask; | 
					
						
							| 
									
										
										
										
											2024-03-07 14:47:32 +01:00
										 |  |  |     const char *label; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  | struct vkd3d_d3d_asm_compiler | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer buffer; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  |     struct vkd3d_shader_version shader_version; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     struct vkd3d_d3d_asm_colours colours; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:14:33 +01:00
										 |  |  |     enum vsir_asm_flags flags; | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |     const struct vkd3d_shader_instruction *current; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-18 22:38:45 +02:00
										 |  |  | static void shader_dump_global_flags(struct vkd3d_d3d_asm_compiler *compiler, enum vsir_global_flags global_flags) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |     unsigned int i; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |     static const struct | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-10-18 22:38:45 +02:00
										 |  |  |         enum vsir_global_flags flag; | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |         const char *name; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |     global_flag_info[] = | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         {VKD3DSGF_REFACTORING_ALLOWED,               "refactoringAllowed"}, | 
					
						
							|  |  |  |         {VKD3DSGF_FORCE_EARLY_DEPTH_STENCIL,         "forceEarlyDepthStencil"}, | 
					
						
							|  |  |  |         {VKD3DSGF_ENABLE_RAW_AND_STRUCTURED_BUFFERS, "enableRawAndStructuredBuffers"}, | 
					
						
							|  |  |  |         {VKD3DSGF_ENABLE_MINIMUM_PRECISION,          "enableMinimumPrecision"}, | 
					
						
							| 
									
										
										
										
											2020-09-15 18:05:11 +01:00
										 |  |  |         {VKD3DSGF_SKIP_OPTIMIZATION,                 "skipOptimization"}, | 
					
						
							| 
									
										
										
										
											2021-07-10 01:31:36 +10:00
										 |  |  |         {VKD3DSGF_ENABLE_DOUBLE_PRECISION_FLOAT_OPS, "enableDoublePrecisionFloatOps"}, | 
					
						
							|  |  |  |         {VKD3DSGF_ENABLE_11_1_DOUBLE_EXTENSIONS,     "enable11_1DoubleExtensions"}, | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |     for (i = 0; i < ARRAY_SIZE(global_flag_info); ++i) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |         if (global_flags & global_flag_info[i].flag) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             vkd3d_string_buffer_printf(&compiler->buffer, "%s", global_flag_info[i].name); | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |             global_flags &= ~global_flag_info[i].flag; | 
					
						
							|  |  |  |             if (global_flags) | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(&compiler->buffer, " | "); | 
					
						
							| 
									
										
										
										
											2018-10-11 15:33:33 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (global_flags) | 
					
						
							| 
									
										
										
										
											2023-10-20 15:01:35 +02:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "unknown_flags(%#"PRIx64")", (uint64_t)global_flags); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 16:03:47 +10:00
										 |  |  | static void shader_dump_atomic_op_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t atomic_flags) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (atomic_flags & VKD3DARF_SEQ_CST) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_seqCst"); | 
					
						
							|  |  |  |         atomic_flags &= ~VKD3DARF_SEQ_CST; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (atomic_flags & VKD3DARF_VOLATILE) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_volatile"); | 
					
						
							|  |  |  |         atomic_flags &= ~VKD3DARF_VOLATILE; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (atomic_flags) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", atomic_flags); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | static void shader_dump_sync_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t sync_flags) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-03 21:09:17 -06:00
										 |  |  |     if (sync_flags & VKD3DSSF_GLOBAL_UAV) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_uglobal"); | 
					
						
							| 
									
										
										
										
											2021-02-03 21:09:17 -06:00
										 |  |  |         sync_flags &= ~VKD3DSSF_GLOBAL_UAV; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-08-16 13:46:10 +10:00
										 |  |  |     if (sync_flags & VKD3DSSF_THREAD_GROUP_UAV) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_ugroup"); | 
					
						
							|  |  |  |         sync_flags &= ~VKD3DSSF_THREAD_GROUP_UAV; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     if (sync_flags & VKD3DSSF_GROUP_SHARED_MEMORY) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_g"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         sync_flags &= ~VKD3DSSF_GROUP_SHARED_MEMORY; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (sync_flags & VKD3DSSF_THREAD_GROUP) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_t"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         sync_flags &= ~VKD3DSSF_THREAD_GROUP; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (sync_flags) | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", sync_flags); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | static void shader_dump_precise_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t flags) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (!(flags & VKD3DSI_PRECISE_XYZW)) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, " [precise"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     if (flags != VKD3DSI_PRECISE_XYZW) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "(%s%s%s%s)", | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 flags & VKD3DSI_PRECISE_X ? "x" : "", | 
					
						
							|  |  |  |                 flags & VKD3DSI_PRECISE_Y ? "y" : "", | 
					
						
							|  |  |  |                 flags & VKD3DSI_PRECISE_Z ? "z" : "", | 
					
						
							|  |  |  |                 flags & VKD3DSI_PRECISE_W ? "w" : ""); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "]"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | static void shader_dump_uav_flags(struct vkd3d_d3d_asm_compiler *compiler, uint32_t uav_flags) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     if (uav_flags & VKD3DSUF_GLOBALLY_COHERENT) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_glc"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         uav_flags &= ~VKD3DSUF_GLOBALLY_COHERENT; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     if (uav_flags & VKD3DSUF_ORDER_PRESERVING_COUNTER) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_opc"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         uav_flags &= ~VKD3DSUF_ORDER_PRESERVING_COUNTER; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-08-28 14:17:17 +10:00
										 |  |  |     if (uav_flags & VKD3DSUF_RASTERISER_ORDERED_VIEW) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_rov"); | 
					
						
							|  |  |  |         uav_flags &= ~VKD3DSUF_RASTERISER_ORDERED_VIEW; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (uav_flags) | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "_unknown_flags(%#x)", uav_flags); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  | static void shader_print_tessellator_domain(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, enum vkd3d_tessellator_domain d, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |     const char *domain; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |     switch (d) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_TESSELLATOR_DOMAIN_LINE: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |             domain = "domain_isoline"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_TESSELLATOR_DOMAIN_TRIANGLE: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |             domain = "domain_tri"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_TESSELLATOR_DOMAIN_QUAD: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |             domain = "domain_quad"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator domain %#x>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, d, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, domain, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  | static void shader_print_tessellator_output_primitive(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, enum vkd3d_shader_tessellator_output_primitive p, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |     const char *primitive; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |     switch (p) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:13 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_OUTPUT_POINT: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             primitive = "output_point"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:13 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_OUTPUT_LINE: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             primitive = "output_line"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:13 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_OUTPUT_TRIANGLE_CW: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             primitive = "output_triangle_cw"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:13 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_OUTPUT_TRIANGLE_CCW: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             primitive = "output_triangle_ccw"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator output primitive %#x>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, p, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, primitive, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  | static void shader_print_tessellator_partitioning(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, enum vkd3d_shader_tessellator_partitioning p, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |     const char *partitioning; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |     switch (p) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:14 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_PARTITIONING_INTEGER: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             partitioning = "partitioning_integer"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:14 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_PARTITIONING_POW2: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             partitioning = "partitioning_pow2"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:14 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_PARTITIONING_FRACTIONAL_ODD: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             partitioning = "partitioning_fractional_odd"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							| 
									
										
										
										
											2020-06-23 13:50:14 +04:30
										 |  |  |         case VKD3D_SHADER_TESSELLATOR_PARTITIONING_FRACTIONAL_EVEN: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             partitioning = "partitioning_fractional_even"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled tessellator partitioning %#x>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, p, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, partitioning, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  | static void shader_print_input_sysval_semantic(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, enum vkd3d_shader_input_sysval_semantic semantic, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  |     static const struct | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         enum vkd3d_shader_input_sysval_semantic sysval_semantic; | 
					
						
							|  |  |  |         const char *sysval_name; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     shader_input_sysval_semantic_names[] = | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         {VKD3D_SIV_POSITION,                   "position"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_CLIP_DISTANCE,              "clip_distance"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_CULL_DISTANCE,              "cull_distance"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_RENDER_TARGET_ARRAY_INDEX,  "render_target_array_index"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_VIEWPORT_ARRAY_INDEX,       "viewport_array_index"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_VERTEX_ID,                  "vertex_id"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_INSTANCE_ID,                "instance_id"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_PRIMITIVE_ID,               "primitive_id"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_IS_FRONT_FACE,              "is_front_face"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_SAMPLE_INDEX,               "sample_index"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_U0_TESS_FACTOR,        "finalQuadUeq0EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_V0_TESS_FACTOR,        "finalQuadVeq0EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_U1_TESS_FACTOR,        "finalQuadUeq1EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_V1_TESS_FACTOR,        "finalQuadVeq1EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_U_INNER_TESS_FACTOR,   "finalQuadUInsideTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_QUAD_V_INNER_TESS_FACTOR,   "finalQuadVInsideTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_TRIANGLE_U_TESS_FACTOR,     "finalTriUeq0EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_TRIANGLE_V_TESS_FACTOR,     "finalTriVeq0EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_TRIANGLE_W_TESS_FACTOR,     "finalTriWeq0EdgeTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_TRIANGLE_INNER_TESS_FACTOR, "finalTriInsideTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_LINE_DETAIL_TESS_FACTOR,    "finalLineDetailTessFactor"}, | 
					
						
							|  |  |  |         {VKD3D_SIV_LINE_DENSITY_TESS_FACTOR,   "finalLineDensityTessFactor"}, | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     for (i = 0; i < ARRAY_SIZE(shader_input_sysval_semantic_names); ++i) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  |         if (shader_input_sysval_semantic_names[i].sysval_semantic != semantic) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", | 
					
						
							|  |  |  |                 prefix, shader_input_sysval_semantic_names[i].sysval_name, suffix); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s<unhandled input sysval semantic %#x>%s%s", | 
					
						
							|  |  |  |             prefix, compiler->colours.error, semantic, compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-03 17:39:36 +02:00
										 |  |  | static void shader_print_resource_type(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_resource_type type) | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  | { | 
					
						
							|  |  |  |     static const char *const resource_type_names[] = | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-12 12:29:35 +02:00
										 |  |  |         [VKD3D_SHADER_RESOURCE_NONE             ] = "none", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_BUFFER           ] = "buffer", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_1D       ] = "texture1d", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_2D       ] = "texture2d", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_2DMS     ] = "texture2dms", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_3D       ] = "texture3d", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_CUBE     ] = "texturecube", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_1DARRAY  ] = "texture1darray", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_2DARRAY  ] = "texture2darray", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY] = "texture2dmsarray", | 
					
						
							|  |  |  |         [VKD3D_SHADER_RESOURCE_TEXTURE_CUBEARRAY] = "texturecubearray", | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-30 15:34:01 -05:00
										 |  |  |     if (type < ARRAY_SIZE(resource_type_names)) | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s", resource_type_names[type]); | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2025-04-03 17:39:36 +02:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s<unhandled resource type %#x>%s", | 
					
						
							|  |  |  |                 compiler->colours.error, type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-03 17:41:04 +02:00
										 |  |  | static void shader_print_data_type(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_data_type type) | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:05 -05:00
										 |  |  | { | 
					
						
							|  |  |  |     static const char *const data_type_names[] = | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-06-12 12:29:35 +02:00
										 |  |  |         [VKD3D_DATA_FLOAT    ] = "float", | 
					
						
							|  |  |  |         [VKD3D_DATA_INT      ] = "int", | 
					
						
							|  |  |  |         [VKD3D_DATA_UINT     ] = "uint", | 
					
						
							|  |  |  |         [VKD3D_DATA_UNORM    ] = "unorm", | 
					
						
							|  |  |  |         [VKD3D_DATA_SNORM    ] = "snorm", | 
					
						
							|  |  |  |         [VKD3D_DATA_OPAQUE   ] = "opaque", | 
					
						
							|  |  |  |         [VKD3D_DATA_MIXED    ] = "mixed", | 
					
						
							|  |  |  |         [VKD3D_DATA_DOUBLE   ] = "double", | 
					
						
							|  |  |  |         [VKD3D_DATA_CONTINUED] = "<continued>", | 
					
						
							|  |  |  |         [VKD3D_DATA_UNUSED   ] = "<unused>", | 
					
						
							| 
									
										
										
										
											2023-11-30 11:54:53 +01:00
										 |  |  |         [VKD3D_DATA_UINT8    ] = "uint8", | 
					
						
							|  |  |  |         [VKD3D_DATA_UINT64   ] = "uint64", | 
					
						
							|  |  |  |         [VKD3D_DATA_BOOL     ] = "bool", | 
					
						
							| 
									
										
										
										
											2023-12-13 15:40:48 +10:00
										 |  |  |         [VKD3D_DATA_UINT16   ] = "uint16", | 
					
						
							|  |  |  |         [VKD3D_DATA_HALF     ] = "half", | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:05 -05:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (type < ARRAY_SIZE(data_type_names)) | 
					
						
							| 
									
										
										
										
											2025-04-03 17:41:04 +02:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s", data_type_names[type]); | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  |     else | 
					
						
							| 
									
										
										
										
											2025-04-03 17:41:04 +02:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s<unhandled data type %#x>%s", | 
					
						
							|  |  |  |                 compiler->colours.error, type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void shader_dump_resource_data_type(struct vkd3d_d3d_asm_compiler *compiler, const enum vkd3d_data_type *type) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-09-26 01:05:37 +01:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "("); | 
					
						
							| 
									
										
										
										
											2020-09-26 01:05:37 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < 4; i++) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s", i == 0 ? "" : ","); | 
					
						
							| 
									
										
										
										
											2025-04-03 17:41:04 +02:00
										 |  |  |         shader_print_data_type(compiler, type[i]); | 
					
						
							| 
									
										
										
										
											2020-09-26 01:05:37 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2020-09-17 00:14:45 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, ")"); | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:05 -05:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  | static void shader_print_dcl_usage(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_semantic *semantic, uint32_t flags, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |     unsigned int usage_idx; | 
					
						
							|  |  |  |     const char *usage; | 
					
						
							|  |  |  |     bool indexed; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-07 16:45:18 -06:00
										 |  |  |     if (semantic->resource.reg.reg.type == VKD3DSPR_COMBINED_SAMPLER) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         switch (semantic->resource_type) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             case VKD3D_SHADER_RESOURCE_TEXTURE_2D: | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |                 usage = "2d"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             case VKD3D_SHADER_RESOURCE_TEXTURE_3D: | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |                 usage = "volume"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             case VKD3D_SHADER_RESOURCE_TEXTURE_CUBE: | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |                 usage = "cube"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 break; | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s%s<unhandled resource type %#x>%s%s", | 
					
						
							|  |  |  |                         prefix, compiler->colours.error, semantic->resource_type, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |                 return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, usage, suffix); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (semantic->resource.reg.reg.type == VKD3DSPR_RESOURCE || semantic->resource.reg.reg.type == VKD3DSPR_UAV) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s", prefix); | 
					
						
							| 
									
										
										
										
											2020-06-30 15:02:03 +04:30
										 |  |  |         if (semantic->resource.reg.reg.type == VKD3DSPR_RESOURCE) | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "resource_"); | 
					
						
							| 
									
										
										
										
											2020-09-15 18:05:12 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-04-03 17:39:36 +02:00
										 |  |  |         shader_print_resource_type(compiler, semantic->resource_type); | 
					
						
							| 
									
										
										
										
											2023-03-04 09:58:46 +01:00
										 |  |  |         if (semantic->resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMS | 
					
						
							|  |  |  |                 || semantic->resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "(%u)", semantic->sample_count); | 
					
						
							| 
									
										
										
										
											2023-03-04 09:58:46 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2020-06-30 15:02:03 +04:30
										 |  |  |         if (semantic->resource.reg.reg.type == VKD3DSPR_UAV) | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_uav_flags(compiler, flags); | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, " "); | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  |         shader_dump_resource_data_type(compiler, semantic->resource_data_type); | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s", suffix); | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |     /* Pixel shaders 3.0 don't have usage semantics. */ | 
					
						
							|  |  |  |     if (!vkd3d_shader_ver_ge(&compiler->shader_version, 3, 0) | 
					
						
							|  |  |  |             && compiler->shader_version.type == VKD3D_SHADER_TYPE_PIXEL) | 
					
						
							|  |  |  |         return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |     indexed = false; | 
					
						
							|  |  |  |     usage_idx = semantic->usage_idx; | 
					
						
							|  |  |  |     switch (semantic->usage) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_POSITION: | 
					
						
							|  |  |  |             usage = "position"; | 
					
						
							|  |  |  |             indexed = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_BLEND_INDICES: | 
					
						
							|  |  |  |             usage = "blend"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_BLEND_WEIGHT: | 
					
						
							|  |  |  |             usage = "weight"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_NORMAL: | 
					
						
							|  |  |  |             usage = "normal"; | 
					
						
							|  |  |  |             indexed = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_PSIZE: | 
					
						
							|  |  |  |             usage = "psize"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_COLOR: | 
					
						
							|  |  |  |             if (semantic->usage_idx) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 usage = "specular"; | 
					
						
							|  |  |  |                 indexed = true; | 
					
						
							|  |  |  |                 --usage_idx; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 break; | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             usage = "color"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_TEXCOORD: | 
					
						
							|  |  |  |             usage = "texcoord"; | 
					
						
							|  |  |  |             indexed = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_TANGENT: | 
					
						
							|  |  |  |             usage = "tangent"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_BINORMAL: | 
					
						
							|  |  |  |             usage = "binormal"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_TESS_FACTOR: | 
					
						
							|  |  |  |             usage = "tessfactor"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_POSITIONT: | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:57 -05:00
										 |  |  |             usage = "positiont"; | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |             indexed = true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_FOG: | 
					
						
							|  |  |  |             usage = "fog"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_DEPTH: | 
					
						
							|  |  |  |             usage = "depth"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_DECL_USAGE_SAMPLE: | 
					
						
							|  |  |  |             usage = "sample"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled usage %#x, index %u>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, semantic->usage, usage_idx, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (indexed) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s%s%u%s", prefix, usage, usage_idx, suffix); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, usage, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  | static void shader_print_src_param(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_src_param *param, const char *suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:09 +01:00
										 |  |  | static void shader_print_float_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, float f, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-03-01 13:21:33 +01:00
										 |  |  |     const char *sign = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     if (isfinite(f) && signbit(f)) | 
					
						
							| 
									
										
										
										
											2022-03-01 13:21:33 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         sign = "-"; | 
					
						
							|  |  |  |         f = -f; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", prefix, sign, compiler->colours.literal); | 
					
						
							|  |  |  |     vkd3d_string_buffer_print_f32(&compiler->buffer, f); | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:09 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  | static void shader_print_double_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, double d, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2022-03-01 13:21:34 +01:00
										 |  |  |     const char *sign = ""; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |     if (isfinite(d) && signbit(d)) | 
					
						
							| 
									
										
										
										
											2022-03-01 13:21:34 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         sign = "-"; | 
					
						
							|  |  |  |         d = -d; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", prefix, sign, compiler->colours.literal); | 
					
						
							|  |  |  |     vkd3d_string_buffer_print_f64(&compiler->buffer, d); | 
					
						
							| 
									
										
										
										
											2022-03-01 13:21:35 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "l%s%s", compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:10 +01:00
										 |  |  | static void shader_print_int_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, int i, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     if (i < 0) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s-%s%d%s%s", | 
					
						
							|  |  |  |                 prefix, compiler->colours.literal, -i, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%d%s%s", | 
					
						
							|  |  |  |                 prefix, compiler->colours.literal, i, compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:10 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  | static void shader_print_uint_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, unsigned int i, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%u%s%s", | 
					
						
							|  |  |  |             prefix, compiler->colours.literal, i, compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-24 13:14:44 +10:00
										 |  |  | static void shader_print_uint64_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, uint64_t i, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%"PRIu64"%s%s", | 
					
						
							|  |  |  |             prefix, compiler->colours.literal, i, compiler->colours.reset, suffix); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:00 +01:00
										 |  |  | static void shader_print_hex_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, unsigned int i, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s0x%08x%s%s", | 
					
						
							|  |  |  |             prefix, compiler->colours.literal, i, compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:00 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:01 +01:00
										 |  |  | static void shader_print_bool_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, unsigned int b, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s%s%s", prefix, | 
					
						
							|  |  |  |             compiler->colours.literal, b ? "true" : "false", compiler->colours.reset, suffix); | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:01 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  | static void shader_print_untyped_literal(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, uint32_t u, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     union | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         uint32_t u; | 
					
						
							|  |  |  |         float f; | 
					
						
							|  |  |  |     } value; | 
					
						
							|  |  |  |     unsigned int exponent = (u >> 23) & 0xff; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     value.u = u; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (exponent != 0 && exponent != 0xff) | 
					
						
							|  |  |  |         return shader_print_float_literal(compiler, prefix, value.f, suffix); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (u <= 10000) | 
					
						
							|  |  |  |         return shader_print_uint_literal(compiler, prefix, value.u, suffix); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return shader_print_hex_literal(compiler, prefix, value.u, suffix); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  | static void shader_print_subscript(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         unsigned int offset, const struct vkd3d_shader_src_param *rel_addr) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (rel_addr) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         shader_print_src_param(compiler, "[", rel_addr, " + "); | 
					
						
							|  |  |  |     shader_print_uint_literal(compiler, rel_addr ? "" : "[", offset, "]"); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-09 14:33:41 +10:00
										 |  |  | static void shader_print_subscript_range(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         unsigned int offset_first, unsigned int offset_last) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     shader_print_uint_literal(compiler, "[", offset_first, ":"); | 
					
						
							|  |  |  |     if (offset_last != ~0u) | 
					
						
							|  |  |  |         shader_print_uint_literal(compiler, "", offset_last, "]"); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "*]"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  | static void shader_print_register(struct vkd3d_d3d_asm_compiler *compiler, const char *prefix, | 
					
						
							|  |  |  |         const struct vkd3d_shader_register *reg, bool is_declaration, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     unsigned int offset = reg->idx[0].offset; | 
					
						
							| 
									
										
										
										
											2021-07-08 17:17:50 +02:00
										 |  |  |     bool is_descriptor = false; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     static const char * const rastout_reg_names[] = {"oPos", "oFog", "oPts"}; | 
					
						
							|  |  |  |     static const char * const misctype_reg_names[] = {"vPos", "vFace"}; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s", prefix, | 
					
						
							|  |  |  |             reg->type == VKD3DSPR_LABEL ? compiler->colours.label : compiler->colours.reg); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     switch (reg->type) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3DSPR_RASTOUT: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s", rastout_reg_names[offset]); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSPR_MISCTYPE: | 
					
						
							|  |  |  |             if (offset > 1) | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s<unhandled misctype %#x>%s", | 
					
						
							|  |  |  |                         compiler->colours.error, offset, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             else | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s", misctype_reg_names[offset]); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |         case VKD3DSPR_COMBINED_SAMPLER: | 
					
						
							|  |  |  |         case VKD3DSPR_SAMPLER: | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         case VKD3DSPR_CONSTBUFFER: | 
					
						
							|  |  |  |         case VKD3DSPR_RESOURCE: | 
					
						
							|  |  |  |         case VKD3DSPR_UAV: | 
					
						
							| 
									
										
										
										
											2021-07-08 17:17:50 +02:00
										 |  |  |             is_descriptor = true; | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |             /* fall through */ | 
					
						
							| 
									
										
										
										
											2024-10-15 19:04:19 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-07-30 12:28:08 -05:00
										 |  |  |             if (reg->type < ARRAY_SIZE(shader_register_names) && shader_register_names[reg->type]) | 
					
						
							|  |  |  |                 vkd3d_string_buffer_printf(buffer, "%s", shader_register_names[reg->type]); | 
					
						
							|  |  |  |             else | 
					
						
							|  |  |  |                 vkd3d_string_buffer_printf(buffer, "%s<unhandled register type %#x>%s", | 
					
						
							|  |  |  |                         compiler->colours.error, reg->type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (reg->type == VKD3DSPR_IMMCONST) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |         bool untyped = false; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |         switch (compiler->current->opcode) | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             case VKD3DSIH_MOV: | 
					
						
							|  |  |  |             case VKD3DSIH_MOVC: | 
					
						
							|  |  |  |                 untyped = true; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s(", compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-08-14 13:21:41 -04:00
										 |  |  |         switch (reg->dimension) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2023-08-14 13:21:41 -04:00
										 |  |  |             case VSIR_DIMENSION_SCALAR: | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 switch (reg->data_type) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     case VKD3D_DATA_FLOAT: | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |                         if (untyped) | 
					
						
							|  |  |  |                             shader_print_untyped_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                             shader_print_float_literal(compiler, "", reg->u.immconst_f32[0], ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case VKD3D_DATA_INT: | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |                         shader_print_int_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case VKD3D_DATA_UINT: | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |                         shader_print_uint_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     default: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                         vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s", | 
					
						
							|  |  |  |                                 compiler->colours.error, reg->data_type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-14 13:21:41 -04:00
										 |  |  |             case VSIR_DIMENSION_VEC4: | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 switch (reg->data_type) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     case VKD3D_DATA_FLOAT: | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |                         if (untyped) | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             shader_print_untyped_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							|  |  |  |                             shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[1], ""); | 
					
						
							|  |  |  |                             shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[2], ""); | 
					
						
							|  |  |  |                             shader_print_untyped_literal(compiler, ", ", reg->u.immconst_u32[3], ""); | 
					
						
							|  |  |  |                         } | 
					
						
							|  |  |  |                         else | 
					
						
							|  |  |  |                         { | 
					
						
							|  |  |  |                             shader_print_float_literal(compiler, "", reg->u.immconst_f32[0], ""); | 
					
						
							|  |  |  |                             shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[1], ""); | 
					
						
							|  |  |  |                             shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[2], ""); | 
					
						
							|  |  |  |                             shader_print_float_literal(compiler, ", ", reg->u.immconst_f32[3], ""); | 
					
						
							|  |  |  |                         } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case VKD3D_DATA_INT: | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |                         shader_print_int_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							|  |  |  |                         shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[1], ""); | 
					
						
							|  |  |  |                         shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[2], ""); | 
					
						
							|  |  |  |                         shader_print_int_literal(compiler, ", ", reg->u.immconst_u32[3], ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     case VKD3D_DATA_UINT: | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |                         shader_print_uint_literal(compiler, "", reg->u.immconst_u32[0], ""); | 
					
						
							|  |  |  |                         shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[1], ""); | 
					
						
							|  |  |  |                         shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[2], ""); | 
					
						
							|  |  |  |                         shader_print_uint_literal(compiler, ", ", reg->u.immconst_u32[3], ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                     default: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                         vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s", | 
					
						
							|  |  |  |                                 compiler->colours.error, reg->data_type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                         break; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             default: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s<unhandled immconst dimension %#x>%s", | 
					
						
							|  |  |  |                         compiler->colours.error, reg->dimension, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, ")"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |     else if (reg->type == VKD3DSPR_IMMCONST64) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s(", compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-08-14 13:21:41 -04:00
										 |  |  |         /* A double2 vector is treated as a float4 vector in enum vsir_dimension. */ | 
					
						
							|  |  |  |         if (reg->dimension == VSIR_DIMENSION_SCALAR || reg->dimension == VSIR_DIMENSION_VEC4) | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |         { | 
					
						
							|  |  |  |             if (reg->data_type == VKD3D_DATA_DOUBLE) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2023-12-05 23:33:16 +01:00
										 |  |  |                 shader_print_double_literal(compiler, "", reg->u.immconst_f64[0], ""); | 
					
						
							| 
									
										
										
										
											2023-08-14 13:21:41 -04:00
										 |  |  |                 if (reg->dimension == VSIR_DIMENSION_VEC4) | 
					
						
							| 
									
										
										
										
											2023-12-05 23:33:16 +01:00
										 |  |  |                     shader_print_double_literal(compiler, ", ", reg->u.immconst_f64[1], ""); | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-11-24 13:14:44 +10:00
										 |  |  |             else if (reg->data_type == VKD3D_DATA_UINT64) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 shader_print_uint64_literal(compiler, "", reg->u.immconst_u64[0], ""); | 
					
						
							|  |  |  |                 if (reg->dimension == VSIR_DIMENSION_VEC4) | 
					
						
							|  |  |  |                     shader_print_uint64_literal(compiler, "", reg->u.immconst_u64[1], ""); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |             else | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s<unhandled data type %#x>%s", | 
					
						
							|  |  |  |                         compiler->colours.error, reg->data_type, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s<unhandled immconst64 dimension %#x>%s", | 
					
						
							|  |  |  |                     compiler->colours.error, reg->dimension, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, ")"); | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-09-26 22:19:55 +02:00
										 |  |  |     else if (compiler->flags & VSIR_ASM_FLAG_DUMP_ALL_INDICES) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         unsigned int i = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (reg->idx_count == 0 || reg->idx[0].rel_addr) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset); | 
					
						
							|  |  |  |             i = 1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for (; i < reg->idx_count; ++i) | 
					
						
							|  |  |  |             shader_print_subscript(compiler, reg->idx[i].offset, reg->idx[i].rel_addr); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     else if (reg->type != VKD3DSPR_RASTOUT | 
					
						
							|  |  |  |             && reg->type != VKD3DSPR_MISCTYPE | 
					
						
							| 
									
										
										
										
											2023-08-29 19:08:24 -04:00
										 |  |  |             && reg->type != VKD3DSPR_NULL | 
					
						
							|  |  |  |             && reg->type != VKD3DSPR_DEPTHOUT) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         if (offset != ~0u) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2023-10-30 17:14:26 +01:00
										 |  |  |             bool is_sm_5_1 = vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1); | 
					
						
							| 
									
										
										
										
											2021-07-09 14:33:41 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |             if (reg->idx[0].rel_addr || reg->type == VKD3DSPR_IMMCONSTBUFFER | 
					
						
							| 
									
										
										
										
											2025-01-20 18:46:05 -05:00
										 |  |  |                     || reg->type == VKD3DSPR_INCONTROLPOINT || reg->type == VKD3DSPR_OUTCONTROLPOINT | 
					
						
							|  |  |  |                     || (reg->type == VKD3DSPR_INPUT && (compiler->shader_version.type == VKD3D_SHADER_TYPE_GEOMETRY | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |                     || compiler->shader_version.type == VKD3D_SHADER_TYPE_HULL))) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); | 
					
						
							|  |  |  |                 shader_print_subscript(compiler, offset, reg->idx[0].rel_addr); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |             else | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |             { | 
					
						
							|  |  |  |                 vkd3d_string_buffer_printf(buffer, "%u%s", offset, compiler->colours.reset); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-09 14:33:41 +10:00
										 |  |  |             /* For sm 5.1 descriptor declarations we need to print the register range instead of
 | 
					
						
							|  |  |  |              * a single register index. */ | 
					
						
							|  |  |  |             if (is_descriptor && is_declaration && is_sm_5_1) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 shader_print_subscript_range(compiler, reg->idx[1].offset, reg->idx[2].offset); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-05-18 15:51:53 +10:00
										 |  |  |             else if (reg->type != VKD3DSPR_SSA) | 
					
						
							| 
									
										
										
										
											2021-07-09 14:33:41 +10:00
										 |  |  |             { | 
					
						
							|  |  |  |                 /* For descriptors in sm < 5.1 we move the reg->idx values up one slot
 | 
					
						
							|  |  |  |                  * to normalise with 5.1. | 
					
						
							|  |  |  |                  * Here we should ignore it if it's a descriptor in sm < 5.1. */ | 
					
						
							|  |  |  |                 if (reg->idx[1].offset != ~0u && (!is_descriptor || is_sm_5_1)) | 
					
						
							|  |  |  |                     shader_print_subscript(compiler, reg->idx[1].offset, reg->idx[1].rel_addr); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (reg->idx[2].offset != ~0u) | 
					
						
							|  |  |  |                     shader_print_subscript(compiler, reg->idx[2].offset, reg->idx[2].rel_addr); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (reg->type == VKD3DSPR_FUNCTIONPOINTER) | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |             shader_print_subscript(compiler, reg->u.fp_body_idx, NULL); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s", suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  | static void shader_print_precision(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     const char *precision; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (reg->precision == VKD3D_SHADER_REGISTER_PRECISION_DEFAULT) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (reg->precision) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_SHADER_REGISTER_PRECISION_MIN_FLOAT_16: | 
					
						
							|  |  |  |             precision = "min16f"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_REGISTER_PRECISION_MIN_FLOAT_10: | 
					
						
							|  |  |  |             precision = "min2_8f"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_REGISTER_PRECISION_MIN_INT_16: | 
					
						
							|  |  |  |             precision = "min16i"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_REGISTER_PRECISION_MIN_UINT_16: | 
					
						
							|  |  |  |             precision = "min16u"; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, " {%s<unhandled precision %#x>%s}", | 
					
						
							|  |  |  |                     compiler->colours.error, reg->precision, compiler->colours.reset); | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, " {%s%s%s}", compiler->colours.modifier, precision, compiler->colours.reset); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:23 +02:00
										 |  |  | static void shader_print_non_uniform(struct vkd3d_d3d_asm_compiler *compiler, const struct vkd3d_shader_register *reg) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     if (reg->non_uniform) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, " {%snonuniform%s}", | 
					
						
							|  |  |  |                 compiler->colours.modifier, compiler->colours.reset); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  | static void shader_print_reg_type(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_register *reg, const char *suffix) | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     static const char *dimensions[] = | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         [VSIR_DIMENSION_NONE]   = "", | 
					
						
							|  |  |  |         [VSIR_DIMENSION_SCALAR] = "s:", | 
					
						
							|  |  |  |         [VSIR_DIMENSION_VEC4]   = "v4:", | 
					
						
							|  |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     const char *dimension; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 23:14:33 +01:00
										 |  |  |     if (!(compiler->flags & VSIR_ASM_FLAG_DUMP_TYPES)) | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s%s", prefix, suffix); | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  |         return; | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 22:39:46 +01:00
										 |  |  |     if (reg->data_type == VKD3D_DATA_UNUSED) | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  |     if (reg->dimension < ARRAY_SIZE(dimensions)) | 
					
						
							|  |  |  |         dimension = dimensions[reg->dimension]; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         dimension = "??"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s <%s", prefix, dimension); | 
					
						
							| 
									
										
										
										
											2025-04-03 17:41:04 +02:00
										 |  |  |     shader_print_data_type(compiler, reg->data_type); | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, ">%s", suffix); | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 15:44:09 +01:00
										 |  |  | static void shader_print_write_mask(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, uint32_t mask, const char *suffix) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     unsigned int i = 0; | 
					
						
							|  |  |  |     char buffer[5]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |     if (mask == 0) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s%s", prefix, suffix); | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 15:44:09 +01:00
										 |  |  |     if (mask & VKD3DSP_WRITEMASK_0) | 
					
						
							|  |  |  |         buffer[i++] = 'x'; | 
					
						
							|  |  |  |     if (mask & VKD3DSP_WRITEMASK_1) | 
					
						
							|  |  |  |         buffer[i++] = 'y'; | 
					
						
							|  |  |  |     if (mask & VKD3DSP_WRITEMASK_2) | 
					
						
							|  |  |  |         buffer[i++] = 'z'; | 
					
						
							|  |  |  |     if (mask & VKD3DSP_WRITEMASK_3) | 
					
						
							|  |  |  |         buffer[i++] = 'w'; | 
					
						
							|  |  |  |     buffer[i++] = '\0'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s.%s%s%s%s", prefix, | 
					
						
							|  |  |  |             compiler->colours.write_mask, buffer, compiler->colours.reset, suffix); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  | static void shader_print_dst_param(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_dst_param *param, bool is_declaration, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     uint32_t write_mask = param->write_mask; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     shader_print_register(compiler, prefix, ¶m->reg, is_declaration, ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-29 18:33:50 -04:00
										 |  |  |     if (write_mask && param->reg.dimension == VSIR_DIMENSION_VEC4) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-01-22 17:15:36 +01:00
										 |  |  |         if (data_type_is_64_bit(param->reg.data_type)) | 
					
						
							| 
									
										
										
										
											2023-12-05 22:42:32 +01:00
										 |  |  |             write_mask = vsir_write_mask_32_from_64(write_mask); | 
					
						
							| 
									
										
										
										
											2021-07-28 00:26:10 +10:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-19 15:44:09 +01:00
										 |  |  |         shader_print_write_mask(compiler, "", write_mask, ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     shader_print_precision(compiler, ¶m->reg); | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:23 +02:00
										 |  |  |     shader_print_non_uniform(compiler, ¶m->reg); | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     shader_print_reg_type(compiler, "", ¶m->reg, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  | static void shader_print_src_param(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_src_param *param, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							|  |  |  |     enum vkd3d_shader_src_modifier src_modifier = param->modifiers; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     uint32_t swizzle = param->swizzle; | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |     const char *modifier = ""; | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     bool is_abs = false; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (src_modifier == VKD3DSPSM_NEG | 
					
						
							|  |  |  |             || src_modifier == VKD3DSPSM_BIASNEG | 
					
						
							|  |  |  |             || src_modifier == VKD3DSPSM_SIGNNEG | 
					
						
							|  |  |  |             || src_modifier == VKD3DSPSM_X2NEG | 
					
						
							|  |  |  |             || src_modifier == VKD3DSPSM_ABSNEG) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         modifier = "-"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     else if (src_modifier == VKD3DSPSM_COMP) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         modifier = "1-"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     else if (src_modifier == VKD3DSPSM_NOT) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         modifier = "!"; | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s", prefix, modifier); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if (src_modifier == VKD3DSPSM_ABS || src_modifier == VKD3DSPSM_ABSNEG) | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |         is_abs = true; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     shader_print_register(compiler, is_abs ? "|" : "", ¶m->reg, false, ""); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     switch (src_modifier) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         case VKD3DSPSM_NONE: | 
					
						
							|  |  |  |         case VKD3DSPSM_NEG: | 
					
						
							|  |  |  |         case VKD3DSPSM_COMP: | 
					
						
							|  |  |  |         case VKD3DSPSM_ABS: | 
					
						
							| 
									
										
										
										
											2020-09-17 00:14:44 +01:00
										 |  |  |         case VKD3DSPSM_ABSNEG: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         case VKD3DSPSM_NOT: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSPSM_BIAS: | 
					
						
							|  |  |  |         case VKD3DSPSM_BIASNEG: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_bias"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSPSM_SIGN: | 
					
						
							|  |  |  |         case VKD3DSPSM_SIGNNEG: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_bx2"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSPSM_X2: | 
					
						
							|  |  |  |         case VKD3DSPSM_X2NEG: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_x2"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSPSM_DZ: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_dz"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSPSM_DW: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_dw"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_%s<unhandled modifier %#x>%s", | 
					
						
							|  |  |  |                     compiler->colours.error, src_modifier, compiler->colours.reset); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-07-30 23:27:20 +10:00
										 |  |  |     if (param->reg.type != VKD3DSPR_IMMCONST && param->reg.type != VKD3DSPR_IMMCONST64 | 
					
						
							| 
									
										
										
											
												vkd3d-shader/d3d-asm: Use vkd3d_shader_register.dimension to know when to dump swizzle.
The assumption that sampler registers never have a swizzle is not
totally correct.
For instance, for the following shader:
    Texture2D tex;
    sampler sam;
    float4 main() : sv_target
    {
        return tex.GatherGreen(sam, float2(0, 0));
    }
the gather instruction is being disassembled as
  gather4_indexable(texture2d) o0.xyzw, l(0.0, 0.0, 0.0, 0.0), t0.xyzw, s0
instead of
  gather4_indexable(texture2d)(float,float,float,float) o0.xyzw, l(0.0, 0.0, 0.0, 0.0), t0.xyzw, s0.y
(notice the missing swizzle in the last parameter s0).
This is because the Gather instructions give the sampler register a vec4
dimension (and scalar swizzle type) to indicate the channel for the
gather operation.
The solution is using the new vkd3d_shader_register.dimension instead of
checking the swizzle type.
											
										 
											2023-08-16 01:33:43 -04:00
										 |  |  |             && param->reg.dimension == VSIR_DIMENSION_VEC4) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         static const char swizzle_chars[] = "xyzw"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-22 17:15:36 +01:00
										 |  |  |         unsigned int swizzle_x, swizzle_y, swizzle_z, swizzle_w; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (data_type_is_64_bit(param->reg.data_type)) | 
					
						
							|  |  |  |             swizzle = vsir_swizzle_32_from_64(swizzle); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         swizzle_x = vsir_swizzle_get_component(swizzle, 0); | 
					
						
							|  |  |  |         swizzle_y = vsir_swizzle_get_component(swizzle, 1); | 
					
						
							|  |  |  |         swizzle_z = vsir_swizzle_get_component(swizzle, 2); | 
					
						
							|  |  |  |         swizzle_w = vsir_swizzle_get_component(swizzle, 3); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         if (swizzle_x == swizzle_y && swizzle_x == swizzle_z && swizzle_x == swizzle_w) | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, ".%s%c%s", compiler->colours.swizzle, | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:04 +01:00
										 |  |  |                     swizzle_chars[swizzle_x], compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         else | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, ".%s%c%c%c%c%s", compiler->colours.swizzle, | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:04 +01:00
										 |  |  |                     swizzle_chars[swizzle_x], swizzle_chars[swizzle_y], | 
					
						
							|  |  |  |                     swizzle_chars[swizzle_z], swizzle_chars[swizzle_w], compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |     if (is_abs) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "|"); | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     shader_print_precision(compiler, ¶m->reg); | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:23 +02:00
										 |  |  |     shader_print_non_uniform(compiler, ¶m->reg); | 
					
						
							| 
									
										
										
										
											2024-03-14 20:26:58 +01:00
										 |  |  |     shader_print_reg_type(compiler, "", ¶m->reg, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | static void shader_dump_ins_modifiers(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         const struct vkd3d_shader_dst_param *dst) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     uint32_t mmask = dst->modifiers; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     switch (dst->shift) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |         case 0: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 13: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_d8"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 14: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_d4"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 15: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_d2"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 1: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_x2"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 2: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_x4"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case 3: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_x8"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "_unhandled_shift(%d)", dst->shift); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |     if (mmask & VKD3DSPDM_SATURATE) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "_sat"); | 
					
						
							|  |  |  |     if (mmask & VKD3DSPDM_PARTIALPRECISION) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "_pp"); | 
					
						
							|  |  |  |     if (mmask & VKD3DSPDM_MSAMPCENTROID) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "_centroid"); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-29 22:17:28 +02:00
										 |  |  |     mmask &= ~VKD3DSPDM_MASK; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     if (mmask) FIXME("Unrecognised modifier %#x.\n", mmask); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  | static void shader_print_primitive_type(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, const struct vkd3d_shader_primitive_type *p, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |     const char *primitive_type; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |     switch (p->type) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_PT_UNDEFINED: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "undefined"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_POINTLIST: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "pointlist"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_LINELIST: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "linelist"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_LINESTRIP: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "linestrip"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_TRIANGLELIST: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "trianglelist"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_TRIANGLESTRIP: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "trianglestrip"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_TRIANGLEFAN: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "trianglefan"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_LINELIST_ADJ: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "linelist_adj"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_LINESTRIP_ADJ: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "linestrip_adj"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_TRIANGLELIST_ADJ: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "trianglelist_adj"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_TRIANGLESTRIP_ADJ: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             primitive_type = "trianglestrip_adj"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_PT_PATCH: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%spatch%u%s", prefix, p->patch_vertex_count, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled primitive type %#x>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, p->type, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, primitive_type, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  | static void shader_print_interpolation_mode(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const char *prefix, enum vkd3d_shader_interpolation_mode m, const char *suffix) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |     const char *mode; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |     switch (m) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3DSIM_CONSTANT: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "constant"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR_CENTROID: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear centroid"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR_NOPERSPECTIVE: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear noperspective"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR_SAMPLE: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear sample"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR_NOPERSPECTIVE_CENTROID: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear noperspective centroid"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         case VKD3DSIM_LINEAR_NOPERSPECTIVE_SAMPLE: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             mode = "linear noperspective sample"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s%s<unhandled interpolation mode %#x>%s%s", | 
					
						
							|  |  |  |                     prefix, compiler->colours.error, m, compiler->colours.reset, suffix); | 
					
						
							|  |  |  |             return; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s", prefix, mode, suffix); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  | const char *shader_get_type_prefix(enum vkd3d_shader_type type) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |     switch (type) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_VERTEX: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "vs"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_HULL: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "hs"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_DOMAIN: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "ds"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_GEOMETRY: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "gs"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_PIXEL: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "ps"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_COMPUTE: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             return "cs"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-27 10:29:44 -06:00
										 |  |  |         case VKD3D_SHADER_TYPE_EFFECT: | 
					
						
							|  |  |  |             return "fx"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_TEXTURE: | 
					
						
							|  |  |  |             return "tx"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3D_SHADER_TYPE_LIBRARY: | 
					
						
							|  |  |  |             return "lib"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2019-01-31 11:29:27 +01:00
										 |  |  |             FIXME("Unhandled shader type %#x.\n", type); | 
					
						
							|  |  |  |             return "unknown"; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:56 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  | static void shader_dump_instruction_flags(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         const struct vkd3d_shader_instruction *ins) | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |     switch (ins->opcode) | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3DSIH_BREAKP: | 
					
						
							|  |  |  |         case VKD3DSIH_CONTINUEP: | 
					
						
							| 
									
										
										
										
											2023-04-20 22:20:33 -04:00
										 |  |  |         case VKD3DSIH_DISCARD: | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |         case VKD3DSIH_IF: | 
					
						
							|  |  |  |         case VKD3DSIH_RETP: | 
					
						
							|  |  |  |             switch (ins->flags) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 case VKD3D_SHADER_CONDITIONAL_OP_NZ: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_nz"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_CONDITIONAL_OP_Z: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_z"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 default: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags); | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_IFC: | 
					
						
							|  |  |  |         case VKD3DSIH_BREAKC: | 
					
						
							|  |  |  |             switch (ins->flags) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 case VKD3D_SHADER_REL_OP_GT: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_gt"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_REL_OP_EQ: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_eq"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_REL_OP_GE: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_ge"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_REL_OP_LT: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_lt"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_REL_OP_NE: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_ne"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3D_SHADER_REL_OP_LE: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_le"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 default: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_(%u)", ins->flags); | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_RESINFO: | 
					
						
							|  |  |  |             switch (ins->flags) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 case VKD3DSI_NONE: | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3DSI_RESINFO_RCP_FLOAT: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_rcpFloat"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3DSI_RESINFO_UINT: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_uint"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 default: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags); | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_SAMPLE_INFO: | 
					
						
							|  |  |  |             switch (ins->flags) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 case VKD3DSI_NONE: | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 case VKD3DSI_SAMPLE_INFO_UINT: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_uint"); | 
					
						
							|  |  |  |                     break; | 
					
						
							|  |  |  |                 default: | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "_unrecognized(%#x)", ins->flags); | 
					
						
							|  |  |  |                     break; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 16:03:47 +10:00
										 |  |  |         case VKD3DSIH_IMM_ATOMIC_CMP_EXCH: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_IADD: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_AND: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_IMAX: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_IMIN: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_OR: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_UMAX: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_UMIN: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_EXCH: | 
					
						
							|  |  |  |         case VKD3DSIH_IMM_ATOMIC_XOR: | 
					
						
							|  |  |  |             shader_dump_atomic_op_flags(compiler, ins->flags); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |         case VKD3DSIH_SYNC: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_sync_flags(compiler, ins->flags); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-27 21:15:13 -05:00
										 |  |  |         case VKD3DSIH_TEXLD: | 
					
						
							| 
									
										
										
										
											2024-05-21 21:38:44 +02:00
										 |  |  |             if (vkd3d_shader_ver_ge(&compiler->shader_version, 2, 0)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 if (ins->flags & VKD3DSI_TEXLD_PROJECT) | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "p"); | 
					
						
							|  |  |  |                 else if (ins->flags & VKD3DSI_TEXLD_BIAS) | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "b"); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-23 21:28:21 +10:00
										 |  |  |         case VKD3DSIH_WAVE_OP_ADD: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_IMAX: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_IMIN: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_MAX: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_MIN: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_MUL: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_UMAX: | 
					
						
							|  |  |  |         case VKD3DSIH_WAVE_OP_UMIN: | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(&compiler->buffer, (ins->flags & VKD3DSI_WAVE_PREFIX) ? "_prefix" : "_active"); | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-22 23:58:44 +10:00
										 |  |  |         case VKD3DSIH_ISHL: | 
					
						
							|  |  |  |         case VKD3DSIH_ISHR: | 
					
						
							|  |  |  |         case VKD3DSIH_USHR: | 
					
						
							|  |  |  |             if (ins->flags & VKD3DSI_SHIFT_UNMASKED) | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "_unmasked"); | 
					
						
							| 
									
										
										
										
											2023-11-22 23:58:44 +10:00
										 |  |  |             /* fall through */ | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_precise_flags(compiler, ins->flags); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:57 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  | static void shader_dump_register_space(struct vkd3d_d3d_asm_compiler *compiler, unsigned int register_space) | 
					
						
							| 
									
										
										
										
											2019-04-29 11:38:15 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2023-10-30 17:14:26 +01:00
										 |  |  |     if (vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1)) | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |         shader_print_uint_literal(compiler, ", space=", register_space, ""); | 
					
						
							| 
									
										
										
										
											2019-04-29 11:38:15 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  | static void shader_print_opcode(struct vkd3d_d3d_asm_compiler *compiler, enum vkd3d_shader_opcode opcode) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%s", compiler->colours.opcode, | 
					
						
							| 
									
										
										
										
											2025-06-03 13:46:04 +02:00
										 |  |  |             vsir_opcode_get_name(opcode, "<unknown>"), compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-14 00:50:30 +10:00
										 |  |  | static void shader_dump_icb(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const struct vkd3d_shader_immediate_constant_buffer *icb) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     unsigned int i, j; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, " {\n"); | 
					
						
							|  |  |  |     if (icb->component_count == 1) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (i = 0; i < icb->element_count; ) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             for (j = 0; i < icb->element_count && j < 4; ++i, ++j) | 
					
						
							|  |  |  |                 shader_print_hex_literal(compiler, !j ? "    " : ", ", icb->data[i], ""); | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "\n"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-07-29 22:43:59 +02:00
										 |  |  |         VKD3D_ASSERT(icb->component_count == VKD3D_VEC4_SIZE); | 
					
						
							| 
									
										
										
										
											2023-11-14 00:50:30 +10:00
										 |  |  |         for (i = 0; i < icb->element_count; ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, "    {", icb->data[4 * i + 0], ""); | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 1], ""); | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 2], ""); | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", ", icb->data[4 * i + 3], "},\n"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "}"); | 
					
						
							| 
									
										
										
										
											2023-11-14 00:50:30 +10:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  | static void shader_dump_instruction(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |         const struct vkd3d_shader_instruction *ins) | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-11-09 23:31:27 +01:00
										 |  |  |     compiler->current = ins; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  |     if (ins->predicate) | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |         shader_print_src_param(compiler, "(", ins->predicate, ") "); | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* PixWin marks instructions with the coissue flag with a '+' */ | 
					
						
							|  |  |  |     if (ins->coissue) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "+"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |     shader_print_opcode(compiler, ins->opcode); | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |     switch (ins->opcode) | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |     { | 
					
						
							|  |  |  |         case VKD3DSIH_DCL: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_UAV_TYPED: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.opcode); | 
					
						
							| 
									
										
										
										
											2024-04-03 19:42:03 +02:00
										 |  |  |             shader_print_dcl_usage(compiler, "_", &ins->declaration.semantic, ins->flags, ""); | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_ins_modifiers(compiler, &ins->declaration.semantic.resource.reg); | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, "%s", compiler->colours.reset); | 
					
						
							|  |  |  |             shader_print_register(compiler, " ", &ins->declaration.semantic.resource.reg.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:46 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.semantic.resource.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_CONSTANT_BUFFER: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             shader_print_register(compiler, " ", &ins->declaration.cb.src.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2023-10-30 17:14:26 +01:00
										 |  |  |             if (vkd3d_shader_ver_ge(&compiler->shader_version, 6, 0)) | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |                 shader_print_subscript(compiler, ins->declaration.cb.size, NULL); | 
					
						
							| 
									
										
										
										
											2023-10-30 17:14:26 +01:00
										 |  |  |             else if (vkd3d_shader_ver_ge(&compiler->shader_version, 5, 1)) | 
					
						
							| 
									
										
										
										
											2023-10-19 13:15:46 +10:00
										 |  |  |                 shader_print_subscript(compiler, ins->declaration.cb.size / VKD3D_VEC4_SIZE / sizeof(float), NULL); | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, ", %s", | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |                     ins->flags & VKD3DSI_INDEXED_DYNAMIC ? "dynamicIndexed" : "immediateIndexed"); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:48 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.cb.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_FUNCTION_BODY: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " fb%u", ins->declaration.index); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_FUNCTION_TABLE: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " ft%u = {...}", ins->declaration.index); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_GLOBAL_FLAGS: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:26 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " "); | 
					
						
							| 
									
										
										
										
											2023-10-03 14:50:09 +10:00
										 |  |  |             shader_dump_global_flags(compiler, ins->declaration.global_flags); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_HS_MAX_TESSFACTOR: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:09 +01:00
										 |  |  |             shader_print_float_literal(compiler, " ", ins->declaration.max_tessellation_factor, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_IMMEDIATE_CONSTANT_BUFFER: | 
					
						
							| 
									
										
										
										
											2023-11-14 00:50:30 +10:00
										 |  |  |             shader_dump_icb(compiler, ins->declaration.icb); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INDEX_RANGE: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.index_range.dst, true, ""); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, " ", ins->declaration.index_range.register_count, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INDEXABLE_TEMP: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " %sx%u%s", compiler->colours.reg, | 
					
						
							|  |  |  |                     ins->declaration.indexable_temp.register_idx, compiler->colours.reset); | 
					
						
							|  |  |  |             shader_print_subscript(compiler, ins->declaration.indexable_temp.register_size, NULL); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.indexable_temp.component_count, ""); | 
					
						
							| 
									
										
										
										
											2023-11-13 16:09:58 +10:00
										 |  |  |             if (ins->declaration.indexable_temp.alignment) | 
					
						
							|  |  |  |                 shader_print_uint_literal(compiler, ", align ", ins->declaration.indexable_temp.alignment, ""); | 
					
						
							| 
									
										
										
										
											2023-11-14 00:50:30 +10:00
										 |  |  |             if (ins->declaration.indexable_temp.initialiser) | 
					
						
							|  |  |  |                 shader_dump_icb(compiler, ins->declaration.indexable_temp.initialiser); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_PS: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             shader_print_interpolation_mode(compiler, " ", ins->flags, ""); | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.dst, true, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_PS_SGV: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_SGV: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_SIV: | 
					
						
							| 
									
										
										
										
											2025-03-13 16:38:20 -04:00
										 |  |  |         case VKD3DSIH_DCL_OUTPUT_SGV: | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |         case VKD3DSIH_DCL_OUTPUT_SIV: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.register_semantic.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  |             shader_print_input_sysval_semantic(compiler, ", ", ins->declaration.register_semantic.sysval_semantic, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_PS_SIV: | 
					
						
							| 
									
										
										
										
											2024-04-11 17:25:11 +02:00
										 |  |  |             shader_print_interpolation_mode(compiler, " ", ins->flags, ""); | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.register_semantic.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2024-03-14 21:31:08 +01:00
										 |  |  |             shader_print_input_sysval_semantic(compiler, ", ", ins->declaration.register_semantic.sysval_semantic, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_OUTPUT: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.dst, true, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_PRIMITIVE: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_OUTPUT_TOPOLOGY: | 
					
						
							| 
									
										
										
										
											2024-04-04 17:19:25 +02:00
										 |  |  |             shader_print_primitive_type(compiler, " ", &ins->declaration.primitive_type, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INTERFACE: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:08 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " fp%u", ins->declaration.fp.index); | 
					
						
							|  |  |  |             shader_print_subscript(compiler, ins->declaration.fp.array_size, NULL); | 
					
						
							|  |  |  |             shader_print_subscript(compiler, ins->declaration.fp.body_count, NULL); | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, " = {...}"); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_RESOURCE_RAW: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.raw_resource.resource.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:46 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_RESOURCE_STRUCTURED: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.structured_resource.resource.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:46 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_SAMPLER: | 
					
						
							| 
									
										
										
										
											2024-03-14 20:04:31 +01:00
										 |  |  |             shader_print_register(compiler, " ", &ins->declaration.sampler.src.reg, true, | 
					
						
							|  |  |  |                     ins->flags == VKD3DSI_SAMPLER_COMPARISON_MODE ? ", comparisonMode" : ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:47 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.sampler.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TEMPS: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_GS_INSTANCES: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_HS_FORK_PHASE_INSTANCE_COUNT: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_HS_JOIN_PHASE_INSTANCE_COUNT: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_INPUT_CONTROL_POINT_COUNT: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_OUTPUT_CONTROL_POINT_COUNT: | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_VERTICES_OUT: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, " ", ins->declaration.count, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TESSELLATOR_DOMAIN: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:33:29 +01:00
										 |  |  |             shader_print_tessellator_domain(compiler, " ", ins->declaration.tessellator_domain, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TESSELLATOR_OUTPUT_PRIMITIVE: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:42:09 +01:00
										 |  |  |             shader_print_tessellator_output_primitive(compiler, " ", ins->declaration.tessellator_output_primitive, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TESSELLATOR_PARTITIONING: | 
					
						
							| 
									
										
										
										
											2024-03-11 17:51:27 +01:00
										 |  |  |             shader_print_tessellator_partitioning(compiler, " ", ins->declaration.tessellator_partitioning, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TGSM_RAW: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.tgsm_raw.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_raw.byte_count, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_TGSM_STRUCTURED: | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.tgsm_structured.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_structured.byte_stride, ""); | 
					
						
							|  |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.tgsm_structured.structure_count, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_THREAD_GROUP: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, " ", ins->declaration.thread_group_size.x, ""); | 
					
						
							|  |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.thread_group_size.y, ""); | 
					
						
							|  |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.thread_group_size.z, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_UAV_RAW: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_uav_flags(compiler, ins->flags); | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.raw_resource.resource.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:46 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.raw_resource.resource.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DCL_UAV_STRUCTURED: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_uav_flags(compiler, ins->flags); | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |             shader_print_dst_param(compiler, " ", &ins->declaration.structured_resource.resource.reg, true, ""); | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:11 +01:00
										 |  |  |             shader_print_uint_literal(compiler, ", ", ins->declaration.structured_resource.byte_stride, ""); | 
					
						
							| 
									
										
										
										
											2021-06-24 14:03:46 +10:00
										 |  |  |             shader_dump_register_space(compiler, ins->declaration.structured_resource.resource.range.space); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DEF: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:09 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " %sc%u%s", compiler->colours.reg, | 
					
						
							| 
									
										
										
										
											2024-07-20 12:26:56 -05:00
										 |  |  |                     ins->dst[0].reg.idx[0].offset, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-12-05 23:29:04 +01:00
										 |  |  |             shader_print_float_literal(compiler, " = ", ins->src[0].reg.u.immconst_f32[0], ""); | 
					
						
							|  |  |  |             shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[1], ""); | 
					
						
							|  |  |  |             shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[2], ""); | 
					
						
							|  |  |  |             shader_print_float_literal(compiler, ", ", ins->src[0].reg.u.immconst_f32[3], ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DEFI: | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:10 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " %si%u%s", compiler->colours.reg, | 
					
						
							|  |  |  |                     ins->dst[0].reg.idx[0].offset, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |             shader_print_int_literal(compiler, " = ", ins->src[0].reg.u.immconst_u32[0], ""); | 
					
						
							|  |  |  |             shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[1], ""); | 
					
						
							|  |  |  |             shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[2], ""); | 
					
						
							|  |  |  |             shader_print_int_literal(compiler, ", ", ins->src[0].reg.u.immconst_u32[3], ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         case VKD3DSIH_DEFB: | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:01 +01:00
										 |  |  |             vkd3d_string_buffer_printf(buffer, " %sb%u%s", compiler->colours.reg, | 
					
						
							|  |  |  |                     ins->dst[0].reg.idx[0].offset, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2023-12-05 23:24:36 +01:00
										 |  |  |             shader_print_bool_literal(compiler, " = ", ins->src[0].reg.u.immconst_u32[0], ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         default: | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             shader_dump_instruction_flags(compiler, ins); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  |             if (ins->resource_type != VKD3D_SHADER_RESOURCE_NONE) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, "_indexable("); | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:12 +01:00
										 |  |  |                 if (ins->raw) | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "raw_"); | 
					
						
							|  |  |  |                 if (ins->structured) | 
					
						
							|  |  |  |                     vkd3d_string_buffer_printf(buffer, "structured_"); | 
					
						
							| 
									
										
										
										
											2025-04-03 17:39:36 +02:00
										 |  |  |                 shader_print_resource_type(compiler, ins->resource_type); | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:11 +01:00
										 |  |  |                 if (ins->resource_stride) | 
					
						
							|  |  |  |                     shader_print_uint_literal(compiler, ", stride=", ins->resource_stride, ""); | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |                 vkd3d_string_buffer_printf(buffer, ")"); | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:04 -05:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:11 +01:00
										 |  |  |             if (vkd3d_shader_instruction_has_texel_offset(ins)) | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 shader_print_int_literal(compiler, "(", ins->texel_offset.u, ""); | 
					
						
							|  |  |  |                 shader_print_int_literal(compiler, ",", ins->texel_offset.v, ""); | 
					
						
							|  |  |  |                 shader_print_int_literal(compiler, ",", ins->texel_offset.w, ")"); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |             if (ins->resource_data_type[0] != VKD3D_DATA_FLOAT | 
					
						
							|  |  |  |                     || ins->resource_data_type[1] != VKD3D_DATA_FLOAT | 
					
						
							|  |  |  |                     || ins->resource_data_type[2] != VKD3D_DATA_FLOAT | 
					
						
							|  |  |  |                     || ins->resource_data_type[3] != VKD3D_DATA_FLOAT) | 
					
						
							| 
									
										
										
										
											2023-11-30 11:53:11 +01:00
										 |  |  |                 shader_dump_resource_data_type(compiler, ins->resource_data_type); | 
					
						
							| 
									
										
										
										
											2020-09-04 17:57:05 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             for (i = 0; i < ins->dst_count; ++i) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |                 shader_dump_ins_modifiers(compiler, &ins->dst[i]); | 
					
						
							| 
									
										
										
										
											2024-03-14 19:23:41 +01:00
										 |  |  |                 shader_print_dst_param(compiler, !i ? " " : ", ", &ins->dst[i], false, ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             /* Other source tokens */ | 
					
						
							|  |  |  |             for (i = ins->dst_count; i < (ins->dst_count + ins->src_count); ++i) | 
					
						
							|  |  |  |             { | 
					
						
							| 
									
										
										
										
											2024-03-14 19:08:16 +01:00
										 |  |  |                 shader_print_src_param(compiler, !i ? " " : ", ", &ins->src[i - ins->dst_count], ""); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-07 21:49:45 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "\n"); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:58 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  | static const char *get_sysval_semantic_name(enum vkd3d_shader_sysval_semantic semantic) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (semantic) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_NONE:                      return "NONE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_POSITION:                  return "POS"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_CLIP_DISTANCE:             return "CLIPDST"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_CULL_DISTANCE:             return "CULLDST"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_RENDER_TARGET_ARRAY_INDEX: return "RTINDEX"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_VIEWPORT_ARRAY_INDEX:      return "VPINDEX"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_VERTEX_ID:                 return "VERTID"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_PRIMITIVE_ID:              return "PRIMID"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_INSTANCE_ID:               return "INSTID"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_IS_FRONT_FACE:             return "FFACE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_SAMPLE_INDEX:              return "SAMPLE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_QUADEDGE:      return "QUADEDGE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_QUADINT:       return "QUADINT"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_TRIEDGE:       return "TRIEDGE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_TRIINT:        return "TRIINT"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_LINEDET:       return "LINEDET"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TESS_FACTOR_LINEDEN:       return "LINEDEN"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_TARGET:                    return "TARGET"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_DEPTH:                     return "DEPTH"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_COVERAGE:                  return "COVERAGE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL:       return "DEPTHGE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL:          return "DEPTHLE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_STENCIL_REF:               return "STENCILREF"; | 
					
						
							|  |  |  |         default:                                        return "??"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const char *get_component_type_name(enum vkd3d_shader_component_type type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (type) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-02-05 17:54:39 +01:00
										 |  |  |         case VKD3D_SHADER_COMPONENT_VOID:       return "void"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_UINT:       return "uint"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_INT:        return "int"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_FLOAT:      return "float"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_BOOL:       return "bool"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_DOUBLE:     return "double"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_UINT64:     return "uint64"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_INT64:      return "int64"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_FLOAT16:    return "float16"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_UINT16:     return "uint16"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_INT16:      return "int16"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_COMPONENT_TYPE_FORCE_32BIT: | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-02-05 17:54:39 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return "??"; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const char *get_minimum_precision_name(enum vkd3d_shader_minimum_precision prec) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (prec) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_SHADER_MINIMUM_PRECISION_NONE:      return "NONE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_MINIMUM_PRECISION_FLOAT_16:  return "FLOAT_16"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_MINIMUM_PRECISION_FIXED_8_2: return "FIXED_8_2"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_MINIMUM_PRECISION_INT_16:    return "INT_16"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_MINIMUM_PRECISION_UINT_16:   return "UINT_16"; | 
					
						
							|  |  |  |         default:                                       return "??"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static const char *get_semantic_register_name(enum vkd3d_shader_sysval_semantic semantic) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (semantic) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-03-14 19:16:19 -04:00
										 |  |  |         case VKD3D_SHADER_SV_PRIMITIVE_ID:        return "primID"; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         case VKD3D_SHADER_SV_DEPTH:               return "oDepth"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_DEPTH_GREATER_EQUAL: return "oDepthGE"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_DEPTH_LESS_EQUAL:    return "oDepthLE"; | 
					
						
							|  |  |  |             /* SV_Coverage has name vCoverage when used as an input,
 | 
					
						
							| 
									
										
										
										
											2024-08-17 00:21:21 +02:00
										 |  |  |              * but it doesn't appear in the signature in that case. */ | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         case VKD3D_SHADER_SV_COVERAGE:            return "oMask"; | 
					
						
							|  |  |  |         case VKD3D_SHADER_SV_STENCIL_REF:         return "oStencilRef"; | 
					
						
							|  |  |  |         default:                                  return "??"; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:44:55 +02:00
										 |  |  | static enum vkd3d_result dump_dxbc_signature(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         const char *name, const char *register_name, const struct shader_signature *signature) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (signature->element_count == 0) | 
					
						
							|  |  |  |         return VKD3D_OK; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s%s\n", | 
					
						
							|  |  |  |             compiler->colours.opcode, name, compiler->colours.reset); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < signature->element_count; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         struct signature_element *element = &signature->elements[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s.param%s %s", compiler->colours.opcode, | 
					
						
							|  |  |  |                 compiler->colours.reset, element->semantic_name); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (element->semantic_index != 0) | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "%u", element->semantic_index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (element->register_index != -1) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             shader_print_write_mask(compiler, "", element->mask, ""); | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, ", %s%s%d%s", compiler->colours.reg, | 
					
						
							|  |  |  |                     register_name, element->register_index, compiler->colours.reset); | 
					
						
							|  |  |  |             shader_print_write_mask(compiler, "", element->used_mask, ""); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, ", %s%s%s", compiler->colours.reg, | 
					
						
							|  |  |  |                     get_semantic_register_name(element->sysval_semantic), compiler->colours.reset); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!element->component_type && !element->sysval_semantic | 
					
						
							|  |  |  |                 && !element->min_precision && !element->stream_index) | 
					
						
							|  |  |  |             goto done; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, ", %s", | 
					
						
							|  |  |  |                 get_component_type_name(element->component_type)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!element->sysval_semantic && !element->min_precision && !element->stream_index) | 
					
						
							|  |  |  |             goto done; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, ", %s", | 
					
						
							|  |  |  |                 get_sysval_semantic_name(element->sysval_semantic)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!element->min_precision && !element->stream_index) | 
					
						
							|  |  |  |             goto done; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, ", %s", | 
					
						
							|  |  |  |                 get_minimum_precision_name(element->min_precision)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!element->stream_index) | 
					
						
							|  |  |  |             goto done; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, ", m%u", | 
					
						
							|  |  |  |                 element->stream_index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     done: | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "\n"); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     return VKD3D_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:46:11 +02:00
										 |  |  | static enum vkd3d_result dump_dxbc_signatures(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							| 
									
										
										
										
											2024-03-01 13:36:11 +01:00
										 |  |  |         const struct vsir_program *program) | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  | { | 
					
						
							|  |  |  |     enum vkd3d_result ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:44:55 +02:00
										 |  |  |     if ((ret = dump_dxbc_signature(compiler, ".input", | 
					
						
							| 
									
										
										
										
											2024-03-01 13:36:11 +01:00
										 |  |  |             program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN ? "vicp" : "v", | 
					
						
							|  |  |  |             &program->input_signature)) < 0) | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:44:55 +02:00
										 |  |  |     if ((ret = dump_dxbc_signature(compiler, ".output", "o", | 
					
						
							| 
									
										
										
										
											2024-03-01 13:36:11 +01:00
										 |  |  |             &program->output_signature)) < 0) | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:44:55 +02:00
										 |  |  |     if ((ret = dump_dxbc_signature(compiler, ".patch_constant", | 
					
						
							| 
									
										
										
										
											2024-03-01 13:36:11 +01:00
										 |  |  |             program->shader_version.type == VKD3D_SHADER_TYPE_DOMAIN ? "vpc" : "o", | 
					
						
							|  |  |  |             &program->patch_constant_signature)) < 0) | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |         return ret; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-28 10:27:32 +01:00
										 |  |  |     return VKD3D_OK; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void shader_print_descriptor_name(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         enum vkd3d_shader_descriptor_type t, unsigned int id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     const char *type = NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     switch (t) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         case VKD3D_SHADER_DESCRIPTOR_TYPE_SRV: | 
					
						
							|  |  |  |             type = shader_register_names[VKD3DSPR_RESOURCE]; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_SHADER_DESCRIPTOR_TYPE_UAV: | 
					
						
							|  |  |  |             type = shader_register_names[VKD3DSPR_UAV]; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_SHADER_DESCRIPTOR_TYPE_CBV: | 
					
						
							|  |  |  |             type = shader_register_names[VKD3DSPR_CONSTBUFFER]; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER: | 
					
						
							|  |  |  |             type = shader_register_names[VKD3DSPR_SAMPLER]; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         case VKD3D_SHADER_DESCRIPTOR_TYPE_FORCE_32BIT: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (type) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s%s%u%s", | 
					
						
							|  |  |  |                 compiler->colours.reg, type, id, compiler->colours.reset); | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&compiler->buffer, "%s<unhandled descriptor type %#x>%u%s", | 
					
						
							|  |  |  |                 compiler->colours.error, t, id, compiler->colours.reset); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void shader_print_descriptors(struct vkd3d_d3d_asm_compiler *compiler, | 
					
						
							|  |  |  |         const struct vkd3d_shader_scan_descriptor_info1 *descriptors) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer *buffer = &compiler->buffer; | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "%s.descriptors%s\n", | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |             compiler->colours.opcode, compiler->colours.reset); | 
					
						
							| 
									
										
										
										
											2025-03-28 10:27:32 +01:00
										 |  |  |     for (i = 0; i < descriptors->descriptor_count; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         const struct vkd3d_shader_descriptor_info1 *d = &descriptors->descriptors[i]; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-28 10:27:32 +01:00
										 |  |  |         vkd3d_string_buffer_printf(buffer, "%s.descriptor%s ", compiler->colours.opcode, compiler->colours.reset); | 
					
						
							|  |  |  |         shader_print_descriptor_name(compiler, d->type, d->register_id); | 
					
						
							|  |  |  |         shader_print_subscript_range(compiler, d->register_index, | 
					
						
							|  |  |  |                 d->count == ~0u ? ~0u : d->register_index + d->count - 1); | 
					
						
							|  |  |  |         shader_dump_register_space(compiler, d->register_space); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d->type == VKD3D_SHADER_DESCRIPTOR_TYPE_SRV || d->type == VKD3D_SHADER_DESCRIPTOR_TYPE_UAV) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, ", "); | 
					
						
							|  |  |  |             shader_print_resource_type(compiler, d->resource_type); | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, " <v4:"); | 
					
						
							|  |  |  |             shader_print_data_type(compiler, d->resource_data_type); | 
					
						
							|  |  |  |             if (d->resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMS | 
					
						
							|  |  |  |                     || d->resource_type == VKD3D_SHADER_RESOURCE_TEXTURE_2DMSARRAY) | 
					
						
							|  |  |  |                 shader_print_uint_literal(compiler, ", ", d->sample_count, ""); | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, ">"); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (d->buffer_size) | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", size=", d->buffer_size, ""); | 
					
						
							|  |  |  |         if (d->structure_stride) | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", stride=", d->structure_stride, ""); | 
					
						
							|  |  |  |         if (d->flags) | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", flags=", d->flags, ""); | 
					
						
							|  |  |  |         if (d->uav_flags) | 
					
						
							|  |  |  |             shader_print_hex_literal(compiler, ", uav_flags=", d->uav_flags, ""); | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "\n"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-11 15:23:57 +01:00
										 |  |  | enum vkd3d_result d3d_asm_compile(const struct vsir_program *program, | 
					
						
							|  |  |  |         const struct vkd3d_shader_compile_info *compile_info, | 
					
						
							| 
									
										
										
										
											2024-01-17 23:14:33 +01:00
										 |  |  |         struct vkd3d_shader_code *out, enum vsir_asm_flags flags) | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:56 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-01-16 16:40:30 +01:00
										 |  |  |     const struct vkd3d_shader_version *shader_version = &program->shader_version; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     enum vkd3d_shader_compile_option_formatting_flags formatting; | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  |     struct vkd3d_d3d_asm_compiler compiler = | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-01-17 23:14:33 +01:00
										 |  |  |         .flags = flags, | 
					
						
							| 
									
										
										
										
											2023-11-30 12:09:04 +01:00
										 |  |  |     }; | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  |     enum vkd3d_result result = VKD3D_OK; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     struct vkd3d_string_buffer *buffer; | 
					
						
							| 
									
										
										
										
											2023-01-20 12:08:22 +10:00
										 |  |  |     unsigned int indent, i, j; | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |     const char *indent_str; | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     static const struct vkd3d_d3d_asm_colours no_colours = | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .reset = "", | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |         .error = "", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |         .literal = "", | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |         .modifier = "", | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |         .opcode = "", | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |         .reg = "", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:04 +01:00
										 |  |  |         .swizzle = "", | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:07 +01:00
										 |  |  |         .version = "", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:03 +01:00
										 |  |  |         .write_mask = "", | 
					
						
							| 
									
										
										
										
											2024-03-07 14:47:32 +01:00
										 |  |  |         .label = "", | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  |     static const struct vkd3d_d3d_asm_colours colours = | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .reset = "\x1b[m", | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |         .error = "\x1b[97;41m", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:02 +01:00
										 |  |  |         .literal = "\x1b[95m", | 
					
						
							| 
									
										
										
										
											2021-09-28 16:07:22 +02:00
										 |  |  |         .modifier = "\x1b[36m", | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |         .opcode = "\x1b[96;1m", | 
					
						
							| 
									
										
										
										
											2021-02-17 12:21:07 +01:00
										 |  |  |         .reg = "\x1b[96m", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:04 +01:00
										 |  |  |         .swizzle = "\x1b[93m", | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:07 +01:00
										 |  |  |         .version = "\x1b[36m", | 
					
						
							| 
									
										
										
										
											2021-02-18 11:24:03 +01:00
										 |  |  |         .write_mask = "\x1b[93m", | 
					
						
							| 
									
										
										
										
											2024-03-07 14:47:32 +01:00
										 |  |  |         .label = "\x1b[91m", | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  |     }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     formatting = VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT | 
					
						
							|  |  |  |             | VKD3D_SHADER_COMPILE_OPTION_FORMATTING_HEADER; | 
					
						
							|  |  |  |     if (compile_info) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         for (i = 0; i < compile_info->option_count; ++i) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             const struct vkd3d_shader_compile_option *option = &compile_info->options[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (option->name == VKD3D_SHADER_COMPILE_OPTION_FORMATTING) | 
					
						
							|  |  |  |                 formatting = option->value; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_COLOUR) | 
					
						
							|  |  |  |         compiler.colours = colours; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         compiler.colours = no_colours; | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |     if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_INDENT) | 
					
						
							|  |  |  |         indent_str = "    "; | 
					
						
							|  |  |  |     else | 
					
						
							|  |  |  |         indent_str = ""; | 
					
						
							| 
									
										
										
										
											2024-10-05 22:02:12 +02:00
										 |  |  |     /* The signatures we emit only make sense for DXBC shaders. d3dbc doesn't
 | 
					
						
							|  |  |  |      * even have an explicit concept of signature. */ | 
					
						
							|  |  |  |     if (formatting & VKD3D_SHADER_COMPILE_OPTION_FORMATTING_IO_SIGNATURES && shader_version->major >= 4) | 
					
						
							|  |  |  |         compiler.flags |= VSIR_ASM_FLAG_DUMP_SIGNATURES; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:27 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:25 +01:00
										 |  |  |     buffer = &compiler.buffer; | 
					
						
							|  |  |  |     vkd3d_string_buffer_init(buffer); | 
					
						
							| 
									
										
										
										
											2018-06-05 13:52:56 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-02-23 13:47:03 +10:00
										 |  |  |     compiler.shader_version = *shader_version; | 
					
						
							| 
									
										
										
										
											2021-02-16 14:58:24 +01:00
										 |  |  |     shader_version = &compiler.shader_version; | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:07 +01:00
										 |  |  |     vkd3d_string_buffer_printf(buffer, "%s%s_%u_%u%s\n", compiler.colours.version, | 
					
						
							|  |  |  |             shader_get_type_prefix(shader_version->type), shader_version->major, | 
					
						
							|  |  |  |             shader_version->minor, compiler.colours.reset); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-05 22:02:12 +02:00
										 |  |  |     if (compiler.flags & VSIR_ASM_FLAG_DUMP_SIGNATURES | 
					
						
							|  |  |  |             && (result = dump_dxbc_signatures(&compiler, program)) < 0) | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-10-05 22:02:12 +02:00
										 |  |  |         vkd3d_string_buffer_cleanup(buffer); | 
					
						
							|  |  |  |         return result; | 
					
						
							| 
									
										
										
										
											2024-01-17 23:30:06 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-28 10:27:32 +01:00
										 |  |  |     if (compiler.flags & VSIR_ASM_FLAG_DUMP_DESCRIPTORS) | 
					
						
							|  |  |  |         shader_print_descriptors(&compiler, &program->descriptors); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (compiler.flags & (VSIR_ASM_FLAG_DUMP_SIGNATURES | VSIR_ASM_FLAG_DUMP_DESCRIPTORS)) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(buffer, "%s.text%s\n", compiler.colours.opcode, compiler.colours.reset); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |     indent = 0; | 
					
						
							| 
									
										
										
										
											2024-01-16 16:40:30 +01:00
										 |  |  |     for (i = 0; i < program->instructions.count; ++i) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2024-01-16 16:40:30 +01:00
										 |  |  |         struct vkd3d_shader_instruction *ins = &program->instructions.elements[i]; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |         switch (ins->opcode) | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             case VKD3DSIH_ELSE: | 
					
						
							|  |  |  |             case VKD3DSIH_ENDIF: | 
					
						
							|  |  |  |             case VKD3DSIH_ENDLOOP: | 
					
						
							|  |  |  |             case VKD3DSIH_ENDSWITCH: | 
					
						
							| 
									
										
										
										
											2022-11-09 18:24:50 -06:00
										 |  |  |                 if (indent) | 
					
						
							|  |  |  |                     --indent; | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-03-01 00:01:55 +01:00
										 |  |  |             case VKD3DSIH_LABEL: | 
					
						
							| 
									
										
										
										
											2024-04-08 23:45:11 +02:00
										 |  |  |             case VKD3DSIH_HS_DECLS: | 
					
						
							|  |  |  |             case VKD3DSIH_HS_CONTROL_POINT_PHASE: | 
					
						
							|  |  |  |             case VKD3DSIH_HS_FORK_PHASE: | 
					
						
							|  |  |  |             case VKD3DSIH_HS_JOIN_PHASE: | 
					
						
							| 
									
										
										
										
											2024-03-01 00:01:55 +01:00
										 |  |  |                 indent = 0; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |             default: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-20 12:08:22 +10:00
										 |  |  |         for (j = 0; j < indent; ++j) | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(buffer, "%s", indent_str); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-01-20 12:08:22 +10:00
										 |  |  |         shader_dump_instruction(&compiler, ins); | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-24 20:34:42 +02:00
										 |  |  |         switch (ins->opcode) | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |         { | 
					
						
							|  |  |  |             case VKD3DSIH_ELSE: | 
					
						
							|  |  |  |             case VKD3DSIH_IF: | 
					
						
							| 
									
										
										
										
											2023-11-30 11:31:29 +01:00
										 |  |  |             case VKD3DSIH_IFC: | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |             case VKD3DSIH_LOOP: | 
					
						
							|  |  |  |             case VKD3DSIH_SWITCH: | 
					
						
							| 
									
										
										
										
											2024-03-01 00:01:55 +01:00
										 |  |  |             case VKD3DSIH_LABEL: | 
					
						
							| 
									
										
										
										
											2021-02-19 15:57:08 +01:00
										 |  |  |                 ++indent; | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             default: | 
					
						
							|  |  |  |                 break; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-10 16:16:23 +01:00
										 |  |  |     vkd3d_shader_code_from_string_buffer(out, buffer); | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     return result; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 16:54:08 +02:00
										 |  |  | /* This is meant exclusively for development use. Therefore, differently from
 | 
					
						
							|  |  |  |  * dump_dxbc_signature(), it doesn't try particularly hard to make the output | 
					
						
							|  |  |  |  * nice or easily parsable, and it dumps all fields, not just the DXBC ones. | 
					
						
							|  |  |  |  * This format isn't meant to be stable. */ | 
					
						
							|  |  |  | static void trace_signature(const struct shader_signature *signature, const char *signature_type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer buffer; | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     TRACE("%s signature:%s\n", signature_type, signature->element_count == 0 ? " empty" : ""); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_init(&buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < signature->element_count; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         const struct signature_element *element = &signature->elements[i]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_clear(&buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&buffer, "Element %u: %s %u-%u %s", i, | 
					
						
							|  |  |  |                 get_component_type_name(element->component_type), | 
					
						
							|  |  |  |                 element->register_index, element->register_index + element->register_count, | 
					
						
							|  |  |  |                 element->semantic_name); | 
					
						
							|  |  |  |         if (element->semantic_index != -1) | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(&buffer, "%u", element->semantic_index); | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&buffer, | 
					
						
							|  |  |  |                 " mask %#x used_mask %#x sysval %s min_precision %s interpolation %u stream %u", | 
					
						
							|  |  |  |                 element->mask, element->used_mask, get_sysval_semantic_name(element->sysval_semantic), | 
					
						
							|  |  |  |                 get_minimum_precision_name(element->min_precision), element->interpolation_mode, | 
					
						
							|  |  |  |                 element->stream_index); | 
					
						
							|  |  |  |         if (element->target_location != -1) | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(&buffer, " target %u", element->target_location); | 
					
						
							|  |  |  |         else | 
					
						
							|  |  |  |             vkd3d_string_buffer_printf(&buffer, " unused"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         TRACE("%s\n", buffer.buffer); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_cleanup(&buffer); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-28 09:57:02 +01:00
										 |  |  | static void shader_print_io_declaration(struct vkd3d_string_buffer *buffer, enum vkd3d_shader_register_type type) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     switch (type) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  | #define X(x) case VKD3DSPR_ ## x: vkd3d_string_buffer_printf(buffer, #x); return;
 | 
					
						
							|  |  |  |         X(TEMP) | 
					
						
							|  |  |  |         X(INPUT) | 
					
						
							|  |  |  |         X(CONST) | 
					
						
							|  |  |  |         X(ADDR) | 
					
						
							|  |  |  |         X(TEXTURE) | 
					
						
							|  |  |  |         X(RASTOUT) | 
					
						
							|  |  |  |         X(ATTROUT) | 
					
						
							|  |  |  |         X(TEXCRDOUT) | 
					
						
							|  |  |  |         X(OUTPUT) | 
					
						
							|  |  |  |         X(CONSTINT) | 
					
						
							|  |  |  |         X(COLOROUT) | 
					
						
							|  |  |  |         X(DEPTHOUT) | 
					
						
							|  |  |  |         X(COMBINED_SAMPLER) | 
					
						
							|  |  |  |         X(CONSTBOOL) | 
					
						
							|  |  |  |         X(LOOP) | 
					
						
							|  |  |  |         X(TEMPFLOAT16) | 
					
						
							|  |  |  |         X(MISCTYPE) | 
					
						
							|  |  |  |         X(LABEL) | 
					
						
							|  |  |  |         X(PREDICATE) | 
					
						
							|  |  |  |         X(IMMCONST) | 
					
						
							|  |  |  |         X(IMMCONST64) | 
					
						
							|  |  |  |         X(CONSTBUFFER) | 
					
						
							|  |  |  |         X(IMMCONSTBUFFER) | 
					
						
							|  |  |  |         X(PRIMID) | 
					
						
							|  |  |  |         X(NULL) | 
					
						
							|  |  |  |         X(SAMPLER) | 
					
						
							|  |  |  |         X(RESOURCE) | 
					
						
							|  |  |  |         X(UAV) | 
					
						
							|  |  |  |         X(OUTPOINTID) | 
					
						
							|  |  |  |         X(FORKINSTID) | 
					
						
							|  |  |  |         X(JOININSTID) | 
					
						
							|  |  |  |         X(INCONTROLPOINT) | 
					
						
							|  |  |  |         X(OUTCONTROLPOINT) | 
					
						
							|  |  |  |         X(PATCHCONST) | 
					
						
							|  |  |  |         X(TESSCOORD) | 
					
						
							|  |  |  |         X(GROUPSHAREDMEM) | 
					
						
							|  |  |  |         X(THREADID) | 
					
						
							|  |  |  |         X(THREADGROUPID) | 
					
						
							|  |  |  |         X(LOCALTHREADID) | 
					
						
							|  |  |  |         X(LOCALTHREADINDEX) | 
					
						
							|  |  |  |         X(IDXTEMP) | 
					
						
							|  |  |  |         X(STREAM) | 
					
						
							|  |  |  |         X(FUNCTIONBODY) | 
					
						
							|  |  |  |         X(FUNCTIONPOINTER) | 
					
						
							|  |  |  |         X(COVERAGE) | 
					
						
							|  |  |  |         X(SAMPLEMASK) | 
					
						
							|  |  |  |         X(GSINSTID) | 
					
						
							|  |  |  |         X(DEPTHOUTGE) | 
					
						
							|  |  |  |         X(DEPTHOUTLE) | 
					
						
							|  |  |  |         X(RASTERIZER) | 
					
						
							|  |  |  |         X(OUTSTENCILREF) | 
					
						
							|  |  |  |         X(UNDEF) | 
					
						
							|  |  |  |         X(SSA) | 
					
						
							|  |  |  |         X(WAVELANECOUNT) | 
					
						
							|  |  |  |         X(WAVELANEINDEX) | 
					
						
							|  |  |  |         X(PARAMETER) | 
					
						
							|  |  |  |         X(POINT_COORD) | 
					
						
							|  |  |  | #undef X
 | 
					
						
							|  |  |  |         case VKD3DSPR_INVALID: | 
					
						
							|  |  |  |         case VKD3DSPR_COUNT: | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(buffer, "<invalid register type %#x>", type); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-17 23:27:49 +01:00
										 |  |  | static void trace_io_declarations(const struct vsir_program *program) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     struct vkd3d_string_buffer buffer; | 
					
						
							|  |  |  |     bool empty = true; | 
					
						
							|  |  |  |     unsigned int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_init(&buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_printf(&buffer, "Input/output declarations:"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < sizeof(program->io_dcls) * CHAR_BIT; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-03-28 09:57:02 +01:00
										 |  |  |         if (!bitmap_is_set(program->io_dcls, i)) | 
					
						
							|  |  |  |             continue; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&buffer, empty ? " " : " | "); | 
					
						
							|  |  |  |         shader_print_io_declaration(&buffer, i); | 
					
						
							|  |  |  |         empty = false; | 
					
						
							| 
									
										
										
										
											2024-11-17 23:27:49 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if (empty) | 
					
						
							|  |  |  |         vkd3d_string_buffer_printf(&buffer, " empty"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     TRACE("%s\n", buffer.buffer); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     vkd3d_string_buffer_cleanup(&buffer); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 15:29:52 +02:00
										 |  |  | void vsir_program_trace(const struct vsir_program *program) | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2024-10-05 22:02:12 +02:00
										 |  |  |     const unsigned int flags = VSIR_ASM_FLAG_DUMP_TYPES | VSIR_ASM_FLAG_DUMP_ALL_INDICES | 
					
						
							| 
									
										
										
										
											2025-03-28 10:27:32 +01:00
										 |  |  |             | VSIR_ASM_FLAG_DUMP_SIGNATURES | VSIR_ASM_FLAG_DUMP_DESCRIPTORS; | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  |     struct vkd3d_shader_code code; | 
					
						
							| 
									
										
										
										
											2024-09-26 22:19:55 +02:00
										 |  |  |     const char *p, *q, *end; | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-08 16:54:08 +02:00
										 |  |  |     trace_signature(&program->input_signature, "Input"); | 
					
						
							|  |  |  |     trace_signature(&program->output_signature, "Output"); | 
					
						
							|  |  |  |     trace_signature(&program->patch_constant_signature, "Patch-constant"); | 
					
						
							| 
									
										
										
										
											2024-11-17 23:27:49 +01:00
										 |  |  |     trace_io_declarations(program); | 
					
						
							| 
									
										
										
										
											2024-10-08 16:54:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 22:19:55 +02:00
										 |  |  |     if (d3d_asm_compile(program, NULL, &code, flags) != VKD3D_OK) | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  |         return; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-15 10:44:44 -05:00
										 |  |  |     end = (const char *)code.code + code.size; | 
					
						
							|  |  |  |     for (p = code.code; p < end; p = q) | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2020-10-15 10:44:44 -05:00
										 |  |  |         if (!(q = memchr(p, '\n', end - p))) | 
					
						
							|  |  |  |             q = end; | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  |         else | 
					
						
							|  |  |  |             ++q; | 
					
						
							|  |  |  |         TRACE("    %.*s", (int)(q - p), p); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-09-25 02:26:36 +01:00
										 |  |  |     vkd3d_shader_free_shader_code(&code); | 
					
						
							| 
									
										
										
										
											2018-05-29 12:50:32 +02:00
										 |  |  | } |