Signed-off-by: Georg Lehmann dadschoorse@gmail.com --- dlls/winevulkan/make_vulkan | 49 ++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 1243f211b5e..c56b48d1862 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -357,9 +357,9 @@ class VkDefine(object):
class VkEnum(object): - def __init__(self, name, values, alias=None): + def __init__(self, name, alias=None): self.name = name - self.values = values + self.values = [] if alias == None else alias.values self.required = False self.alias = alias self.aliased_by = [] @@ -367,7 +367,7 @@ class VkEnum(object): @staticmethod def from_alias(enum, alias): name = enum.attrib.get("name") - aliasee = VkEnum(name, alias.values, alias=alias) + aliasee = VkEnum(name, alias=alias)
alias.add_aliased_by(aliasee) return aliasee @@ -375,34 +375,43 @@ class VkEnum(object): @staticmethod def from_xml(enum): name = enum.attrib.get("name") - values = [] + result = VkEnum(name)
for v in enum.findall("enum"): + value_name = v.attrib.get("name") # Value is either a value or a bitpos, only one can exist. value = v.attrib.get("value") alias_name = v.attrib.get("alias") if alias_name: - alias = next(x for x in values if x.name == alias_name) - values.append(VkEnumValue(v.attrib.get("name"), value=alias.value, hex=alias.hex)) + result.create_alias(value_name, alias_name) elif value: - # Some values are in hex form. We want to preserve the hex representation - # at least when we convert back to a string. Internally we want to use int. - if "0x" in value: - values.append(VkEnumValue(v.attrib.get("name"), value=int(value, 0), hex=True)) - else: - values.append(VkEnumValue(v.attrib.get("name"), value=int(value, 0))) + result.create_value(value_name, value) else: # bitmask - value = 1 << int(v.attrib.get("bitpos")) - values.append(VkEnumValue(v.attrib.get("name"), value=value, hex=True)) + result.create_bitpos(value_name, int(v.attrib.get("bitpos")))
# vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing, # which is to prepare for extensions as they can add values and hence affect # the size definition. max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM" - values.append(VkEnumValue(max_name, value=0x7fffffff, hex=True)) + result.add(VkEnumValue(max_name, value=0x7fffffff, hex=True)) + + return result + + def create_alias(self, name, alias_name): + """ Create an aliased value for this enum """ + self.add(VkEnumValue(name, alias=alias_name)) + + def create_value(self, name, value): + """ Create a new value for this enum """ + # Some values are in hex form. We want to preserve the hex representation + # at least when we convert back to a string. Internally we want to use int. + hex = "0x" in value + self.add(VkEnumValue(name, value=int(value, 0), hex=hex))
- return VkEnum(name, values) + def create_bitpos(self, name, pos): + """ Create a new bitmask value for this enum """ + self.add(VkEnumValue(name, value=(1 << pos), hex=True))
def add(self, value): """ Add a value to enum. """ @@ -2874,7 +2883,7 @@ class VkRegistry(object): if "bitpos" in enum_elem.keys(): # We need to add an extra value to an existing enum type. # E.g. VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG to VkFormatFeatureFlagBits. - enum.add(VkEnumValue(enum_elem.attrib["name"], value=(1 << int(enum_elem.attrib["bitpos"])), hex=True)) + enum.create_bitpos(enum_elem.attrib["name"], int(enum_elem.attrib["bitpos"]))
elif "offset" in enum_elem.keys(): # Extensions promoted to Core, have the extension number as part @@ -2891,12 +2900,12 @@ class VkRegistry(object): if direction is not None: value = -value
- enum.add(VkEnumValue(enum_elem.attrib["name"], value=value)) + enum.create_value(enum_elem.attrib["name"], str(value))
elif "value" in enum_elem.keys(): - enum.add(VkEnumValue(enum_elem.attrib["name"], value=int(enum_elem.attrib["value"]))) + enum.create_value(enum_elem.attrib["name"], enum_elem.attrib["value"]) elif "alias" in enum_elem.keys(): - enum.add(VkEnumValue(enum_elem.attrib["name"], alias=enum_elem.attrib["alias"])) + enum.create_alias(enum_elem.attrib["name"], enum_elem.attrib["alias"])
elif "value" in enum_elem.keys(): # Constants are not aliased, no need to add them here, they'll get added later on.
Signed-off-by: Georg Lehmann dadschoorse@gmail.com --- dlls/winevulkan/make_vulkan | 55 +++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index c56b48d1862..0e576de2c22 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -357,8 +357,11 @@ class VkDefine(object):
class VkEnum(object): - def __init__(self, name, alias=None): + def __init__(self, name, bitwidth, alias=None): + if not bitwidth in [32, 64]: + LOGGER.error("unknown bitwidth: {}".format(bitwidth)) self.name = name + self.bitwidth = bitwidth self.values = [] if alias == None else alias.values self.required = False self.alias = alias @@ -367,7 +370,7 @@ class VkEnum(object): @staticmethod def from_alias(enum, alias): name = enum.attrib.get("name") - aliasee = VkEnum(name, alias=alias) + aliasee = VkEnum(name, alias.bitwidth, alias=alias)
alias.add_aliased_by(aliasee) return aliasee @@ -375,7 +378,8 @@ class VkEnum(object): @staticmethod def from_xml(enum): name = enum.attrib.get("name") - result = VkEnum(name) + bitwidth = int(enum.attrib.get("bitwidth", "32")) + result = VkEnum(name, bitwidth)
for v in enum.findall("enum"): value_name = v.attrib.get("name") @@ -390,28 +394,29 @@ class VkEnum(object): # bitmask result.create_bitpos(value_name, int(v.attrib.get("bitpos")))
- # vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing, - # which is to prepare for extensions as they can add values and hence affect - # the size definition. - max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM" - result.add(VkEnumValue(max_name, value=0x7fffffff, hex=True)) + if bitwidth == 32: + # vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing, + # which is to prepare for extensions as they can add values and hence affect + # the size definition. + max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM" + result.add(VkEnumValue(max_name, bitwidth, value=0x7fffffff, hex=True))
return result
def create_alias(self, name, alias_name): """ Create an aliased value for this enum """ - self.add(VkEnumValue(name, alias=alias_name)) + self.add(VkEnumValue(name, self.bitwidth, alias=alias_name))
def create_value(self, name, value): """ Create a new value for this enum """ # Some values are in hex form. We want to preserve the hex representation # at least when we convert back to a string. Internally we want to use int. hex = "0x" in value - self.add(VkEnumValue(name, value=int(value, 0), hex=hex)) + self.add(VkEnumValue(name, self.bitwidth, value=int(value, 0), hex=hex))
def create_bitpos(self, name, pos): """ Create a new bitmask value for this enum """ - self.add(VkEnumValue(name, value=(1 << pos), hex=True)) + self.add(VkEnumValue(name, self.bitwidth, value=(1 << pos), hex=True))
def add(self, value): """ Add a value to enum. """ @@ -432,13 +437,20 @@ class VkEnum(object): if self.is_alias(): return ""
- text = "typedef enum {0}\n{{\n".format(self.name) + default_value = 0x7ffffffe if self.bitwidth == 32 else 0xfffffffffffffffe
# Print values sorted, values can have been added in a random order. - values = sorted(self.values, key=lambda value: value.value if value.value is not None else 0x7ffffffe) - for value in values: - text += " {0},\n".format(value.definition()) - text += "}} {0};\n".format(self.name) + values = sorted(self.values, key=lambda value: value.value if value.value is not None else default_value) + + if self.bitwidth == 32: + text = "typedef enum {0}\n{{\n".format(self.name) + for value in values: + text += " {0},\n".format(value.definition()) + text += "}} {0};\n".format(self.name) + elif self.bitwidth == 64: + text = "typedef VkFlags64 {0};\n\n".format(self.name) + for value in values: + text += "static const {0} {1};\n".format(self.name, value.definition())
for aliasee in self.aliased_by: text += "typedef {0} {1};\n".format(self.name, aliasee.name) @@ -454,28 +466,31 @@ class VkEnum(object):
class VkEnumValue(object): - def __init__(self, name, value=None, hex=False, alias=None): + def __init__(self, name, bitwidth, value=None, hex=False, alias=None): self.name = name + self.bitwidth = bitwidth self.value = value self.hex = hex self.alias = alias
def __repr__(self): + postfix = "ull" if self.bitwidth == 64 else "" if self.is_alias(): return "{0}={1}".format(self.name, self.alias) - return "{0}={1}".format(self.name, self.value) + return "{0}={1}{2}".format(self.name, self.value, postfix)
def definition(self): """ Convert to text definition e.g. VK_FOO = 1 """ + postfix = "ull" if self.bitwidth == 64 else "" if self.is_alias(): return "{0} = {1}".format(self.name, self.alias)
# Hex is commonly used for FlagBits and sometimes within # a non-FlagBits enum for a bitmask value as well. if self.hex: - return "{0} = 0x{1:08x}".format(self.name, self.value) + return "{0} = 0x{1:08x}{2}".format(self.name, self.value, postfix) else: - return "{0} = {1}".format(self.name, self.value) + return "{0} = {1}{2}".format(self.name, self.value, postfix)
def is_alias(self): return self.alias is not None
This looks good to me functionally. Have the one nitpick below.
Thanks,
Liam Middlebrook
On 3/4/21 8:53 AM, Georg Lehmann wrote:
Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winevulkan/make_vulkan | 55 +++++++++++++++++++++++-------------- 1 file changed, 35 insertions(+), 20 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index c56b48d1862..0e576de2c22 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -357,8 +357,11 @@ class VkDefine(object):
class VkEnum(object):
- def __init__(self, name, alias=None):
- def __init__(self, name, bitwidth, alias=None):
if not bitwidth in [32, 64]:
LOGGER.error("unknown bitwidth: {}".format(bitwidth))
nit: this message should also contain the name
self.name = name
self.bitwidth = bitwidth self.values = [] if alias == None else alias.values self.required = False self.alias = alias
@@ -367,7 +370,7 @@ class VkEnum(object): @staticmethod def from_alias(enum, alias): name = enum.attrib.get("name")
aliasee = VkEnum(name, alias=alias)
aliasee = VkEnum(name, alias.bitwidth, alias=alias) alias.add_aliased_by(aliasee) return aliasee
@@ -375,7 +378,8 @@ class VkEnum(object): @staticmethod def from_xml(enum): name = enum.attrib.get("name")
result = VkEnum(name)
bitwidth = int(enum.attrib.get("bitwidth", "32"))
result = VkEnum(name, bitwidth) for v in enum.findall("enum"): value_name = v.attrib.get("name")
@@ -390,28 +394,29 @@ class VkEnum(object): # bitmask result.create_bitpos(value_name, int(v.attrib.get("bitpos")))
# vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing,
# which is to prepare for extensions as they can add values and hence affect
# the size definition.
max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM"
result.add(VkEnumValue(max_name, value=0x7fffffff, hex=True))
if bitwidth == 32:
# vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing,
# which is to prepare for extensions as they can add values and hence affect
# the size definition.
max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM"
result.add(VkEnumValue(max_name, bitwidth, value=0x7fffffff, hex=True)) return result def create_alias(self, name, alias_name): """ Create an aliased value for this enum """
self.add(VkEnumValue(name, alias=alias_name))
self.add(VkEnumValue(name, self.bitwidth, alias=alias_name)) def create_value(self, name, value): """ Create a new value for this enum """ # Some values are in hex form. We want to preserve the hex representation # at least when we convert back to a string. Internally we want to use int. hex = "0x" in value
self.add(VkEnumValue(name, value=int(value, 0), hex=hex))
self.add(VkEnumValue(name, self.bitwidth, value=int(value, 0), hex=hex)) def create_bitpos(self, name, pos): """ Create a new bitmask value for this enum """
self.add(VkEnumValue(name, value=(1 << pos), hex=True))
self.add(VkEnumValue(name, self.bitwidth, value=(1 << pos), hex=True)) def add(self, value): """ Add a value to enum. """
@@ -432,13 +437,20 @@ class VkEnum(object): if self.is_alias(): return ""
text = "typedef enum {0}\n{{\n".format(self.name)
default_value = 0x7ffffffe if self.bitwidth == 32 else 0xfffffffffffffffe # Print values sorted, values can have been added in a random order.
values = sorted(self.values, key=lambda value: value.value if value.value is not None else 0x7ffffffe)
for value in values:
text += " {0},\n".format(value.definition())
text += "}} {0};\n".format(self.name)
values = sorted(self.values, key=lambda value: value.value if value.value is not None else default_value)
if self.bitwidth == 32:
text = "typedef enum {0}\n{{\n".format(self.name)
for value in values:
text += " {0},\n".format(value.definition())
text += "}} {0};\n".format(self.name)
elif self.bitwidth == 64:
text = "typedef VkFlags64 {0};\n\n".format(self.name)
for value in values:
text += "static const {0} {1};\n".format(self.name, value.definition()) for aliasee in self.aliased_by: text += "typedef {0} {1};\n".format(self.name, aliasee.name)
@@ -454,28 +466,31 @@ class VkEnum(object):
class VkEnumValue(object):
- def __init__(self, name, value=None, hex=False, alias=None):
def __init__(self, name, bitwidth, value=None, hex=False, alias=None): self.name = name
self.bitwidth = bitwidth self.value = value self.hex = hex self.alias = alias def __repr__(self):
postfix = "ull" if self.bitwidth == 64 else "" if self.is_alias(): return "{0}={1}".format(self.name, self.alias)
return "{0}={1}".format(self.name, self.value)
return "{0}={1}{2}".format(self.name, self.value, postfix) def definition(self): """ Convert to text definition e.g. VK_FOO = 1 """
postfix = "ull" if self.bitwidth == 64 else "" if self.is_alias(): return "{0} = {1}".format(self.name, self.alias) # Hex is commonly used for FlagBits and sometimes within # a non-FlagBits enum for a bitmask value as well. if self.hex:
return "{0} = 0x{1:08x}".format(self.name, self.value)
return "{0} = 0x{1:08x}{2}".format(self.name, self.value, postfix) else:
return "{0} = {1}".format(self.name, self.value)
return "{0} = {1}{2}".format(self.name, self.value, postfix) def is_alias(self): return self.alias is not None
It would be nice to give a bit of context in the commit message body for why this rework is taking place. As I understand, it's follow-up from your feedback on KHR sync2 support in winevulkan?
Change itself here LGTM, I just think the description should do a bit more to explain why the rework is desired.
Thanks,
Liam Middlebrook
On 3/4/21 8:53 AM, Georg Lehmann wrote:
Signed-off-by: Georg Lehmann dadschoorse@gmail.com
dlls/winevulkan/make_vulkan | 49 ++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 20 deletions(-)
diff --git a/dlls/winevulkan/make_vulkan b/dlls/winevulkan/make_vulkan index 1243f211b5e..c56b48d1862 100755 --- a/dlls/winevulkan/make_vulkan +++ b/dlls/winevulkan/make_vulkan @@ -357,9 +357,9 @@ class VkDefine(object):
class VkEnum(object):
- def __init__(self, name, values, alias=None):
- def __init__(self, name, alias=None): self.name = name
self.values = values
self.values = [] if alias == None else alias.values self.required = False self.alias = alias self.aliased_by = []
@@ -367,7 +367,7 @@ class VkEnum(object): @staticmethod def from_alias(enum, alias): name = enum.attrib.get("name")
aliasee = VkEnum(name, alias.values, alias=alias)
aliasee = VkEnum(name, alias=alias) alias.add_aliased_by(aliasee) return aliasee
@@ -375,34 +375,43 @@ class VkEnum(object): @staticmethod def from_xml(enum): name = enum.attrib.get("name")
values = []
result = VkEnum(name) for v in enum.findall("enum"):
value_name = v.attrib.get("name") # Value is either a value or a bitpos, only one can exist. value = v.attrib.get("value") alias_name = v.attrib.get("alias") if alias_name:
alias = next(x for x in values if x.name == alias_name)
values.append(VkEnumValue(v.attrib.get("name"), value=alias.value, hex=alias.hex))
result.create_alias(value_name, alias_name) elif value:
# Some values are in hex form. We want to preserve the hex representation
# at least when we convert back to a string. Internally we want to use int.
if "0x" in value:
values.append(VkEnumValue(v.attrib.get("name"), value=int(value, 0), hex=True))
else:
values.append(VkEnumValue(v.attrib.get("name"), value=int(value, 0)))
result.create_value(value_name, value) else: # bitmask
value = 1 << int(v.attrib.get("bitpos"))
values.append(VkEnumValue(v.attrib.get("name"), value=value, hex=True))
result.create_bitpos(value_name, int(v.attrib.get("bitpos"))) # vulkan.h contains a *_MAX_ENUM value set to 32-bit at the time of writing, # which is to prepare for extensions as they can add values and hence affect # the size definition. max_name = re.sub(r'([0-9a-z_])([A-Z0-9])',r'\1_\2', name).upper() + "_MAX_ENUM"
values.append(VkEnumValue(max_name, value=0x7fffffff, hex=True))
result.add(VkEnumValue(max_name, value=0x7fffffff, hex=True))
return result
- def create_alias(self, name, alias_name):
""" Create an aliased value for this enum """
self.add(VkEnumValue(name, alias=alias_name))
- def create_value(self, name, value):
""" Create a new value for this enum """
# Some values are in hex form. We want to preserve the hex representation
# at least when we convert back to a string. Internally we want to use int.
hex = "0x" in value
self.add(VkEnumValue(name, value=int(value, 0), hex=hex))
return VkEnum(name, values)
def create_bitpos(self, name, pos):
""" Create a new bitmask value for this enum """
self.add(VkEnumValue(name, value=(1 << pos), hex=True)) def add(self, value): """ Add a value to enum. """
@@ -2874,7 +2883,7 @@ class VkRegistry(object): if "bitpos" in enum_elem.keys(): # We need to add an extra value to an existing enum type. # E.g. VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG to VkFormatFeatureFlagBits.
enum.add(VkEnumValue(enum_elem.attrib["name"], value=(1 << int(enum_elem.attrib["bitpos"])), hex=True))
enum.create_bitpos(enum_elem.attrib["name"], int(enum_elem.attrib["bitpos"])) elif "offset" in enum_elem.keys(): # Extensions promoted to Core, have the extension number as part
@@ -2891,12 +2900,12 @@ class VkRegistry(object): if direction is not None: value = -value
enum.add(VkEnumValue(enum_elem.attrib["name"], value=value))
enum.create_value(enum_elem.attrib["name"], str(value)) elif "value" in enum_elem.keys():
enum.add(VkEnumValue(enum_elem.attrib["name"], value=int(enum_elem.attrib["value"])))
enum.create_value(enum_elem.attrib["name"], enum_elem.attrib["value"]) elif "alias" in enum_elem.keys():
enum.add(VkEnumValue(enum_elem.attrib["name"], alias=enum_elem.attrib["alias"]))
enum.create_alias(enum_elem.attrib["name"], enum_elem.attrib["alias"]) elif "value" in enum_elem.keys(): # Constants are not aliased, no need to add them here, they'll get added later on.