3 changed files with 150 additions and 8 deletions
-
10src/video_core/engines/sw_blitter/blitter.cpp
-
6src/video_core/engines/sw_blitter/converter.cpp
-
136src/video_core/engines/sw_blitter/generate_converters.py
@ -0,0 +1,136 @@ |
|||||
|
# SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project |
||||
|
# SPDX-License-Identifier: GPL-3.0-or-later |
||||
|
|
||||
|
import re |
||||
|
|
||||
|
class Format: |
||||
|
def __init__(self, string_value): |
||||
|
self.name = string_value |
||||
|
tmp = string_value.split('_') |
||||
|
self.component_type = tmp[1] |
||||
|
component_data = re.findall(r"\w\d+", tmp[0]) |
||||
|
self.num_components = len(component_data) |
||||
|
sizes = [] |
||||
|
swizzle = [] |
||||
|
for data in component_data: |
||||
|
swizzle.append(data[0]) |
||||
|
sizes.append(int(data[1:])) |
||||
|
self.sizes = sizes |
||||
|
self.swizzle = swizzle |
||||
|
|
||||
|
def build_component_type_array(self): |
||||
|
result = "{ " |
||||
|
b = False |
||||
|
for i in range(0, self.num_components): |
||||
|
if b: |
||||
|
result += ", " |
||||
|
b = True |
||||
|
result += "ComponentType::" + self.component_type |
||||
|
result += " }" |
||||
|
return result |
||||
|
|
||||
|
def build_component_sizes_array(self): |
||||
|
result = "{ " |
||||
|
b = False |
||||
|
for i in range(0, self.num_components): |
||||
|
if b: |
||||
|
result += ", " |
||||
|
b = True |
||||
|
result += str(self.sizes[i]) |
||||
|
result += " }" |
||||
|
return result |
||||
|
|
||||
|
def build_component_swizzle_array(self): |
||||
|
result = "{ " |
||||
|
b = False |
||||
|
for i in range(0, self.num_components): |
||||
|
if b: |
||||
|
result += ", " |
||||
|
b = True |
||||
|
swizzle = self.swizzle[i] |
||||
|
if swizzle == "X": |
||||
|
swizzle = "None" |
||||
|
result += "Swizzle::" + swizzle |
||||
|
result += " }" |
||||
|
return result |
||||
|
|
||||
|
def print_declaration(self): |
||||
|
print("struct " + self.name + "Traits {") |
||||
|
print(" static constexpr size_t num_components = " + str(self.num_components) + ";") |
||||
|
print(" static constexpr std::array<ComponentType, num_components> component_types = " + self.build_component_type_array() + ";") |
||||
|
print(" static constexpr std::array<size_t, num_components> component_sizes = " + self.build_component_sizes_array() + ";") |
||||
|
print(" static constexpr std::array<Swizzle, num_components> component_swizzle = " + self.build_component_swizzle_array() + ";") |
||||
|
print("};\n") |
||||
|
|
||||
|
def print_case(self): |
||||
|
print("case RenderTargetFormat::" + self.name + ":") |
||||
|
print(" return impl->converters_cache") |
||||
|
print(" .emplace(format, std::make_unique<ConverterImpl<" + self.name + "Traits>>())") |
||||
|
print(" .first->second.get();") |
||||
|
print(" break;") |
||||
|
|
||||
|
txt = """ |
||||
|
R32G32B32A32_FLOAT |
||||
|
R32G32B32A32_SINT |
||||
|
R32G32B32A32_UINT |
||||
|
R32G32B32X32_FLOAT |
||||
|
R32G32B32X32_SINT |
||||
|
R32G32B32X32_UINT |
||||
|
R16G16B16A16_UNORM |
||||
|
R16G16B16A16_SNORM |
||||
|
R16G16B16A16_SINT |
||||
|
R16G16B16A16_UINT |
||||
|
R16G16B16A16_FLOAT |
||||
|
R32G32_FLOAT |
||||
|
R32G32_SINT |
||||
|
R32G32_UINT |
||||
|
R16G16B16X16_FLOAT |
||||
|
A8R8G8B8_UNORM |
||||
|
A8R8G8B8_SRGB |
||||
|
A2B10G10R10_UNORM |
||||
|
A2B10G10R10_UINT |
||||
|
A2R10G10B10_UNORM |
||||
|
A8B8G8R8_UNORM |
||||
|
A8B8G8R8_SRGB |
||||
|
A8B8G8R8_SNORM |
||||
|
A8B8G8R8_SINT |
||||
|
A8B8G8R8_UINT |
||||
|
R16G16_UNORM |
||||
|
R16G16_SNORM |
||||
|
R16G16_SINT |
||||
|
R16G16_UINT |
||||
|
R16G16_FLOAT |
||||
|
B10G11R11_FLOAT |
||||
|
R32_SINT |
||||
|
R32_UINT |
||||
|
R32_FLOAT |
||||
|
X8R8G8B8_UNORM |
||||
|
X8R8G8B8_SRGB |
||||
|
R5G6B5_UNORM |
||||
|
A1R5G5B5_UNORM |
||||
|
R8G8_UNORM |
||||
|
R8G8_SNORM |
||||
|
R8G8_SINT |
||||
|
R8G8_UINT |
||||
|
R16_UNORM |
||||
|
R16_SNORM |
||||
|
R16_SINT |
||||
|
R16_UINT |
||||
|
R16_FLOAT |
||||
|
R8_UNORM |
||||
|
R8_SNORM |
||||
|
R8_SINT |
||||
|
R8_UINT |
||||
|
X1R5G5B5_UNORM |
||||
|
X8B8G8R8_UNORM |
||||
|
X8B8G8R8_SRGB |
||||
|
""" |
||||
|
|
||||
|
x = txt.split() |
||||
|
y = list(map(lambda a: Format(a), x)) |
||||
|
formats = list(y) |
||||
|
for format in formats: |
||||
|
format.print_declaration() |
||||
|
|
||||
|
for format in formats: |
||||
|
format.print_case() |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue