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