[Mesa-dev] [PATCH v3 02/13] gallium/tgsi: Split sampler views from shader resources.
Jose Fonseca
jfonseca at vmware.com
Fri May 4 05:38:32 PDT 2012
I didn't reviewed in detail, but the interface changes look good to me.
I agree that following the D3D11 semantics / nomenclature is less confusing.
Jose
----- Original Message -----
> This commit splits the current concept of resource into "sampler
> views" and "shader resources":
>
> "Sampler views" are textures or buffers that are bound to a given
> shader stage and can be read from in conjunction with a sampler
> object. They are analogous to OpenGL texture objects or Direct3D
> SRVs.
>
> "Shader resources" are textures or buffers that can be read and
> written from a shader. There's no support for floating point
> coordinates, address wrap modes or filtering, and, unlike sampler
> views, shader resources are global for the whole graphics pipeline.
> They are analogous to OpenGL image objects (as in
> ARB_shader_image_load_store) or Direct3D UAVs.
>
> Most hardware is likely to implement shader resources and sampler
> views as separate objects, so, having the distinction at the API
> level
> simplifies things slightly for the driver.
>
> This patch introduces the SVIEW register file with a declaration
> token
> and syntax analogous to the already existing RES register file.
> After
> this change, the SAMPLE_* opcodes no longer accept a resource as
> input, but rather a SVIEW object. To preserve the functionality of
> reading from a sampler view with integer coordinates, the
> SAMPLE_I(_MS) opcodes are introduced which are similar to LOAD(_MS)
> but take a SVIEW register instead of a RES register as argument.
> ---
> v3: Split sampler views from shader resources.
>
> src/gallium/auxiliary/tgsi/tgsi_build.c | 88
> ++++++++++----
> src/gallium/auxiliary/tgsi/tgsi_dump.c | 22 ++--
> src/gallium/auxiliary/tgsi/tgsi_exec.c | 14 +--
> src/gallium/auxiliary/tgsi/tgsi_exec.h | 3 +-
> src/gallium/auxiliary/tgsi/tgsi_info.c | 7 +-
> src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h | 6 +-
> src/gallium/auxiliary/tgsi/tgsi_parse.c | 4 +
> src/gallium/auxiliary/tgsi/tgsi_parse.h | 1 +
> src/gallium/auxiliary/tgsi/tgsi_strings.c | 3 +-
> src/gallium/auxiliary/tgsi/tgsi_text.c | 32 ++++--
> src/gallium/auxiliary/tgsi/tgsi_ureg.c | 88
> +++++++-------
> src/gallium/auxiliary/tgsi/tgsi_ureg.h | 14 +--
> src/gallium/docs/source/tgsi.rst | 121
> +++++++++++++-------
> .../drivers/nv50/codegen/nv50_ir_from_tgsi.cpp | 34 +++---
> src/gallium/drivers/r600/r600_shader.c | 18 +--
> src/gallium/include/pipe/p_shader_tokens.h | 18 ++-
> .../state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp | 13 ++-
> 17 files changed, 303 insertions(+), 183 deletions(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c
> b/src/gallium/auxiliary/tgsi/tgsi_build.c
> index 6ec2b0d..6c3f775 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_build.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c
> @@ -227,42 +227,66 @@ tgsi_build_declaration_semantic(
> return ds;
> }
>
> -
> static struct tgsi_declaration_resource
> tgsi_default_declaration_resource(void)
> {
> - struct tgsi_declaration_resource declaration_resource;
> + struct tgsi_declaration_resource dr;
>
> - declaration_resource.Resource = TGSI_TEXTURE_UNKNOWN;
> - declaration_resource.ReturnTypeX = PIPE_TYPE_UNORM;
> - declaration_resource.ReturnTypeY = PIPE_TYPE_UNORM;
> - declaration_resource.ReturnTypeZ = PIPE_TYPE_UNORM;
> - declaration_resource.ReturnTypeW = PIPE_TYPE_UNORM;
> + dr.Resource = TGSI_BUFFER;
>
> - return declaration_resource;
> + return dr;
> }
>
> static struct tgsi_declaration_resource
> tgsi_build_declaration_resource(unsigned texture,
> - unsigned return_type_x,
> - unsigned return_type_y,
> - unsigned return_type_z,
> - unsigned return_type_w,
> struct tgsi_declaration
> *declaration,
> struct tgsi_header *header)
> {
> - struct tgsi_declaration_resource declaration_resource;
> + struct tgsi_declaration_resource dr;
> +
> + dr = tgsi_default_declaration_resource();
> + dr.Resource = texture;
> +
> + declaration_grow(declaration, header);
> +
> + return dr;
> +}
> +
> +static struct tgsi_declaration_sampler_view
> +tgsi_default_declaration_sampler_view(void)
> +{
> + struct tgsi_declaration_sampler_view dsv;
> +
> + dsv.Resource = TGSI_BUFFER;
> + dsv.ReturnTypeX = PIPE_TYPE_UNORM;
> + dsv.ReturnTypeY = PIPE_TYPE_UNORM;
> + dsv.ReturnTypeZ = PIPE_TYPE_UNORM;
> + dsv.ReturnTypeW = PIPE_TYPE_UNORM;
> +
> + return dsv;
> +}
> +
> +static struct tgsi_declaration_sampler_view
> +tgsi_build_declaration_sampler_view(unsigned texture,
> + unsigned return_type_x,
> + unsigned return_type_y,
> + unsigned return_type_z,
> + unsigned return_type_w,
> + struct tgsi_declaration
> *declaration,
> + struct tgsi_header *header)
> +{
> + struct tgsi_declaration_sampler_view dsv;
>
> - declaration_resource = tgsi_default_declaration_resource();
> - declaration_resource.Resource = texture;
> - declaration_resource.ReturnTypeX = return_type_x;
> - declaration_resource.ReturnTypeY = return_type_y;
> - declaration_resource.ReturnTypeZ = return_type_z;
> - declaration_resource.ReturnTypeW = return_type_w;
> + dsv = tgsi_default_declaration_sampler_view();
> + dsv.Resource = texture;
> + dsv.ReturnTypeX = return_type_x;
> + dsv.ReturnTypeY = return_type_y;
> + dsv.ReturnTypeZ = return_type_z;
> + dsv.ReturnTypeW = return_type_w;
>
> declaration_grow(declaration, header);
>
> - return declaration_resource;
> + return dsv;
> }
>
>
> @@ -276,6 +300,7 @@ tgsi_default_full_declaration( void )
> full_declaration.Semantic = tgsi_default_declaration_semantic();
> full_declaration.ImmediateData.u = NULL;
> full_declaration.Resource = tgsi_default_declaration_resource();
> + full_declaration.SamplerView =
> tgsi_default_declaration_sampler_view();
>
> return full_declaration;
> }
> @@ -375,14 +400,29 @@ tgsi_build_full_declaration(
> size++;
>
> *dr =
> tgsi_build_declaration_resource(full_decl->Resource.Resource,
> -
> full_decl->Resource.ReturnTypeX,
> -
> full_decl->Resource.ReturnTypeY,
> -
> full_decl->Resource.ReturnTypeZ,
> -
> full_decl->Resource.ReturnTypeW,
> declaration,
> header);
> }
>
> + if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> + struct tgsi_declaration_sampler_view *dsv;
> +
> + if (maxsize <= size) {
> + return 0;
> + }
> + dsv = (struct tgsi_declaration_sampler_view *)&tokens[size];
> + size++;
> +
> + *dsv = tgsi_build_declaration_sampler_view(
> + full_decl->SamplerView.Resource,
> + full_decl->SamplerView.ReturnTypeX,
> + full_decl->SamplerView.ReturnTypeY,
> + full_decl->SamplerView.ReturnTypeZ,
> + full_decl->SamplerView.ReturnTypeW,
> + declaration,
> + header);
> + }
> +
> return size;
> }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> index 635212b..f20a194 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_dump.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_dump.c
> @@ -285,21 +285,25 @@ iter_declaration(
> if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
> TXT(", ");
> ENM(decl->Resource.Resource, tgsi_texture_names);
> + }
> +
> + if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> TXT(", ");
> - if ((decl->Resource.ReturnTypeX == decl->Resource.ReturnTypeY)
> &&
> - (decl->Resource.ReturnTypeX == decl->Resource.ReturnTypeZ)
> &&
> - (decl->Resource.ReturnTypeX ==
> decl->Resource.ReturnTypeW)) {
> - ENM(decl->Resource.ReturnTypeX, tgsi_type_names);
> + ENM(decl->SamplerView.Resource, tgsi_texture_names);
> + TXT(", ");
> + if ((decl->SamplerView.ReturnTypeX ==
> decl->SamplerView.ReturnTypeY) &&
> + (decl->SamplerView.ReturnTypeX ==
> decl->SamplerView.ReturnTypeZ) &&
> + (decl->SamplerView.ReturnTypeX ==
> decl->SamplerView.ReturnTypeW)) {
> + ENM(decl->SamplerView.ReturnTypeX, tgsi_type_names);
> } else {
> - ENM(decl->Resource.ReturnTypeX, tgsi_type_names);
> + ENM(decl->SamplerView.ReturnTypeX, tgsi_type_names);
> TXT(", ");
> - ENM(decl->Resource.ReturnTypeY, tgsi_type_names);
> + ENM(decl->SamplerView.ReturnTypeY, tgsi_type_names);
> TXT(", ");
> - ENM(decl->Resource.ReturnTypeZ, tgsi_type_names);
> + ENM(decl->SamplerView.ReturnTypeZ, tgsi_type_names);
> TXT(", ");
> - ENM(decl->Resource.ReturnTypeW, tgsi_type_names);
> + ENM(decl->SamplerView.ReturnTypeW, tgsi_type_names);
> }
> -
> }
>
> if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT &&
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> index c4ad34b..20bbe40 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.c
> @@ -2121,7 +2121,7 @@ exec_sample(struct tgsi_exec_machine *mach,
> control = tgsi_sampler_lod_bias;
> }
>
> - switch (mach->Resources[resource_unit].Resource) {
> + switch (mach->SamplerViews[resource_unit].Resource) {
> case TGSI_TEXTURE_1D:
> case TGSI_TEXTURE_SHADOW1D:
> FETCH(&r[0], 0, TGSI_CHAN_X);
> @@ -2215,7 +2215,7 @@ exec_sample_d(struct tgsi_exec_machine *mach,
> * XXX: This is fake SAMPLE_D -- the derivatives are not taken
> into account, yet.
> */
>
> - switch (mach->Resources[resource_unit].Resource) {
> + switch (mach->SamplerViews[resource_unit].Resource) {
> case TGSI_TEXTURE_1D:
> case TGSI_TEXTURE_SHADOW1D:
>
> @@ -2338,8 +2338,8 @@ static void
> exec_declaration(struct tgsi_exec_machine *mach,
> const struct tgsi_full_declaration *decl)
> {
> - if (decl->Declaration.File == TGSI_FILE_RESOURCE) {
> - mach->Resources[decl->Range.First] = decl->Resource;
> + if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> + mach->SamplerViews[decl->Range.First] = decl->SamplerView;
> return;
> }
>
> @@ -4154,11 +4154,11 @@ exec_instruction(
> exec_endswitch(mach);
> break;
>
> - case TGSI_OPCODE_LOAD:
> + case TGSI_OPCODE_SAMPLE_I:
> assert(0);
> break;
>
> - case TGSI_OPCODE_LOAD_MS:
> + case TGSI_OPCODE_SAMPLE_I_MS:
> assert(0);
> break;
>
> @@ -4190,7 +4190,7 @@ exec_instruction(
> assert(0);
> break;
>
> - case TGSI_OPCODE_RESINFO:
> + case TGSI_OPCODE_SVIEWINFO:
> assert(0);
> break;
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> index d9e93ce..0ecb4e9 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
> @@ -331,7 +331,8 @@ struct tgsi_exec_machine
> struct tgsi_full_declaration *Declarations;
> uint NumDeclarations;
>
> - struct tgsi_declaration_resource
> Resources[PIPE_MAX_SHADER_RESOURCES];
> + struct tgsi_declaration_sampler_view
> + SamplerViews[PIPE_MAX_SHADER_SAMPLER_VIEWS];
>
> boolean UsedGeometryShader;
> };
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c
> b/src/gallium/auxiliary/tgsi/tgsi_info.c
> index 81df96b..c41288f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_info.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c
> @@ -183,22 +183,23 @@ static const struct tgsi_opcode_info
> opcode_info[TGSI_OPCODE_LAST] =
> { 0, 0, 0, 0, 0, 0, NONE, "DEFAULT", TGSI_OPCODE_DEFAULT },
> { 0, 0, 0, 0, 0, 0, NONE, "ENDSWITCH", TGSI_OPCODE_ENDSWITCH },
>
> - { 1, 2, 0, 0, 0, 0, OTHR, "LOAD", TGSI_OPCODE_LOAD },
> - { 1, 2, 0, 0, 0, 0, OTHR, "LOAD_MS", TGSI_OPCODE_LOAD_MS },
> { 1, 3, 0, 0, 0, 0, OTHR, "SAMPLE", TGSI_OPCODE_SAMPLE },
> + { 1, 2, 0, 0, 0, 0, OTHR, "SAMPLE_I", TGSI_OPCODE_SAMPLE_I },
> + { 1, 2, 0, 0, 0, 0, OTHR, "SAMPLE_I_MS", TGSI_OPCODE_SAMPLE_I_MS
> },
> { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_B", TGSI_OPCODE_SAMPLE_B },
> { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_C", TGSI_OPCODE_SAMPLE_C },
> { 1, 4, 0, 0, 0, 0, OTHR, "SAMPLE_C_LZ", TGSI_OPCODE_SAMPLE_C_LZ
> },
> { 1, 5, 0, 0, 0, 0, OTHR, "SAMPLE_D", TGSI_OPCODE_SAMPLE_D },
> { 1, 3, 0, 0, 0, 0, OTHR, "SAMPLE_L", TGSI_OPCODE_SAMPLE_L },
> { 1, 3, 0, 0, 0, 0, OTHR, "GATHER4", TGSI_OPCODE_GATHER4 },
> - { 1, 2, 0, 0, 0, 0, OTHR, "RESINFO", TGSI_OPCODE_RESINFO },
> + { 1, 2, 0, 0, 0, 0, OTHR, "SVIEWINFO", TGSI_OPCODE_SVIEWINFO },
> { 1, 2, 0, 0, 0, 0, OTHR, "SAMPLE_POS", TGSI_OPCODE_SAMPLE_POS
> },
> { 1, 2, 0, 0, 0, 0, OTHR, "SAMPLE_INFO", TGSI_OPCODE_SAMPLE_INFO
> },
> { 1, 1, 0, 0, 0, 0, COMP, "UARL", TGSI_OPCODE_UARL },
> { 1, 3, 0, 0, 0, 0, COMP, "UCMP", TGSI_OPCODE_UCMP },
> { 1, 1, 0, 0, 0, 0, COMP, "IABS", TGSI_OPCODE_IABS },
> { 1, 1, 0, 0, 0, 0, COMP, "ISSG", TGSI_OPCODE_ISSG },
> + { 1, 2, 0, 0, 0, 0, OTHR, "LOAD", TGSI_OPCODE_LOAD },
> };
>
> const struct tgsi_opcode_info *
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
> b/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
> index b5d4504..96b864f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_opcode_tmp.h
> @@ -168,16 +168,16 @@ OP01(CASE)
> OP00(DEFAULT)
> OP00(ENDSWITCH)
>
> -OP12(LOAD)
> -OP12(LOAD_MS)
> OP13(SAMPLE)
> +OP12(SAMPLE_I)
> +OP12(SAMPLE_I_MS)
> OP14(SAMPLE_B)
> OP14(SAMPLE_C)
> OP14(SAMPLE_C_LZ)
> OP15(SAMPLE_D)
> OP13(SAMPLE_L)
> OP13(GATHER4)
> -OP12(RESINFO)
> +OP12(SVIEWINFO)
> OP13(SAMPLE_POS)
> OP12(SAMPLE_INFO)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> index e1902eb..67d1389 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.c
> @@ -132,6 +132,10 @@ tgsi_parse_token(
> next_token(ctx, &decl->Resource);
> }
>
> + if (decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) {
> + next_token(ctx, &decl->SamplerView);
> + }
> +
> break;
> }
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> index f7b7e6e..3dce222 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_parse.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_parse.h
> @@ -70,6 +70,7 @@ struct tgsi_full_declaration
> struct tgsi_declaration_semantic Semantic;
> struct tgsi_immediate_array_data ImmediateData;
> struct tgsi_declaration_resource Resource;
> + struct tgsi_declaration_sampler_view SamplerView;
> };
>
> struct tgsi_full_immediate
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_strings.c
> b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> index 520452c..626ff6f 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_strings.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_strings.c
> @@ -53,7 +53,8 @@ const char *tgsi_file_names[TGSI_FILE_COUNT] =
> "SV",
> "IMMX",
> "TEMPX",
> - "RES"
> + "RES",
> + "SVIEW"
> };
>
> const char *tgsi_semantic_names[TGSI_SEMANTIC_COUNT] =
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c
> b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 4b3d22c..cec9cd3 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -1066,6 +1066,22 @@ static boolean parse_declaration( struct
> translate_ctx *ctx )
> report_error(ctx, "Expected texture target");
> return FALSE;
> }
> +
> + ctx->cur = cur;
> +
> + } else if (file == TGSI_FILE_SAMPLER_VIEW) {
> + for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
> + if (str_match_no_case(&cur, tgsi_texture_names[i])) {
> + if (!is_digit_alpha_underscore(cur)) {
> + decl.SamplerView.Resource = i;
> + break;
> + }
> + }
> + }
> + if (i == TGSI_TEXTURE_COUNT) {
> + report_error(ctx, "Expected texture target");
> + return FALSE;
> + }
> eat_opt_white( &cur );
> if (*cur != ',') {
> report_error( ctx, "Expected `,'" );
> @@ -1079,16 +1095,16 @@ static boolean parse_declaration( struct
> translate_ctx *ctx )
> if (!is_digit_alpha_underscore(cur)) {
> switch (j) {
> case 0:
> - decl.Resource.ReturnTypeX = i;
> + decl.SamplerView.ReturnTypeX = i;
> break;
> case 1:
> - decl.Resource.ReturnTypeY = i;
> + decl.SamplerView.ReturnTypeY = i;
> break;
> case 2:
> - decl.Resource.ReturnTypeZ = i;
> + decl.SamplerView.ReturnTypeZ = i;
> break;
> case 3:
> - decl.Resource.ReturnTypeW = i;
> + decl.SamplerView.ReturnTypeW = i;
> break;
> default:
> assert(0);
> @@ -1116,10 +1132,10 @@ static boolean parse_declaration( struct
> translate_ctx *ctx )
> }
> }
> if (j < 4) {
> - decl.Resource.ReturnTypeY =
> - decl.Resource.ReturnTypeZ =
> - decl.Resource.ReturnTypeW =
> - decl.Resource.ReturnTypeX;
> + decl.SamplerView.ReturnTypeY =
> + decl.SamplerView.ReturnTypeZ =
> + decl.SamplerView.ReturnTypeW =
> + decl.SamplerView.ReturnTypeX;
> }
> ctx->cur = cur;
> } else {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> index 0f9aa3a..496b31a 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c
> @@ -47,7 +47,7 @@ union tgsi_any_token {
> struct tgsi_declaration_range decl_range;
> struct tgsi_declaration_dimension decl_dim;
> struct tgsi_declaration_semantic decl_semantic;
> - struct tgsi_declaration_resource decl_resource;
> + struct tgsi_declaration_sampler_view decl_sampler_view;
> struct tgsi_immediate imm;
> union tgsi_immediate_data imm_data;
> struct tgsi_instruction insn;
> @@ -147,8 +147,8 @@ struct ureg_program
> unsigned return_type_y;
> unsigned return_type_z;
> unsigned return_type_w;
> - } resource[PIPE_MAX_SHADER_RESOURCES];
> - unsigned nr_resources;
> + } sampler_view[PIPE_MAX_SHADER_SAMPLER_VIEWS];
> + unsigned nr_sampler_views;
>
> unsigned temps_active[UREG_MAX_TEMP / 32];
> unsigned nr_temps;
> @@ -615,34 +615,34 @@ struct ureg_src ureg_DECL_sampler( struct
> ureg_program *ureg,
> }
>
> /*
> - * Allocate a new shader resource.
> + * Allocate a new shader sampler view.
> */
> struct ureg_src
> -ureg_DECL_resource(struct ureg_program *ureg,
> - unsigned index,
> - unsigned target,
> - unsigned return_type_x,
> - unsigned return_type_y,
> - unsigned return_type_z,
> - unsigned return_type_w)
> +ureg_DECL_sampler_view(struct ureg_program *ureg,
> + unsigned index,
> + unsigned target,
> + unsigned return_type_x,
> + unsigned return_type_y,
> + unsigned return_type_z,
> + unsigned return_type_w)
> {
> - struct ureg_src reg = ureg_src_register(TGSI_FILE_RESOURCE,
> index);
> + struct ureg_src reg = ureg_src_register(TGSI_FILE_SAMPLER_VIEW,
> index);
> uint i;
>
> - for (i = 0; i < ureg->nr_resources; i++) {
> - if (ureg->resource[i].index == index) {
> + for (i = 0; i < ureg->nr_sampler_views; i++) {
> + if (ureg->sampler_view[i].index == index) {
> return reg;
> }
> }
>
> - if (i < PIPE_MAX_SHADER_RESOURCES) {
> - ureg->resource[i].index = index;
> - ureg->resource[i].target = target;
> - ureg->resource[i].return_type_x = return_type_x;
> - ureg->resource[i].return_type_y = return_type_y;
> - ureg->resource[i].return_type_z = return_type_z;
> - ureg->resource[i].return_type_w = return_type_w;
> - ureg->nr_resources++;
> + if (i < PIPE_MAX_SHADER_SAMPLER_VIEWS) {
> + ureg->sampler_view[i].index = index;
> + ureg->sampler_view[i].target = target;
> + ureg->sampler_view[i].return_type_x = return_type_x;
> + ureg->sampler_view[i].return_type_y = return_type_y;
> + ureg->sampler_view[i].return_type_z = return_type_z;
> + ureg->sampler_view[i].return_type_w = return_type_w;
> + ureg->nr_sampler_views++;
> return reg;
> }
>
> @@ -891,7 +891,7 @@ ureg_emit_dst( struct ureg_program *ureg,
> assert(dst.File != TGSI_FILE_CONSTANT);
> assert(dst.File != TGSI_FILE_INPUT);
> assert(dst.File != TGSI_FILE_SAMPLER);
> - assert(dst.File != TGSI_FILE_RESOURCE);
> + assert(dst.File != TGSI_FILE_SAMPLER_VIEW);
> assert(dst.File != TGSI_FILE_IMMEDIATE);
> assert(dst.File < TGSI_FILE_COUNT);
>
> @@ -1297,20 +1297,20 @@ emit_decl_range2D(struct ureg_program *ureg,
> }
>
> static void
> -emit_decl_resource(struct ureg_program *ureg,
> - unsigned index,
> - unsigned target,
> - unsigned return_type_x,
> - unsigned return_type_y,
> - unsigned return_type_z,
> - unsigned return_type_w )
> +emit_decl_sampler_view(struct ureg_program *ureg,
> + unsigned index,
> + unsigned target,
> + unsigned return_type_x,
> + unsigned return_type_y,
> + unsigned return_type_z,
> + unsigned return_type_w )
> {
> union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, 3);
>
> out[0].value = 0;
> out[0].decl.Type = TGSI_TOKEN_TYPE_DECLARATION;
> out[0].decl.NrTokens = 3;
> - out[0].decl.File = TGSI_FILE_RESOURCE;
> + out[0].decl.File = TGSI_FILE_SAMPLER_VIEW;
> out[0].decl.UsageMask = 0xf;
> out[0].decl.Interpolate = TGSI_INTERPOLATE_CONSTANT;
>
> @@ -1319,11 +1319,11 @@ emit_decl_resource(struct ureg_program *ureg,
> out[1].decl_range.Last = index;
>
> out[2].value = 0;
> - out[2].decl_resource.Resource = target;
> - out[2].decl_resource.ReturnTypeX = return_type_x;
> - out[2].decl_resource.ReturnTypeY = return_type_y;
> - out[2].decl_resource.ReturnTypeZ = return_type_z;
> - out[2].decl_resource.ReturnTypeW = return_type_w;
> + out[2].decl_sampler_view.Resource = target;
> + out[2].decl_sampler_view.ReturnTypeX = return_type_x;
> + out[2].decl_sampler_view.ReturnTypeY = return_type_y;
> + out[2].decl_sampler_view.ReturnTypeZ = return_type_z;
> + out[2].decl_sampler_view.ReturnTypeW = return_type_w;
> }
>
> static void
> @@ -1473,14 +1473,14 @@ static void emit_decls( struct ureg_program
> *ureg )
> ureg->sampler[i].Index, 1 );
> }
>
> - for (i = 0; i < ureg->nr_resources; i++) {
> - emit_decl_resource(ureg,
> - ureg->resource[i].index,
> - ureg->resource[i].target,
> - ureg->resource[i].return_type_x,
> - ureg->resource[i].return_type_y,
> - ureg->resource[i].return_type_z,
> - ureg->resource[i].return_type_w);
> + for (i = 0; i < ureg->nr_sampler_views; i++) {
> + emit_decl_sampler_view(ureg,
> + ureg->sampler_view[i].index,
> + ureg->sampler_view[i].target,
> + ureg->sampler_view[i].return_type_x,
> + ureg->sampler_view[i].return_type_y,
> + ureg->sampler_view[i].return_type_z,
> + ureg->sampler_view[i].return_type_w);
> }
>
> if (ureg->const_decls.nr_constant_ranges) {
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> index 07ab8cb..b1297a2 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h
> @@ -292,13 +292,13 @@ ureg_DECL_sampler( struct ureg_program *,
> unsigned index );
>
> struct ureg_src
> -ureg_DECL_resource(struct ureg_program *,
> - unsigned index,
> - unsigned target,
> - unsigned return_type_x,
> - unsigned return_type_y,
> - unsigned return_type_z,
> - unsigned return_type_w );
> +ureg_DECL_sampler_view(struct ureg_program *,
> + unsigned index,
> + unsigned target,
> + unsigned return_type_x,
> + unsigned return_type_y,
> + unsigned return_type_z,
> + unsigned return_type_w );
>
>
> static INLINE struct ureg_src
> diff --git a/src/gallium/docs/source/tgsi.rst
> b/src/gallium/docs/source/tgsi.rst
> index 48e6896..039cdae 100644
> --- a/src/gallium/docs/source/tgsi.rst
> +++ b/src/gallium/docs/source/tgsi.rst
> @@ -1312,28 +1312,36 @@ This opcode is the inverse of
> :opcode:`DFRACEXP`.
> dst.zw = \sqrt{src.zw}
>
>
> -.. _resourceopcodes:
> +.. _samplingopcodes:
>
> -Resource Access Opcodes
> -^^^^^^^^^^^^^^^^^^^^^^^^
> +Resource Sampling Opcodes
> +^^^^^^^^^^^^^^^^^^^^^^^^^
>
> Those opcodes follow very closely semantics of the respective
> Direct3D
> instructions. If in doubt double check Direct3D documentation.
>
> -.. opcode:: LOAD - Simplified alternative to the "SAMPLE"
> instruction.
> - Using the provided integer address, LOAD fetches data
> - from the specified buffer/texture without any
> filtering.
> +.. opcode:: SAMPLE - Using provided address, sample data from the
> + specified texture using the filtering mode identified
> + by the gven sampler. The source data may come from
> + any resource type other than buffers.
> + SAMPLE dst, address, sampler_view, sampler
> + e.g.
> + SAMPLE TEMP[0], TEMP[1], SVIEW[0], SAMP[0]
> +
> +.. opcode:: SAMPLE_I - Simplified alternative to the SAMPLE
> instruction.
> + Using the provided integer address, SAMPLE_I fetches
> data
> + from the specified sampler view without any
> filtering.
> The source data may come from any resource type other
> than CUBE.
> - LOAD dst, address, resource
> + SAMPLE_I dst, address, sampler_view
> e.g.
> - LOAD TEMP[0], TEMP[1], RES[0]
> + SAMPLE_I TEMP[0], TEMP[1], SVIEW[0]
> The 'address' is specified as unsigned integers. If
> the
> 'address' is out of range [0...(# texels - 1)] the
> result of the fetch is always 0 in all components.
> As such the instruction doesn't honor address wrap
> modes, in cases where that behavior is desirable
> - 'sample' instruction should be used.
> + 'SAMPLE' instruction should be used.
> address.w always provides an unsigned integer mipmap
> level. If the value is out of the range then the
> instruction always returns 0 in all components.
> @@ -1348,7 +1356,7 @@ instructions. If in doubt double check Direct3D
> documentation.
> For 2D texture arrays address.z provides the array
> index, otherwise it exhibits the same behavior as in
> the case for 1D texture arrays.
> - The exeact semantics of the source address are
> presented
> + The exact semantics of the source address are
> presented
> in the table below:
> resource type X Y Z W
> ------------- ------------------------
> @@ -1364,25 +1372,16 @@ instructions. If in doubt double check
> Direct3D documentation.
> Where 'mpl' is a mipmap level and 'idx' is the
> array index.
>
> -
> -.. opcode:: LOAD_MS - Just like LOAD but allows fetch data from
> +.. opcode:: SAMPLE_I_MS - Just like SAMPLE_I but allows fetch data
> from
> multi-sampled surfaces.
>
> -.. opcode:: SAMPLE - Using provided address, sample data from the
> - specified texture using the filtering mode identified
> - by the gven sampler. The source data may come from
> - any resource type other than buffers.
> - SAMPLE dst, address, resource, sampler
> - e.g.
> - SAMPLE TEMP[0], TEMP[1], RES[0], SAMP[0]
> -
> .. opcode:: SAMPLE_B - Just like the SAMPLE instruction with the
> exception that an additiona bias is applied to the
> level of detail computed as part of the instruction
> execution.
> - SAMPLE_B dst, address, resource, sampler, lod_bias
> + SAMPLE_B dst, address, sampler_view, sampler,
> lod_bias
> e.g.
> - SAMPLE_B TEMP[0], TEMP[1], RES[0], SAMP[0], TEMP[2].x
> + SAMPLE_B TEMP[0], TEMP[1], SVIEW[0], SAMP[0],
> TEMP[2].x
>
> .. opcode:: SAMPLE_C - Similar to the SAMPLE instruction but it
> performs a comparison filter. The operands to
> SAMPLE_C
> @@ -1394,33 +1393,32 @@ instructions. If in doubt double check
> Direct3D documentation.
> reference value against the red component value for
> the
> surce resource at each texel that the currently
> configured
> texture filter covers based on the provided
> coordinates.
> - SAMPLE_C dst, address, resource.r, sampler, ref_value
> + SAMPLE_C dst, address, sampler_view.r, sampler,
> ref_value
> e.g.
> - SAMPLE_C TEMP[0], TEMP[1], RES[0].r, SAMP[0],
> TEMP[2].x
> + SAMPLE_C TEMP[0], TEMP[1], SVIEW[0].r, SAMP[0],
> TEMP[2].x
>
> .. opcode:: SAMPLE_C_LZ - Same as SAMPLE_C, but LOD is 0 and
> derivatives
> are ignored. The LZ stands for level-zero.
> - SAMPLE_C_LZ dst, address, resource.r, sampler,
> ref_value
> + SAMPLE_C_LZ dst, address, sampler_view.r, sampler,
> ref_value
> e.g.
> - SAMPLE_C_LZ TEMP[0], TEMP[1], RES[0].r, SAMP[0],
> TEMP[2].x
> + SAMPLE_C_LZ TEMP[0], TEMP[1], SVIEW[0].r, SAMP[0],
> TEMP[2].x
>
>
> .. opcode:: SAMPLE_D - SAMPLE_D is identical to the SAMPLE opcode
> except
> that the derivatives for the source address in the x
> direction and the y direction are provided by extra
> parameters.
> - SAMPLE_D dst, address, resource, sampler, der_x,
> der_y
> + SAMPLE_D dst, address, sampler_view, sampler, der_x,
> der_y
> e.g.
> - SAMPLE_D TEMP[0], TEMP[1], RES[0], SAMP[0], TEMP[2],
> TEMP[3]
> + SAMPLE_D TEMP[0], TEMP[1], SVIEW[0], SAMP[0],
> TEMP[2], TEMP[3]
>
> .. opcode:: SAMPLE_L - SAMPLE_L is identical to the SAMPLE opcode
> except
> that the LOD is provided directly as a scalar value,
> representing no anisotropy. Source addresses A
> channel
> is used as the LOD.
> - SAMPLE_L dst, address, resource, sampler
> + SAMPLE_L dst, address, sampler_view, sampler
> e.g.
> - SAMPLE_L TEMP[0], TEMP[1], RES[0], SAMP[0]
> -
> + SAMPLE_L TEMP[0], TEMP[1], SVIEW[0], SAMP[0]
>
> .. opcode:: GATHER4 - Gathers the four texels to be used in a
> bi-linear
> filtering operation and packs them into a single
> register.
> @@ -1435,18 +1433,18 @@ instructions. If in doubt double check
> Direct3D documentation.
> the magnitude of the deltas are half a texel.
>
>
> -.. opcode:: RESINFO - query the dimensions of a given input buffer.
> +.. opcode:: SVIEWINFO - query the dimensions of a given sampler
> view.
> dst receives width, height, depth or array size and
> number of mipmap levels. The dst can have a writemask
> which will specify what info is the caller interested
> in.
> - RESINFO dst, src_mip_level, resource
> + SVIEWINFO dst, src_mip_level, sampler_view
> e.g.
> - RESINFO TEMP[0], TEMP[1].x, RES[0]
> + SVIEWINFO TEMP[0], TEMP[1].x, SVIEW[0]
> src_mip_level is an unsigned integer scalar. If it's
> out of range then returns 0 for width, height and
> depth/array size but the total number of mipmap is
> - still returned correctly for the given resource.
> + still returned correctly for the given sampler view.
> The returned width, height and depth values are for
> the mipmap level selected by the src_mip_level and
> are in the number of texels.
> @@ -1463,6 +1461,36 @@ instructions. If in doubt double check
> Direct3D documentation.
> not a render target, the result is 0.
>
>
> +.. _resourceopcodes:
> +
> +Resource Access Opcodes
> +^^^^^^^^^^^^^^^^^^^^^^^
> +
> +.. opcode:: LOAD - Fetch data from a shader resource
> +
> + Syntax: ``LOAD dst, resource, address``
> +
> + Example: ``LOAD TEMP[0], RES[0], TEMP[1]``
> +
> + Using the provided integer address, LOAD fetches data
> + from the specified buffer or texture without any
> + filtering.
> +
> + The 'address' is specified as a vector of unsigned
> + integers. If the 'address' is out of range the
> result
> + is unspecified.
> +
> + Only the first mipmap level of a resource can be read
> + from using this instruction.
> +
> + For 1D or 2D texture arrays, the array index is
> + provided as an unsigned integer in address.y or
> + address.z, respectively. address.yz are ignored for
> + buffers and 1D textures. address.z is ignored for 1D
> + texture arrays and 2D textures. address.w is always
> + ignored.
> +
> +
> Explanation of symbols used
> ------------------------------
>
> @@ -1690,12 +1718,28 @@ is a writable stencil reference value. Only
> the Y component is writable.
> This allows the fragment shader to change the fragments stencilref
> value.
>
>
> -Declaration Resource
> +Declaration Sampler View
> ^^^^^^^^^^^^^^^^^^^^^^^^
>
> + Follows Declaration token if file is TGSI_FILE_SAMPLER_VIEW.
> +
> + DCL SVIEW[#], resource, type(s)
> +
> + Declares a shader input sampler view and assigns it to a SVIEW[#]
> + register.
> +
> + resource can be one of BUFFER, 1D, 2D, 3D, 1DArray and 2DArray.
> +
> + type must be 1 or 4 entries (if specifying on a per-component
> + level) out of UNORM, SNORM, SINT, UINT and FLOAT.
> +
> +
> +Declaration Resource
> +^^^^^^^^^^^^^^^^^^^^
> +
> Follows Declaration token if file is TGSI_FILE_RESOURCE.
>
> - DCL RES[#], resource, type(s)
> + DCL RES[#], resource
>
> Declares a shader input resource and assigns it to a RES[#]
> register.
> @@ -1703,9 +1747,6 @@ Declaration Resource
> resource can be one of BUFFER, 1D, 2D, 3D, CUBE, 1DArray and
> 2DArray.
>
> - type must be 1 or 4 entries (if specifying on a per-component
> - level) out of UNORM, SNORM, SINT, UINT and FLOAT.
> -
>
> Properties
> ^^^^^^^^^^^^^^^^^^^^^^^^
> diff --git a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> index 82e2360..334c584 100644
> --- a/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> +++ b/src/gallium/drivers/nv50/codegen/nv50_ir_from_tgsi.cpp
> @@ -548,7 +548,7 @@ static nv50_ir::operation translateOpcode(uint
> opcode)
> NV50_IR_OPCODE_CASE(SAMPLE_D, TXD);
> NV50_IR_OPCODE_CASE(SAMPLE_L, TXL);
> NV50_IR_OPCODE_CASE(GATHER4, TXG);
> - NV50_IR_OPCODE_CASE(RESINFO, TXQ);
> + NV50_IR_OPCODE_CASE(SVIEWINFO, TXQ);
>
> NV50_IR_OPCODE_CASE(END, EXIT);
>
> @@ -597,8 +597,8 @@ public:
>
> int clipVertexOutput;
>
> - uint8_t *resourceTargets; // TGSI_TEXTURE_*
> - unsigned resourceCount;
> + uint8_t *samplerViewTargets; // TGSI_TEXTURE_*
> + unsigned samplerViewCount;
>
> private:
> int inferSysValDirection(unsigned sn) const;
> @@ -617,7 +617,7 @@ Source::Source(struct nv50_ir_prog_info *prog) :
> info(prog)
> if (prog->dbgFlags & NV50_IR_DEBUG_BASIC)
> tgsi_dump(tokens, 0);
>
> - resourceTargets = NULL;
> + samplerViewTargets = NULL;
>
> mainTempsInLMem = FALSE;
> }
> @@ -632,8 +632,8 @@ Source::~Source()
> if (info->immd.type)
> FREE(info->immd.type);
>
> - if (resourceTargets)
> - delete[] resourceTargets;
> + if (samplerViewTargets)
> + delete[] samplerViewTargets;
> }
>
> bool Source::scanSource()
> @@ -650,8 +650,8 @@ bool Source::scanSource()
>
> clipVertexOutput = -1;
>
> - resourceCount = scan.file_max[TGSI_FILE_RESOURCE] + 1;
> - resourceTargets = new uint8_t[resourceCount];
> + samplerViewCount = scan.file_max[TGSI_FILE_SAMPLER_VIEW] + 1;
> + samplerViewTargets = new uint8_t[samplerViewCount];
>
> info->immd.bufSize = 0;
> tempArrayCount = 0;
> @@ -874,9 +874,9 @@ bool Source::scanDeclaration(const struct
> tgsi_full_declaration *decl)
> info->sv[i].input = inferSysValDirection(sn);
> }
> break;
> - case TGSI_FILE_RESOURCE:
> + case TGSI_FILE_SAMPLER_VIEW:
> for (i = first; i <= last; ++i)
> - resourceTargets[i] = decl->Resource.Resource;
> + samplerViewTargets[i] = decl->SamplerView.Resource;
> break;
> case TGSI_FILE_IMMEDIATE_ARRAY:
> {
> @@ -1000,13 +1000,15 @@ bool Source::scanInstruction(const struct
> tgsi_full_instruction *inst)
> nv50_ir::TexInstruction::Target
> Instruction::getTexture(const tgsi::Source *code, int s) const
> {
> - if (insn->Instruction.Texture) {
> - return translateTexture(insn->Texture.Texture);
> - } else {
> + switch (getSrc(s).getFile()) {
> + case TGSI_FILE_SAMPLER_VIEW: {
> // XXX: indirect access
> unsigned int r = getSrc(s).getIndex(0);
> - assert(r < code->resourceCount);
> - return translateTexture(code->resourceTargets[r]);
> + assert(r < code->samplerViewCount);
> + return translateTexture(code->samplerViewTargets[r]);
> + }
> + default:
> + return translateTexture(insn->Texture.Texture);
> }
> }
>
> @@ -2042,7 +2044,7 @@ Converter::handleInstruction(const struct
> tgsi_full_instruction *insn)
> handleTXF(dst0, 1);
> break;
> case TGSI_OPCODE_TXQ:
> - case TGSI_OPCODE_RESINFO:
> + case TGSI_OPCODE_SVIEWINFO:
> handleTXQ(dst0, TXQ_DIMS);
> break;
> case TGSI_OPCODE_F2I:
> diff --git a/src/gallium/drivers/r600/r600_shader.c
> b/src/gallium/drivers/r600/r600_shader.c
> index 5e22b35..84b580b 100644
> --- a/src/gallium/drivers/r600/r600_shader.c
> +++ b/src/gallium/drivers/r600/r600_shader.c
> @@ -5168,16 +5168,16 @@ static struct r600_shader_tgsi_instruction
> r600_shader_tgsi_instruction[] = {
> {TGSI_OPCODE_CASE, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_DEFAULT, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_ENDSWITCH, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> - {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_UARL, 0, V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT,
> tgsi_r600_arl},
> @@ -5342,16 +5342,16 @@ static struct r600_shader_tgsi_instruction
> eg_shader_tgsi_instruction[] = {
> {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> - {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_UARL, 0,
> EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
> @@ -5516,16 +5516,16 @@ static struct r600_shader_tgsi_instruction
> cm_shader_tgsi_instruction[] = {
> {TGSI_OPCODE_CASE, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_DEFAULT, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> {TGSI_OPCODE_ENDSWITCH, 0, EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_NOP,
> tgsi_unsupported},
> - {TGSI_OPCODE_LOAD, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_LOAD_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SAMPLE_I_MS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_B, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_C_LZ, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_D, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_L, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_GATHER4, 0, 0, tgsi_unsupported},
> - {TGSI_OPCODE_RESINFO, 0, 0, tgsi_unsupported},
> + {TGSI_OPCODE_SVIEWINFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_POS, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_SAMPLE_INFO, 0, 0, tgsi_unsupported},
> {TGSI_OPCODE_UARL, 0,
> EG_V_SQ_ALU_WORD1_OP2_SQ_OP2_INST_MOVA_INT, tgsi_eg_arl},
> diff --git a/src/gallium/include/pipe/p_shader_tokens.h
> b/src/gallium/include/pipe/p_shader_tokens.h
> index 9d08fde..cc850db 100644
> --- a/src/gallium/include/pipe/p_shader_tokens.h
> +++ b/src/gallium/include/pipe/p_shader_tokens.h
> @@ -76,6 +76,7 @@ enum tgsi_file_type {
> TGSI_FILE_IMMEDIATE_ARRAY =10,
> TGSI_FILE_TEMPORARY_ARRAY =11,
> TGSI_FILE_RESOURCE =12,
> + TGSI_FILE_SAMPLER_VIEW =13,
> TGSI_FILE_COUNT /**< how many TGSI_FILE_ types */
> };
>
> @@ -160,6 +161,11 @@ struct tgsi_declaration_semantic
>
> struct tgsi_declaration_resource {
> unsigned Resource : 8; /**< one of TGSI_TEXTURE_ */
> + unsigned Padding : 24;
> +};
> +
> +struct tgsi_declaration_sampler_view {
> + unsigned Resource : 8; /**< one of TGSI_TEXTURE_ */
> unsigned ReturnTypeX : 6; /**< one of enum pipe_type */
> unsigned ReturnTypeY : 6; /**< one of enum pipe_type */
> unsigned ReturnTypeZ : 6; /**< one of enum pipe_type */
> @@ -372,16 +378,16 @@ struct tgsi_property_data {
> #define TGSI_OPCODE_ENDSWITCH 144
>
> /* resource related opcodes */
> -#define TGSI_OPCODE_LOAD 145
> -#define TGSI_OPCODE_LOAD_MS 146
> -#define TGSI_OPCODE_SAMPLE 147
> +#define TGSI_OPCODE_SAMPLE 145
> +#define TGSI_OPCODE_SAMPLE_I 146
> +#define TGSI_OPCODE_SAMPLE_I_MS 147
> #define TGSI_OPCODE_SAMPLE_B 148
> #define TGSI_OPCODE_SAMPLE_C 149
> #define TGSI_OPCODE_SAMPLE_C_LZ 150
> #define TGSI_OPCODE_SAMPLE_D 151
> #define TGSI_OPCODE_SAMPLE_L 152
> #define TGSI_OPCODE_GATHER4 153
> -#define TGSI_OPCODE_RESINFO 154
> +#define TGSI_OPCODE_SVIEWINFO 154
> #define TGSI_OPCODE_SAMPLE_POS 155
> #define TGSI_OPCODE_SAMPLE_INFO 156
>
> @@ -390,7 +396,9 @@ struct tgsi_property_data {
> #define TGSI_OPCODE_IABS 159
> #define TGSI_OPCODE_ISSG 160
>
> -#define TGSI_OPCODE_LAST 161
> +#define TGSI_OPCODE_LOAD 161
> +
> +#define TGSI_OPCODE_LAST 162
>
> #define TGSI_SAT_NONE 0 /* do not saturate */
> #define TGSI_SAT_ZERO_ONE 1 /* clamp to [0,1] */
> diff --git a/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
> b/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
> index 392fd3e..aaa46f1 100644
> --- a/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
> +++ b/src/gallium/state_trackers/d3d1x/gd3d1x/sm4_to_tgsi.cpp
> @@ -446,7 +446,7 @@ struct sm4_to_tgsi_converter
> break;
> case SM4_OPCODE_RESINFO:
> // TODO: return type
> - ureg_RESINFO(ureg, _dst(), _src(1),
> resources[_idx(SM4_FILE_RESOURCE, 2)]);
> + ureg_SVIEWINFO(ureg, _dst(), _src(1),
> resources[_idx(SM4_FILE_RESOURCE, 2)]);
> break;
> // TODO: sample index, texture offset
> case SM4_OPCODE_LD: // dst, coord_int, res; mipmap level in last
> coord_int arg
> @@ -750,11 +750,12 @@ next:;
> }
> if(resources.size() <= (unsigned)idx)
> resources.resize(idx + 1);
> - resources[idx] = ureg_DECL_resource(ureg, idx,
> targets[idx].first,
> - res_return_type(dcl.rrt.x),
> - res_return_type(dcl.rrt.y),
> - res_return_type(dcl.rrt.z),
> - res_return_type(dcl.rrt.w));
> + resources[idx] = ureg_DECL_sampler_view(
> + ureg, idx, targets[idx].first,
> + res_return_type(dcl.rrt.x),
> + res_return_type(dcl.rrt.y),
> + res_return_type(dcl.rrt.z),
> + res_return_type(dcl.rrt.w));
> break;
> case SM4_OPCODE_DCL_SAMPLER:
> check(idx >= 0);
> --
> 1.7.10
>
>
More information about the mesa-dev
mailing list