[PATCH 4/5] d3dcompiler: Store the shader version using separate integer fields.

Zebediah Figura z.figura12 at gmail.com
Thu Mar 19 18:07:14 CDT 2020


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/d3dcompiler_43/asmparser.c           | 78 +++++++++++++----------
 dlls/d3dcompiler_43/asmshader.y           |  8 +--
 dlls/d3dcompiler_43/bytecodewriter.c      | 19 +++++-
 dlls/d3dcompiler_43/d3dcompiler_private.h |  5 +-
 4 files changed, 67 insertions(+), 43 deletions(-)

diff --git a/dlls/d3dcompiler_43/asmparser.c b/dlls/d3dcompiler_43/asmparser.c
index 16e86d94dab..7a901576181 100644
--- a/dlls/d3dcompiler_43/asmparser.c
+++ b/dlls/d3dcompiler_43/asmparser.c
@@ -125,10 +125,9 @@ static void asmparser_dcl_input(struct asm_parser *This, DWORD usage, DWORD num,
     struct instruction instr;
 
     if(!This->shader) return;
-    if(mod != 0 &&
-       (This->shader->version != BWRITERPS_VERSION(3, 0) ||
-        (mod != BWRITERSPDM_MSAMPCENTROID &&
-         mod != BWRITERSPDM_PARTIALPRECISION))) {
+    if (mod && (This->shader->type != ST_PIXEL || This->shader->major_version != 3
+            || (mod != BWRITERSPDM_MSAMPCENTROID && mod != BWRITERSPDM_PARTIALPRECISION)))
+    {
         asmparser_message(This, "Line %u: Unsupported modifier in dcl instruction\n", This->line_no);
         set_parse_status(&This->status, PARSE_ERR);
         return;
@@ -170,10 +169,9 @@ static void asmparser_dcl_sampler(struct asm_parser *This, DWORD samptype,
                                   DWORD mod, DWORD regnum,
                                   unsigned int line_no) {
     if(!This->shader) return;
-    if(mod != 0 &&
-       (This->shader->version != BWRITERPS_VERSION(3, 0) ||
-        (mod != BWRITERSPDM_MSAMPCENTROID &&
-         mod != BWRITERSPDM_PARTIALPRECISION))) {
+    if (mod && (This->shader->type != ST_PIXEL || This->shader->major_version != 3
+            || (mod != BWRITERSPDM_MSAMPCENTROID && mod != BWRITERSPDM_PARTIALPRECISION)))
+    {
         asmparser_message(This, "Line %u: Unsupported modifier in dcl instruction\n", This->line_no);
         set_parse_status(&This->status, PARSE_ERR);
         return;
@@ -503,6 +501,7 @@ static void asmparser_instr(struct asm_parser *This, DWORD opcode, DWORD mod, DW
         enum bwriter_comparison_type comp, const struct shader_reg *dst,
         const struct src_regs *srcs, int expectednsrcs)
 {
+    struct bwriter_shader *shader = This->shader;
     struct instruction *instr;
     unsigned int i;
     BOOL firstreg = TRUE;
@@ -529,8 +528,8 @@ static void asmparser_instr(struct asm_parser *This, DWORD opcode, DWORD mod, DW
     switch(opcode) {
         case BWRITERSIO_SINCOS:
             /* The syntax changes between vs 2 and the other shader versions */
-            if(This->shader->version == BWRITERVS_VERSION(2, 0) ||
-               This->shader->version == BWRITERVS_VERSION(2, 1)) {
+            if (This->shader->type == ST_VERTEX && This->shader->major_version == 2)
+            {
                 asmparser_sincos(This, mod, shift, dst, srcs);
                 return;
             }
@@ -538,22 +537,20 @@ static void asmparser_instr(struct asm_parser *This, DWORD opcode, DWORD mod, DW
             break;
         case BWRITERSIO_TEXCOORD:
             /* texcoord/texcrd are two instructions present only in PS <= 1.3 and PS 1.4 respectively */
-            if(This->shader->version == BWRITERPS_VERSION(1, 4))
+            if (shader->type == ST_PIXEL && shader->major_version == 1 && shader->minor_version == 4)
                 asmparser_texcrd(This, mod, shift, dst, srcs);
-            else asmparser_texcoord(This, mod, shift, dst, srcs);
+            else
+                asmparser_texcoord(This, mod, shift, dst, srcs);
             return;
         case BWRITERSIO_TEX:
             /* this encodes both the tex PS 1.x instruction and the
                texld 1.4/2.0+ instruction */
-            if(This->shader->version == BWRITERPS_VERSION(1, 0) ||
-               This->shader->version == BWRITERPS_VERSION(1, 1) ||
-               This->shader->version == BWRITERPS_VERSION(1, 2) ||
-               This->shader->version == BWRITERPS_VERSION(1, 3)) {
-                asmparser_tex(This, mod, shift, dst);
-                return;
-            }
-            else if(This->shader->version == BWRITERPS_VERSION(1, 4)) {
-                asmparser_texld14(This, mod, shift, dst, srcs);
+            if (shader->type == ST_PIXEL && shader->major_version == 1)
+            {
+                if (shader->minor_version < 4)
+                    asmparser_tex(This, mod, shift, dst);
+                else
+                    asmparser_texld14(This, mod, shift, dst, srcs);
                 return;
             }
             /* else fallback to the standard behavior */
@@ -1355,7 +1352,8 @@ void create_vs10_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_VERTEX;
-    ret->shader->version = BWRITERVS_VERSION(1, 0);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_vs_1;
     gen_oldvs_output(ret->shader);
 }
@@ -1371,7 +1369,8 @@ void create_vs11_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_VERTEX;
-    ret->shader->version = BWRITERVS_VERSION(1, 1);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 1;
     ret->funcs = &parser_vs_1;
     gen_oldvs_output(ret->shader);
 }
@@ -1387,7 +1386,8 @@ void create_vs20_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_VERTEX;
-    ret->shader->version = BWRITERVS_VERSION(2, 0);
+    ret->shader->major_version = 2;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_vs_2;
     gen_oldvs_output(ret->shader);
 }
@@ -1403,7 +1403,8 @@ void create_vs2x_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_VERTEX;
-    ret->shader->version = BWRITERVS_VERSION(2, 1);
+    ret->shader->major_version = 2;
+    ret->shader->minor_version = 1;
     ret->funcs = &parser_vs_2;
     gen_oldvs_output(ret->shader);
 }
@@ -1419,7 +1420,8 @@ void create_vs30_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_VERTEX;
-    ret->shader->version = BWRITERVS_VERSION(3, 0);
+    ret->shader->major_version = 3;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_vs_3;
 }
 
@@ -1434,7 +1436,8 @@ void create_ps10_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(1, 0);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_ps_1_0123;
     gen_oldps_input(ret->shader, 4);
 }
@@ -1450,7 +1453,8 @@ void create_ps11_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(1, 1);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 1;
     ret->funcs = &parser_ps_1_0123;
     gen_oldps_input(ret->shader, 4);
 }
@@ -1466,7 +1470,8 @@ void create_ps12_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(1, 2);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 2;
     ret->funcs = &parser_ps_1_0123;
     gen_oldps_input(ret->shader, 4);
 }
@@ -1482,7 +1487,8 @@ void create_ps13_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(1, 3);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 3;
     ret->funcs = &parser_ps_1_0123;
     gen_oldps_input(ret->shader, 4);
 }
@@ -1498,7 +1504,8 @@ void create_ps14_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(1, 4);
+    ret->shader->major_version = 1;
+    ret->shader->minor_version = 4;
     ret->funcs = &parser_ps_1_4;
     gen_oldps_input(ret->shader, 6);
 }
@@ -1514,7 +1521,8 @@ void create_ps20_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(2, 0);
+    ret->shader->major_version = 2;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_ps_2;
     gen_oldps_input(ret->shader, 8);
 }
@@ -1530,7 +1538,8 @@ void create_ps2x_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(2, 1);
+    ret->shader->major_version = 2;
+    ret->shader->minor_version = 1;
     ret->funcs = &parser_ps_2_x;
     gen_oldps_input(ret->shader, 8);
 }
