glthread: add support for TexParameteri and SamplerParameteri functions
authorMarek Olšák <marek.olsak@amd.com>
Thu, 20 Feb 2020 01:28:01 +0000 (20:28 -0500)
committerMarge Bot <eric+marge@anholt.net>
Fri, 6 Mar 2020 01:06:14 +0000 (01:06 +0000)
It's straightfoward except that I had to hack the python scripts to add
"marshal_count", which behaves just like "count" except that "variable_param"
is ignored. ("variable_param" changes the behavior of "count", which I don't
want)

Reviewed-by: Timothy Arceri <tarceri@itsqueeze.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/3948>

12 files changed:
src/mapi/glapi/gen/ARB_direct_state_access.xml
src/mapi/glapi/gen/ARB_sampler_objects.xml
src/mapi/glapi/gen/EXT_direct_state_access.xml
src/mapi/glapi/gen/GL3x.xml
src/mapi/glapi/gen/OES_fixed_point.xml
src/mapi/glapi/gen/gl_API.dtd
src/mapi/glapi/gen/gl_API.xml
src/mapi/glapi/gen/gl_XML.py
src/mapi/glapi/gen/gl_and_es_API.xml
src/mapi/glapi/gen/gl_marshal.py
src/mapi/glapi/gen/marshal_XML.py
src/mesa/main/marshal.h

index 42ed70a76336a3c883ae3992ce477604badfd075..c652a412aa721b334e5f85eafe145d6a15ef4c57 100644 (file)
    <function name="TextureParameterfv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
    <function name="TextureParameterfv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
-      <param name="param" type="const GLfloat *" />
+      <param name="param" type="const GLfloat *" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="TextureParameteri">
    </function>
 
    <function name="TextureParameteri">
    <function name="TextureParameterIiv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
    <function name="TextureParameterIiv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLint *" />
+      <param name="params" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="TextureParameterIuiv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
    </function>
 
    <function name="TextureParameterIuiv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLuint *" />
+      <param name="params" type="const GLuint *" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="TextureParameteriv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
    </function>
 
    <function name="TextureParameteriv">
       <param name="texture" type="GLuint" />
       <param name="pname" type="GLenum" />
-      <param name="param" type="const GLint *" />
+      <param name="param" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="GenerateTextureMipmap" no_error="true">
    </function>
 
    <function name="GenerateTextureMipmap" no_error="true">
index b8fdd125e2462894c5537816e311a3da2c250824..1e628124c7f858649fdfd6e6ec4b0cd10c287b21 100644 (file)
     <function name="SamplerParameteriv" es2="3.0">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
     <function name="SamplerParameteriv" es2="3.0">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
-      <param name="params" type="const GLint *"/>
+      <param name="params" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <function name="SamplerParameterfv" es2="3.0">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
     </function>
 
     <function name="SamplerParameterfv" es2="3.0">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
-      <param name="params" type="const GLfloat *"/>
+      <param name="params" type="const GLfloat *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <function name="SamplerParameterIiv" es2="3.2">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
     </function>
 
     <function name="SamplerParameterIiv" es2="3.2">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
-      <param name="params" type="const GLint *"/>
+      <param name="params" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <function name="SamplerParameterIuiv" es2="3.2">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
     </function>
 
     <function name="SamplerParameterIuiv" es2="3.2">
       <param name="sampler" type="GLuint"/>
       <param name="pname" type="GLenum"/>
-      <param name="params" type="const GLuint *"/>
+      <param name="params" type="const GLuint *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <function name="GetSamplerParameteriv" es2="3.0">
     </function>
 
     <function name="GetSamplerParameteriv" es2="3.0">
index 0d29282d2933f9a9d9b09333c5182cc0a0a43156..b1cda7803619599d523bce4d61d5ad353b51e9a8 100644 (file)
        <param name="texture" type="GLuint" />
        <param name="target" type="GLenum" />
        <param name="pname" type="GLenum" />
        <param name="texture" type="GLuint" />
        <param name="target" type="GLenum" />
        <param name="pname" type="GLenum" />
-       <param name="params" type="const GLint *" />
+       <param name="params" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <function name="TextureParameterfEXT">
     </function>
 
     <function name="TextureParameterfEXT">
        <param name="texture" type="GLuint" />
        <param name="target" type="GLenum" />
        <param name="pname" type="GLenum" />
        <param name="texture" type="GLuint" />
        <param name="target" type="GLenum" />
        <param name="pname" type="GLenum" />
-       <param name="params" type="const float *" />
+       <param name="params" type="const float *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
    <function name="TextureImage1DEXT">
     </function>
 
    <function name="TextureImage1DEXT">
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="param" type="const GLint*" />
+      <param name="param" type="const GLint*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="MultiTexParameterfEXT">
    </function>
 
    <function name="MultiTexParameterfEXT">
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="param" type="const GLfloat*" />
+      <param name="param" type="const GLfloat*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="GetMultiTexParameterivEXT">
    </function>
 
    <function name="GetMultiTexParameterivEXT">
       <param name="texture" type="GLuint" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
       <param name="texture" type="GLuint" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLint*" />
