CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutSign UpSign In
hrydgard

CoCalc provides the best real-time collaborative environment for Jupyter Notebooks, LaTeX documents, and SageMath, scalable from individual users to large groups and classes!

GitHub Repository: hrydgard/ppsspp
Path: blob/master/Common/GPU/OpenGL/DataFormatGL.cpp
Views: 1401
1
#include "Common/GPU/OpenGL/DataFormatGL.h"
2
#include "Common/GPU/OpenGL/GLFeatures.h"
3
#include "Common/Log.h"
4
5
namespace Draw {
6
7
// TODO: Also output storage format (GL_RGBA8 etc) for modern GL usage.
8
bool Thin3DFormatToGLFormatAndType(DataFormat fmt, GLuint &internalFormat, GLuint &format, GLuint &type, int &alignment) {
9
alignment = 4;
10
switch (fmt) {
11
case DataFormat::R16_UNORM:
12
internalFormat = GL_RGBA;
13
format = GL_RED;
14
type = GL_UNSIGNED_SHORT;
15
alignment = 2;
16
break;
17
18
case DataFormat::R8_UNORM:
19
if (gl_extensions.IsGLES) {
20
internalFormat = GL_LUMINANCE;
21
format = GL_LUMINANCE;
22
} else if (gl_extensions.VersionGEThan(3, 0)) {
23
internalFormat = GL_RED;
24
format = GL_RED;
25
} else {
26
internalFormat = GL_RGBA;
27
format = GL_RED;
28
}
29
type = GL_UNSIGNED_BYTE;
30
alignment = 1;
31
break;
32
33
case DataFormat::R8G8B8A8_UNORM:
34
internalFormat = GL_RGBA;
35
format = GL_RGBA;
36
type = GL_UNSIGNED_BYTE;
37
break;
38
39
case DataFormat::D32F:
40
internalFormat = GL_DEPTH_COMPONENT;
41
format = GL_DEPTH_COMPONENT;
42
type = GL_FLOAT;
43
break;
44
45
#ifndef USING_GLES2
46
case DataFormat::S8:
47
internalFormat = GL_STENCIL_INDEX;
48
format = GL_STENCIL_INDEX;
49
type = GL_UNSIGNED_BYTE;
50
alignment = 1;
51
break;
52
#endif
53
54
case DataFormat::R8G8B8_UNORM:
55
internalFormat = GL_RGB;
56
format = GL_RGB;
57
type = GL_UNSIGNED_BYTE;
58
alignment = 3;
59
break;
60
61
case DataFormat::R4G4B4A4_UNORM_PACK16:
62
internalFormat = GL_RGBA;
63
format = GL_RGBA;
64
type = GL_UNSIGNED_SHORT_4_4_4_4;
65
alignment = 2;
66
break;
67
68
case DataFormat::R5G6B5_UNORM_PACK16:
69
internalFormat = GL_RGB;
70
format = GL_RGB;
71
type = GL_UNSIGNED_SHORT_5_6_5;
72
alignment = 2;
73
break;
74
75
case DataFormat::R5G5B5A1_UNORM_PACK16:
76
internalFormat = GL_RGBA;
77
format = GL_RGBA;
78
type = GL_UNSIGNED_SHORT_5_5_5_1;
79
alignment = 2;
80
break;
81
82
case DataFormat::R32G32B32A32_FLOAT:
83
internalFormat = GL_RGBA32F;
84
format = GL_RGBA;
85
type = GL_FLOAT;
86
alignment = 16;
87
break;
88
89
#ifndef USING_GLES2
90
case DataFormat::BC1_RGBA_UNORM_BLOCK:
91
internalFormat = GL_COMPRESSED_RGB_S3TC_DXT1_EXT;
92
format = GL_RGB;
93
type = GL_FLOAT;
94
alignment = 8;
95
break;
96
case DataFormat::BC2_UNORM_BLOCK:
97
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
98
format = GL_RGBA;
99
type = GL_FLOAT;
100
alignment = 16;
101
break;
102
case DataFormat::BC3_UNORM_BLOCK:
103
internalFormat = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
104
format = GL_RGBA;
105
type = GL_FLOAT;
106
alignment = 16;
107
break;
108
case DataFormat::BC4_UNORM_BLOCK:
109
internalFormat = GL_COMPRESSED_RED_RGTC1;
110
format = GL_R;
111
type = GL_FLOAT;
112
alignment = 16;
113
break;
114
case DataFormat::BC5_UNORM_BLOCK:
115
internalFormat = GL_COMPRESSED_RG_RGTC2;
116
format = GL_RG;
117
type = GL_FLOAT;
118
alignment = 16;
119
break;
120
case DataFormat::BC7_UNORM_BLOCK:
121
internalFormat = GL_COMPRESSED_RGBA_BPTC_UNORM;
122
format = GL_RGBA;
123
type = GL_FLOAT;
124
alignment = 16;
125
break;
126
#endif
127
128
case DataFormat::ETC2_R8G8B8_UNORM_BLOCK:
129
internalFormat = GL_COMPRESSED_RGB8_ETC2;
130
format = GL_RGB;
131
type = GL_FLOAT;
132
alignment = 8;
133
break;
134
135
case DataFormat::ETC2_R8G8B8A1_UNORM_BLOCK:
136
internalFormat = GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2;
137
format = GL_RGBA;
138
type = GL_FLOAT;
139
alignment = 16;
140
break;
141
142
case DataFormat::ETC2_R8G8B8A8_UNORM_BLOCK:
143
internalFormat = GL_COMPRESSED_RGBA8_ETC2_EAC;
144
format = GL_RGBA;
145
type = GL_FLOAT;
146
alignment = 16;
147
break;
148
149
#ifdef GL_COMPRESSED_RGBA_ASTC_4x4_KHR
150
case DataFormat::ASTC_4x4_UNORM_BLOCK:
151
internalFormat = GL_COMPRESSED_RGBA_ASTC_4x4_KHR;
152
format = GL_RGBA;
153
type = GL_FLOAT;
154
alignment = 16;
155
break;
156
#endif
157
158
default:
159
return false;
160
}
161
return true;
162
}
163
164
}
165
166