On 12/6/21 12:28, Francisco Casas wrote:
New values for enum hlsl_sampler_dim are added in order to represent dimension types for textures that don't have their analog sampler, like Texture2DArray.
enum hlsl_sampler_dim is then renamed to enum hlsl_resource_dim to convey that it no longer represents just sampler types.
Parsing and initialization of Texture2DArray, Texture2DMS, Texture2DMSArray, and TextureCubeArray is added.
sampler_dim_count() is moved from hlsl.y to hlsl.h since it can be useful in other files, like in write_sm4_ld() in hlsl_sm4.c.
---
This patch is an alternative to 221390, which proposed to separate sampler_dim into sampler_dim and texture_dim. It will probably be resent after Matteo's batch is reviewed.
Signed-off-by: Francisco Casas <fcasas(a)codeweavers.com> ---
As one can tell from the commit message, this patch does at least two things at once, which is at least one too many ;-) Personally I'm not sure that "sampler_dim" (or any of the associated names) need to be changed. I may be looking at things with GLSL-coloured glasses, but it seems to me there's no conceptual reason why a sampler couldn't have an array dimension; but rather HLSL just doesn't have a "sample2DArray" keyword.
@@ -1845,9 +1828,11 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl /* Only HLSL_IR_LOAD can return an object. */ object_load = hlsl_ir_load(object);
- if (!strcmp(name, "Load")) + if (!strcmp(name, "Load") + && object_type->resource_dim != HLSL_RESOURCE_DIM_CUBE + && object_type->resource_dim != HLSL_RESOURCE_DIM_CUBEARRAY) { - const unsigned int sampler_dim = sampler_dim_count(object_type->sampler_dim); + const unsigned int sampler_dim = sampler_dim_count(object_type->resource_dim); struct hlsl_ir_resource_load *load; struct hlsl_ir_node *coords;
This should also be a separate patch.
@@ -1862,7 +1847,7 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl
/* +1 for the mipmap level */ if (!(coords = add_implicit_conversion(ctx, instrs, params->args[0], - hlsl_get_vector_type(ctx, HLSL_TYPE_INT, sampler_dim + 1), loc))) + hlsl_get_vector_type(ctx, HLSL_TYPE_INT, (sampler_dim==4)? 4 : sampler_dim + 1), loc))) return false;
if (!(load = hlsl_new_resource_load(ctx, object_type->e.resource_format, HLSL_RESOURCE_LOAD,
This seems redundant; with the above hunk we can't hit this path for cube arrays.
@@ -1871,9 +1856,11 @@ static bool add_method_call(struct hlsl_ctx *ctx, struct list *instrs, struct hl list_add_tail(instrs, &load->node.entry); return true; } - else if (!strcmp(name, "Sample")) + else if (!strcmp(name, "Sample") + && object_type->resource_dim != HLSL_RESOURCE_DIM_2DMS + && object_type->resource_dim != HLSL_RESOURCE_DIM_2DMSARRAY) { - const unsigned int sampler_dim = sampler_dim_count(object_type->sampler_dim); + const unsigned int sampler_dim = sampler_dim_count(object_type->resource_dim); const struct hlsl_type *sampler_type; struct hlsl_ir_resource_load *load; struct hlsl_ir_load *sampler_load;
This should also be a separate patch.
@@ -424,20 +428,34 @@ static D3D_RESOURCE_RETURN_TYPE sm4_resource_format(const struct hlsl_type *type
static D3D_SRV_DIMENSION sm4_rdef_resource_dimension(const struct hlsl_type *type) { - switch (type->sampler_dim) + if (type->base_type == HLSL_TYPE_TEXTURE)
Does this need to be a conditional? Should this just be an assertion instead?
{ - case HLSL_SAMPLER_DIM_1D: - return D3D_SRV_DIMENSION_TEXTURE1D; - case HLSL_SAMPLER_DIM_2D: - return D3D_SRV_DIMENSION_TEXTURE2D; - case HLSL_SAMPLER_DIM_3D: - return D3D_SRV_DIMENSION_TEXTURE3D; - case HLSL_SAMPLER_DIM_CUBE: - return D3D_SRV_DIMENSION_TEXTURECUBE; - default: - assert(0); - return D3D_SRV_DIMENSION_UNKNOWN; + switch (type->resource_dim) + { + case HLSL_RESOURCE_DIM_1D: + return D3D_SRV_DIMENSION_TEXTURE1D; + case HLSL_RESOURCE_DIM_1DARRAY: + return D3D_SRV_DIMENSION_TEXTURE1DARRAY; + case HLSL_RESOURCE_DIM_2D: + return D3D_SRV_DIMENSION_TEXTURE2D; + case HLSL_RESOURCE_DIM_2DARRAY: + return D3D_SRV_DIMENSION_TEXTURE2DARRAY; + case HLSL_RESOURCE_DIM_2DMS: + return D3D_SRV_DIMENSION_TEXTURE2DMS; + case HLSL_RESOURCE_DIM_2DMSARRAY: + return D3D_SRV_DIMENSION_TEXTURE2DMSARRAY; + case HLSL_RESOURCE_DIM_3D: + return D3D_SRV_DIMENSION_TEXTURE3D; + case HLSL_RESOURCE_DIM_CUBE: + return D3D_SRV_DIMENSION_TEXTURECUBE; + case HLSL_RESOURCE_DIM_CUBEARRAY: + return D3D_SRV_DIMENSION_TEXTURECUBEARRAY; + default: + assert(0); + return D3D_SRV_DIMENSION_UNKNOWN; + } } + assert(0); }
static int sm4_compare_externs(const struct hlsl_ir_var *a, const struct hlsl_ir_var *b) @@ -711,20 +729,34 @@ static void write_sm4_rdef(struct hlsl_ctx *ctx, struct dxbc_writer *dxbc)
static enum vkd3d_sm4_resource_type sm4_resource_dimension(const struct hlsl_type *type) { - switch (type->sampler_dim) - { - case HLSL_SAMPLER_DIM_1D: - return VKD3D_SM4_RESOURCE_TEXTURE_1D; - case HLSL_SAMPLER_DIM_2D: - return VKD3D_SM4_RESOURCE_TEXTURE_2D; - case HLSL_SAMPLER_DIM_3D: - return VKD3D_SM4_RESOURCE_TEXTURE_3D; - case HLSL_SAMPLER_DIM_CUBE: - return VKD3D_SM4_RESOURCE_TEXTURE_CUBE; - default: - assert(0); - return 0; + if (type->base_type == HLSL_TYPE_TEXTURE) {
Same here.
+ switch (type->resource_dim) + { + case HLSL_RESOURCE_DIM_1D: + return VKD3D_SM4_RESOURCE_TEXTURE_1D; + case HLSL_RESOURCE_DIM_2D: + return VKD3D_SM4_RESOURCE_TEXTURE_2D; + case HLSL_RESOURCE_DIM_3D: + return VKD3D_SM4_RESOURCE_TEXTURE_3D; + case HLSL_RESOURCE_DIM_CUBE: + return VKD3D_SM4_RESOURCE_TEXTURE_CUBE; + case HLSL_RESOURCE_DIM_1DARRAY: + return VKD3D_SM4_RESOURCE_TEXTURE_1DARRAY; + case HLSL_RESOURCE_DIM_2DARRAY: + return VKD3D_SM4_RESOURCE_TEXTURE_2DARRAY; + case HLSL_RESOURCE_DIM_2DMS: + return VKD3D_SM4_RESOURCE_TEXTURE_2DMS; + case HLSL_RESOURCE_DIM_2DMSARRAY: + return VKD3D_SM4_RESOURCE_TEXTURE_2DMSARRAY; + case HLSL_RESOURCE_DIM_CUBEARRAY: + return VKD3D_SM4_RESOURCE_TEXTURE_CUBEARRAY; + default: + assert(0); + return 0; + } } + assert(0); + return 0; }
struct sm4_register