+      <param name="params" type="const GLint*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="TextureParameterIuivEXT">
       <param name="texture" type="GLuint" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
    </function>
 
    <function name="TextureParameterIuivEXT">
       <param name="texture" type="GLuint" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLuint*" />
+      <param name="params" type="const GLuint*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="GetTextureParameterIivEXT">
    </function>
 
    <function name="GetTextureParameterIivEXT">
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLint*" />
+      <param name="params" type="const GLint*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="MultiTexParameterIuivEXT">
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
    </function>
 
    <function name="MultiTexParameterIuivEXT">
       <param name="texunit" type="GLenum" />
       <param name="target" type="GLenum" />
       <param name="pname" type="GLenum" />
-      <param name="params" type="const GLuint*" />
+      <param name="params" type="const GLuint*" count="_mesa_tex_param_enum_to_count(pname)"/>
    </function>
 
    <function name="GetMultiTexParameterIivEXT">
    </function>
 
    <function name="GetMultiTexParameterIivEXT">
index 5608353cb28756181d5cf4f2714bec804f455367..4bf7c1325606c145f07f102404cbaa02d6b66150 100644 (file)
   <function name="TexParameterIiv" es2="3.2">
     <param name="target" type="GLenum"/>
     <param name="pname" type="GLenum"/>
   <function name="TexParameterIiv" es2="3.2">
     <param name="target" type="GLenum"/>
     <param name="pname" type="GLenum"/>
-    <param name="params" type="const GLint *"/>
+    <param name="params" type="const GLint *" count="_mesa_tex_param_enum_to_count(pname)"/>
   </function>
 
   <function name="TexParameterIuiv" es2="3.2">
     <param name="target" type="GLenum"/>
     <param name="pname" type="GLenum"/>
   </function>
 
   <function name="TexParameterIuiv" es2="3.2">
     <param name="target" type="GLenum"/>
     <param name="pname" type="GLenum"/>
-    <param name="params" type="const GLuint *"/>
+    <param name="params" type="const GLuint *" count="_mesa_tex_param_enum_to_count(pname)"/>
   </function>
 
   <function name="GetTexParameterIiv" es2="3.2">
   </function>
 
   <function name="GetTexParameterIiv" es2="3.2">
index edd0acdba6f9aed866d716f840221df6bdc90eff..5b4c48a7824041afd29aad6bb8195830949248fb 100644 (file)
     <function name="TexParameterxvOES" es1="1.0" alias="TexParameterxv">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
     <function name="TexParameterxvOES" es1="1.0" alias="TexParameterxv">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
-        <param name="params" type="const GLfixed *"/>
+        <param name="params" type="const GLfixed *" count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <!-- texgen -->
     </function>
 
     <!-- texgen -->
index b464250777c08c3807836f12655a2c4ba2feefc9..1f10e1e012d2800c43ccfa96a8db38507b47ad11 100644 (file)
@@ -41,6 +41,7 @@
                    desktop             (true | false) "true"
                    marshal             NMTOKEN #IMPLIED
                    marshal_fail        CDATA #IMPLIED>
                    desktop             (true | false) "true"
                    marshal             NMTOKEN #IMPLIED
                    marshal_fail        CDATA #IMPLIED>
+                   marshal_count       CDATA #IMPLIED>
 <!ATTLIST size     name                NMTOKEN #REQUIRED
                    count               NMTOKEN #IMPLIED
                    mode                (get | set) "set">
 <!ATTLIST size     name                NMTOKEN #REQUIRED
                    count               NMTOKEN #IMPLIED
                    mode                (get | set) "set">
@@ -134,6 +135,8 @@ param:
         to switch back to the Mesa implementation and call it directly.  Used
         to disable glthread for GL compatibility interactions that we don't
         want to track state for.
         to switch back to the Mesa implementation and call it directly.  Used
         to disable glthread for GL compatibility interactions that we don't
         want to track state for.
+     marshal_count - same as count, but variable_param is ignored. Used by
+        glthread.
 
 glx:
      rop - Opcode value for "render" commands
 
 glx:
      rop - Opcode value for "render" commands
index a33e82ad53d171a7a62a49a7b425b284f97f2aff..151148060b7042484f0023f6b467862458da684a 100644 (file)
     <function name="TexParameterfv" es1="1.1" es2="2.0">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
     <function name="TexParameterfv" es1="1.1" es2="2.0">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
