]> git.tdb.fi Git - libs/gl.git/blob - source/backends/vulkan/pixelformat_backend.cpp
Initial implementation of Vulkan backend
[libs/gl.git] / source / backends / vulkan / pixelformat_backend.cpp
1 #include "pixelformat.h"
2 #include "pixelformat_backend.h"
3 #include "vulkan.h"
4
5 using namespace std;
6
7 namespace {
8
9 static unsigned swizzle_orders[] =
10 {
11         VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A,
12         VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_ONE,
13         VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G,
14         VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_A,
15         VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_ONE
16 };
17
18 }
19
20 namespace Msp {
21 namespace GL {
22
23 ComponentSwizzle get_required_swizzle(PixelComponents comp)
24 {
25         switch(comp)
26         {
27         case RGB: return RGBA_TO_RGB;
28         case LUMINANCE: return R_TO_LUMINANCE;
29         case LUMINANCE_ALPHA: return RG_TO_LUMINANCE_ALPHA;
30         default: return NO_SWIZZLE;
31         }
32 }
33
34 void require_pixelformat(PixelFormat)
35 { }
36
37 unsigned get_vulkan_pixelformat(PixelFormat pf)
38 {
39         switch(pf)
40         {
41         case R8: return VK_FORMAT_R8_UNORM;
42         case R16F: return VK_FORMAT_R16_SFLOAT;
43         case R32F: return VK_FORMAT_R32_SFLOAT;
44         case RG8: return VK_FORMAT_R8G8_UNORM;
45         case RG16F: return VK_FORMAT_R16G16_SFLOAT;
46         case RG32F: return VK_FORMAT_R32G32_SFLOAT;
47         case RGB8: return VK_FORMAT_R8G8B8_UNORM;
48         case RGB16F: return VK_FORMAT_R16G16B16_SFLOAT;
49         case RGB32F: return VK_FORMAT_R32G32B32_SFLOAT;
50         case RGBA8: return VK_FORMAT_R8G8B8A8_UNORM;
51         case RGBA16F: return VK_FORMAT_R16G16B16A16_SFLOAT;
52         case RGBA32F: return VK_FORMAT_R32G32B32A32_SFLOAT;
53         case SRGB8: return VK_FORMAT_R8G8B8_SRGB;
54         case SRGB8_ALPHA8: return VK_FORMAT_R8G8B8A8_SRGB;
55         case BGR8: return VK_FORMAT_B8G8R8_UNORM;
56         case BGRA8: return VK_FORMAT_B8G8R8A8_UNORM;
57         case SBGR8: return VK_FORMAT_B8G8R8_SRGB;
58         case SBGR8_ALPHA8: return VK_FORMAT_B8G8R8A8_SRGB;
59         case DEPTH_COMPONENT16: return VK_FORMAT_D16_UNORM;
60         case DEPTH_COMPONENT24: return VK_FORMAT_X8_D24_UNORM_PACK32;
61         case DEPTH_COMPONENT32F: return VK_FORMAT_D32_SFLOAT;
62         case STENCIL_INDEX8: return VK_FORMAT_S8_UINT;
63         default: throw invalid_argument("get_vulkan_pixelformat");
64         }
65 }
66
67 unsigned get_vulkan_aspect(PixelComponents comp)
68 {
69         switch(comp)
70         {
71         case DEPTH_COMPONENT: return VK_IMAGE_ASPECT_DEPTH_BIT;
72         case STENCIL_INDEX: return VK_IMAGE_ASPECT_STENCIL_BIT;
73         default: return VK_IMAGE_ASPECT_COLOR_BIT;
74         }
75 }
76
77 PixelFormat pixelformat_from_vulkan(unsigned vkf)
78 {
79         switch(vkf)
80         {
81         case VK_FORMAT_R8_UNORM: return R8;
82         case VK_FORMAT_R16_SFLOAT: return R16F;
83         case VK_FORMAT_R32_SFLOAT: return R32F;
84         case VK_FORMAT_R8G8_UNORM: return RG8;
85         case VK_FORMAT_R16G16_SFLOAT: return RG16F;
86         case VK_FORMAT_R32G32_SFLOAT: return RG32F;
87         case VK_FORMAT_R8G8B8_UNORM: return RGB8;
88         case VK_FORMAT_R16G16B16_SFLOAT: return RGB16F;
89         case VK_FORMAT_R32G32B32_SFLOAT: return RGB32F;
90         case VK_FORMAT_R8G8B8A8_UNORM: return RGBA8;
91         case VK_FORMAT_R16G16B16A16_SFLOAT: return RGBA16F;
92         case VK_FORMAT_R32G32B32A32_SFLOAT: return RGBA32F;
93         case VK_FORMAT_R8G8B8_SRGB: return SRGB8;
94         case VK_FORMAT_R8G8B8A8_SRGB: return SRGB8_ALPHA8;
95         case VK_FORMAT_B8G8R8_UNORM: return BGR8;
96         case VK_FORMAT_B8G8R8A8_UNORM: return BGRA8;
97         case VK_FORMAT_B8G8R8_SRGB: return SBGR8;
98         case VK_FORMAT_B8G8R8A8_SRGB: return SBGR8_ALPHA8;
99         case VK_FORMAT_D16_UNORM: return DEPTH_COMPONENT16;
100         case VK_FORMAT_X8_D24_UNORM_PACK32: return DEPTH_COMPONENT24;
101         case VK_FORMAT_D32_SFLOAT: return DEPTH_COMPONENT32F;
102         case VK_FORMAT_S8_UINT: return STENCIL_INDEX8;
103         default: throw invalid_argument("pixelformat_from_vulkan");
104         }
105 }
106
107 const unsigned *get_vulkan_swizzle(ComponentSwizzle swiz)
108 {
109         return swizzle_orders+4*swiz;
110 }
111
112 } // namespace GL
113 } // namespace Msp