@@ -1546,6 +1555,7 @@ void create_ps30_parser(struct asm_parser *ret) {
     }
 
     ret->shader->type = ST_PIXEL;
-    ret->shader->version = BWRITERPS_VERSION(3, 0);
+    ret->shader->major_version = 3;
+    ret->shader->minor_version = 0;
     ret->funcs = &parser_ps_3;
 }
diff --git a/dlls/d3dcompiler_43/asmshader.y b/dlls/d3dcompiler_43/asmshader.y
index 1b7a07313fc..9e0fec618cd 100644
--- a/dlls/d3dcompiler_43/asmshader.y
+++ b/dlls/d3dcompiler_43/asmshader.y
@@ -591,8 +591,8 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                                       asm_ctx.line_no);
                                     set_parse_status(&asm_ctx.status,  PARSE_ERR);
                                 }
-                                if(asm_ctx.shader->version == BWRITERPS_VERSION(2, 0) ||
-                                    asm_ctx.shader->version == BWRITERPS_VERSION(2, 1)) {
+                                if (asm_ctx.shader->type == ST_PIXEL && asm_ctx.shader->major_version == 2)
+                                {
                                     asmparser_message(&asm_ctx, "Line %u: Declaration not supported in PS 2\n",
                                                       asm_ctx.line_no);
                                     set_parse_status(&asm_ctx.status,  PARSE_ERR);
@@ -614,8 +614,8 @@ instruction:          INSTR_ADD omods dreg ',' sregs
                                                       asm_ctx.line_no);
                                     set_parse_status(&asm_ctx.status,  PARSE_ERR);
                                 }
-                                if(asm_ctx.shader->version == BWRITERPS_VERSION(2, 0) ||
-                                    asm_ctx.shader->version == BWRITERPS_VERSION(2, 1)) {
+                                if (asm_ctx.shader->type == ST_PIXEL && asm_ctx.shader->major_version == 2)
+                                {
                                     asmparser_message(&asm_ctx, "Line %u: Declaration not supported in PS 2\n",
                                                       asm_ctx.line_no);
                                     set_parse_status(&asm_ctx.status,  PARSE_ERR);
diff --git a/dlls/d3dcompiler_43/bytecodewriter.c b/dlls/d3dcompiler_43/bytecodewriter.c
index 5366fa589b1..8b016cd6201 100644
--- a/dlls/d3dcompiler_43/bytecodewriter.c
+++ b/dlls/d3dcompiler_43/bytecodewriter.c
@@ -340,6 +340,21 @@ static void put_dword(struct bytecode_buffer *buffer, DWORD value) {
 }
 
 /* bwriter -> d3d9 conversion functions. */
+
+static DWORD sm1_version(const struct bwriter_shader *shader)
+{
+    switch (shader->type)
+    {
+    case ST_VERTEX:
+        return D3DVS_VERSION(shader->major_version, shader->minor_version);
+    case ST_PIXEL:
+        return D3DPS_VERSION(shader->major_version, shader->minor_version);
+    default:
+        ERR("Invalid shader type %#x.\n", shader->type);
+        return 0;
+    }
+}
+
 static DWORD d3d9_swizzle(DWORD bwriter_swizzle)
 {
     DWORD ret = 0;
@@ -2421,7 +2436,7 @@ HRESULT shader_write_bytecode(const struct bwriter_shader *shader, DWORD **resul
         ERR("NULL shader structure, aborting\n");
         return E_FAIL;
     }
-    writer = create_writer(shader->version);
+    writer = create_writer(sm1_version(shader));
     *result = NULL;
 
     if(!writer) {
@@ -2439,7 +2454,7 @@ HRESULT shader_write_bytecode(const struct bwriter_shader *shader, DWORD **resul
     }
 
     /* Write shader type and version */
-    put_dword(buffer, shader->version);
+    put_dword(buffer, sm1_version(shader));
 
     writer->funcs->header(writer, shader, buffer);
     if(FAILED(writer->state)) {
diff --git a/dlls/d3dcompiler_43/d3dcompiler_private.h b/dlls/d3dcompiler_43/d3dcompiler_private.h
index 51cfc395524..9596c2b6b1e 100644
--- a/dlls/d3dcompiler_43/d3dcompiler_private.h
+++ b/dlls/d3dcompiler_43/d3dcompiler_private.h
@@ -35,6 +35,7 @@
 #include "d3dcompiler.h"
 
 #include <assert.h>
+#include <stdint.h>
 
 /*
  * This doesn't belong here, but for some functions it is possible to return that value,
@@ -118,9 +119,7 @@ struct samplerdecl {
 #define INSTRARRAY_INITIAL_SIZE 8
 struct bwriter_shader {
     enum shader_type        type;
-
-    /* Shader version selected */
-    DWORD                   version;
+    uint8_t major_version, minor_version;
 
     /* Local constants. Every constant that is not defined below is loaded from
      * the global constant set at shader runtime
-- 
2.25.1




More information about the wine-devel mailing list