-        <param name="params" type="const GLfloat *" variable_param="pname"/>
+        <param name="params" type="const GLfloat *" variable_param="pname"
+               marshal_count="_mesa_tex_param_enum_to_count(pname)"/>
         <glx rop="106"/>
     </function>
 
         <glx rop="106"/>
     </function>
 
     <function name="TexParameteriv" es1="1.1" es2="2.0">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
     <function name="TexParameteriv" es1="1.1" es2="2.0">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
-        <param name="params" type="const GLint *" variable_param="pname"/>
+        <param name="params" type="const GLint *" variable_param="pname"
+               marshal_count="_mesa_tex_param_enum_to_count(pname)"/>
         <glx rop="108"/>
     </function>
 
         <glx rop="108"/>
     </function>
 
index 5b5f6e23b0a9159cedd6cad1a66f7b0f8c21463e..7f1edbde9dd7e48748d454a9a0fb07c4e6f3c919 100644 (file)
@@ -431,6 +431,7 @@ class gl_parameter(object):
             self.count = 0
             self.counter = c
 
             self.count = 0
             self.counter = c
 
+        self.marshal_count = element.get("marshal_count")
         self.count_scale = int(element.get( "count_scale", "1" ))
 
         elements = (count * self.count_scale)
         self.count_scale = int(element.get( "count_scale", "1" ))
 
         elements = (count * self.count_scale)
@@ -493,7 +494,7 @@ class gl_parameter(object):
 
 
     def is_variable_length(self):
 
 
     def is_variable_length(self):
-        return len(self.count_parameter_list) or self.counter
+        return len(self.count_parameter_list) or self.counter or self.marshal_count
 
 
     def is_64_bit(self):
 
 
     def is_64_bit(self):
@@ -564,7 +565,7 @@ class gl_parameter(object):
         return c
 
 
         return c
 
 
-    def size_string(self, use_parens = 1):
+    def size_string(self, use_parens = 1, marshal = 0):
         base_size_str = ""
 
         count = self.get_element_count()
         base_size_str = ""
 
         count = self.get_element_count()
@@ -573,10 +574,12 @@ class gl_parameter(object):
 
         base_size_str += "sizeof(%s)" % ( self.get_base_type_string() )
 
 
         base_size_str += "sizeof(%s)" % ( self.get_base_type_string() )
 
-        if self.counter or self.count_parameter_list:
+        if self.counter or self.count_parameter_list or (self.marshal_count and marshal):
             list = [ "compsize" ]
 
             list = [ "compsize" ]
 
-            if self.counter and self.count_parameter_list:
+            if self.marshal_count and marshal:
+                list = [ self.marshal_count ]
+            elif self.counter and self.count_parameter_list:
                 list.append( self.counter )
             elif self.counter:
                 list = [ self.counter ]
                 list.append( self.counter )
             elif self.counter:
                 list = [ self.counter ]
index fc152841028fd0bcec9f6c3567c55c7ed33f0330..2f47edf69149fb5b78ded7bfd1e7e0828909f270 100644 (file)
     <function name="TexParameterxv" es1="1.1" desktop="false">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
     <function name="TexParameterxv" es1="1.1" desktop="false">
         <param name="target" type="GLenum"/>
         <param name="pname" type="GLenum"/>
-        <param name="params" type="const GLfixed *" variable_param="pname"/>
+        <param name="params" type="const GLfixed *" variable_param="pname"
+               marshal_count="_mesa_tex_param_enum_to_count(pname)"/>
     </function>
 
     <!-- from GL_OES_single_precision -->
     </function>
 
     <!-- from GL_OES_single_precision -->
index 476f54d6aa6fca3b7b5d99a5f6dc88150fa8e3b4..a421c95dcfe2d3f63c0cb973c5c2af5e2c9b0bf5 100644 (file)
@@ -156,12 +156,12 @@ class PrintCode(gl_XML.gl_print_base):
                 if p.count_scale != 1:
                     out(('/* Next {0} bytes are '
                          '{1} {2}[{3}][{4}] */').format(
                 if p.count_scale != 1:
                     out(('/* Next {0} bytes are '
                          '{1} {2}[{3}][{4}] */').format(
-                            p.size_string(), p.get_base_type_string(),
+                            p.size_string(marshal = 1), p.get_base_type_string(),
                             p.name, p.counter, p.count_scale))
                 else:
                     out(('/* Next {0} bytes are '
                          '{1} {2}[{3}] */').format(
                             p.name, p.counter, p.count_scale))
                 else:
                     out(('/* Next {0} bytes are '
                          '{1} {2}[{3}] */').format(
-                            p.size_string(), p.get_base_type_string(),
+                            p.size_string(marshal = 1), p.get_base_type_string(),
                             p.name, p.counter))
         out('};')
 
                             p.name, p.counter))
         out('};')
 
