80f7f542e43da54770c50fc06f8758707e121a45
[mesa.git] / src / mapi / glapi / gen / marshal_XML.py
1 #!/usr/bin/env python
2
3 # Copyright (C) 2012 Intel Corporation
4 #
5 # Permission is hereby granted, free of charge, to any person obtaining a
6 # copy of this software and associated documentation files (the "Software"),
7 # to deal in the Software without restriction, including without limitation
8 # the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 # and/or sell copies of the Software, and to permit persons to whom the
10 # Software is furnished to do so, subject to the following conditions:
11 #
12 # The above copyright notice and this permission notice (including the next
13 # paragraph) shall be included in all copies or substantial portions of the
14 # Software.
15 #
16 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 # THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22 # IN THE SOFTWARE.
23
24 # marshal_XML.py: factory for interpreting XML for the purpose of
25 # building thread marshalling code.
26
27 import gl_XML
28
29
30 class marshal_item_factory(gl_XML.gl_item_factory):
31 """Factory to create objects derived from gl_item containing
32 information necessary to generate thread marshalling code."""
33
34 def create_function(self, element, context):
35 return marshal_function(element, context)
36
37
38 class marshal_function(gl_XML.gl_function):
39 def process_element(self, element):
40 # Do normal processing.
41 super(marshal_function, self).process_element(element)
42
43 # Only do further processing when we see the canonical
44 # function name.
45 if element.get('name') != self.name:
46 return
47
48 # Classify fixed and variable parameters.
49 self.fixed_params = []
50 self.variable_params = []
51 for p in self.parameters:
52 if p.is_padding:
53 continue
54 if p.is_variable_length():
55 self.variable_params.append(p)
56 else:
57 self.fixed_params.append(p)
58
59 # Store the "marshal" attribute, if present.
60 self.marshal = element.get('marshal')
61 self.marshal_fail = element.get('marshal_fail')
62
63 def marshal_flavor(self):
64 """Find out how this function should be marshalled between
65 client and server threads."""
66 # If a "marshal" attribute was present, that overrides any
67 # determination that would otherwise be made by this function.
68 if self.marshal not in (None, 'draw'):
69 return self.marshal
70
71 if self.exec_flavor == 'skip':
72 # Functions marked exec="skip" are not yet implemented in
73 # Mesa, so don't bother trying to marshal them.
74 return 'skip'
75
76 if self.return_type != 'void':
77 return 'sync'
78 for p in self.parameters:
79 if p.is_output:
80 return 'sync'
81 if p.is_pointer() and not (p.count or p.counter) and not (self.marshal == 'draw' and p.name == 'indices'):
82 return 'sync'
83 if p.count_parameter_list:
84 # Parameter size is determined by enums; haven't
85 # written logic to handle this yet. TODO: fix.
86 return 'sync'
87 return 'async'