@@ -203,9 +203,9 @@ class PrintCode(gl_XML.gl_print_base):
                         if i < len(func.variable_params):
                             out('else')
                             with indent():
                         if i < len(func.variable_params):
                             out('else')
                             with indent():
-                                out('variable_data += {0};'.format(p.size_string(False)))
+                                out('variable_data += {0};'.format(p.size_string(False, marshal = 1)))
                     elif i < len(func.variable_params):
                     elif i < len(func.variable_params):
-                        out('variable_data += {0};'.format(p.size_string(False)))
+                        out('variable_data += {0};'.format(p.size_string(False, marshal = 1)))
                     i += 1
 
             self.print_sync_call(func)
                     i += 1
 
             self.print_sync_call(func)
@@ -240,7 +240,7 @@ class PrintCode(gl_XML.gl_print_base):
         with indent():
             out('GET_CURRENT_CONTEXT(ctx);')
             for p in func.variable_params:
         with indent():
             out('GET_CURRENT_CONTEXT(ctx);')
             for p in func.variable_params:
-                out('int {0}_size = {1};'.format(p.name, p.size_string()))
+                out('int {0}_size = {1};'.format(p.name, p.size_string(marshal = 1)))
 
             struct = 'struct marshal_cmd_{0}'.format(func.name)
             size_terms = ['sizeof({0})'.format(struct)]
 
             struct = 'struct marshal_cmd_{0}'.format(func.name)
             size_terms = ['sizeof({0})'.format(struct)]
index 5b682c519657acd57dffd893d6d34e670ba48bb4..f6103b9e8fec5347d18dd3c89af8660cc38efd1f 100644 (file)
@@ -77,11 +77,11 @@ class marshal_function(gl_XML.gl_function):
         for p in self.parameters:
             if p.is_output:
                 return 'sync'
         for p in self.parameters:
             if p.is_output:
                 return 'sync'
-            if (p.is_pointer() and not (p.count or p.counter)
+            if (p.is_pointer() and not (p.count or p.counter or p.marshal_count)
                 and not (self.marshal == 'draw'
                          and (p.name == 'indices' or p.name == 'indirect'))):
                 return 'sync'
                 and not (self.marshal == 'draw'
                          and (p.name == 'indices' or p.name == 'indirect'))):
                 return 'sync'
-            if p.count_parameter_list:
+            if p.count_parameter_list and not p.marshal_count:
                 # Parameter size is determined by enums; haven't
                 # written logic to handle this yet.  TODO: fix.
                 return 'sync'
                 # Parameter size is determined by enums; haven't
                 # written logic to handle this yet.  TODO: fix.
                 return 'sync'
index 676050319f1d8485fa1c40e743b5cd3990b27182..15551668fc6fbd8ed437615eab765bcbbee83ffd 100644 (file)
@@ -261,4 +261,42 @@ _mesa_buffer_enum_to_count(GLenum buffer)
    }
 }
 
    }
 }
 
+static inline unsigned
+_mesa_tex_param_enum_to_count(GLenum pname)
+{
+   switch (pname) {
+   case GL_TEXTURE_MIN_FILTER:
+   case GL_TEXTURE_MAG_FILTER:
+   case GL_TEXTURE_WRAP_S:
+   case GL_TEXTURE_WRAP_T:
+   case GL_TEXTURE_WRAP_R:
+   case GL_TEXTURE_BASE_LEVEL:
+   case GL_TEXTURE_MAX_LEVEL:
+   case GL_GENERATE_MIPMAP_SGIS:
+   case GL_TEXTURE_COMPARE_MODE_ARB:
+   case GL_TEXTURE_COMPARE_FUNC_ARB:
+   case GL_DEPTH_TEXTURE_MODE_ARB:
+   case GL_DEPTH_STENCIL_TEXTURE_MODE:
+   case GL_TEXTURE_SRGB_DECODE_EXT:
+   case GL_TEXTURE_CUBE_MAP_SEAMLESS:
+   case GL_TEXTURE_SWIZZLE_R:
+   case GL_TEXTURE_SWIZZLE_G:
+   case GL_TEXTURE_SWIZZLE_B:
+   case GL_TEXTURE_SWIZZLE_A:
+   case GL_TEXTURE_MIN_LOD:
+   case GL_TEXTURE_MAX_LOD:
+   case GL_TEXTURE_PRIORITY:
+   case GL_TEXTURE_MAX_ANISOTROPY_EXT:
+   case GL_TEXTURE_LOD_BIAS:
+   case GL_TEXTURE_TILING_EXT:
+      return 1;
+   case GL_TEXTURE_CROP_RECT_OES:
+   case GL_TEXTURE_SWIZZLE_RGBA:
+   case GL_TEXTURE_BORDER_COLOR:
+      return 4;
+   default:
+      return 0;
+   }
+}
+
 #endif /* MARSHAL_H */
 #endif /* MARSHAL_H */