blob: 3a888cbc590361b2074a6cac5e4ccc2c7c20ffd5 [file] [log] [blame]
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +00001//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
7// renderer11_utils.cpp: Conversion functions and other utility routines
8// specific to the D3D11 renderer.
9
10#include "libGLESv2/renderer/renderer11_utils.h"
11
12#include "common/debug.h"
13
daniel@transgaming.com6b147712012-11-28 19:37:24 +000014namespace gl_d3d11
15{
16
17D3D11_BLEND ConvertBlendFunc(GLenum glBlend)
18{
19 D3D11_BLEND d3dBlend = D3D11_BLEND_ZERO;
20
21 switch (glBlend)
22 {
23 case GL_ZERO: d3dBlend = D3D11_BLEND_ZERO; break;
24 case GL_ONE: d3dBlend = D3D11_BLEND_ONE; break;
25 case GL_SRC_COLOR: d3dBlend = D3D11_BLEND_SRC_COLOR; break;
26 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3D11_BLEND_INV_SRC_COLOR; break;
27 case GL_DST_COLOR: d3dBlend = D3D11_BLEND_DEST_COLOR; break;
28 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3D11_BLEND_INV_DEST_COLOR; break;
29 case GL_SRC_ALPHA: d3dBlend = D3D11_BLEND_SRC_ALPHA; break;
30 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3D11_BLEND_INV_SRC_ALPHA; break;
31 case GL_DST_ALPHA: d3dBlend = D3D11_BLEND_DEST_ALPHA; break;
32 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3D11_BLEND_INV_DEST_ALPHA; break;
33 case GL_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
34 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
35 case GL_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_BLEND_FACTOR; break;
36 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3D11_BLEND_INV_BLEND_FACTOR; break;
37 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3D11_BLEND_SRC_ALPHA_SAT; break;
38 default: UNREACHABLE();
39 }
40
41 return d3dBlend;
42}
43
44D3D11_BLEND_OP ConvertBlendOp(GLenum glBlendOp)
45{
46 D3D11_BLEND_OP d3dBlendOp = D3D11_BLEND_OP_ADD;
47
48 switch (glBlendOp)
49 {
50 case GL_FUNC_ADD: d3dBlendOp = D3D11_BLEND_OP_ADD; break;
51 case GL_FUNC_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_SUBTRACT; break;
52 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3D11_BLEND_OP_REV_SUBTRACT; break;
53 default: UNREACHABLE();
54 }
55
56 return d3dBlendOp;
57}
58
59UINT8 ConvertColorMask(bool red, bool green, bool blue, bool alpha)
60{
61 UINT8 mask = 0;
62 if (red)
63 {
64 mask |= D3D11_COLOR_WRITE_ENABLE_RED;
65 }
66 if (green)
67 {
68 mask |= D3D11_COLOR_WRITE_ENABLE_GREEN;
69 }
70 if (blue)
71 {
72 mask |= D3D11_COLOR_WRITE_ENABLE_BLUE;
73 }
74 if (alpha)
75 {
76 mask |= D3D11_COLOR_WRITE_ENABLE_ALPHA;
77 }
78 return mask;
79}
80
daniel@transgaming.comfa34b342012-11-28 19:38:01 +000081D3D11_CULL_MODE ConvertCullMode(bool cullEnabled, GLenum cullMode)
82{
83 D3D11_CULL_MODE cull = D3D11_CULL_NONE;
84
85 if (cullEnabled)
86 {
87 switch (cullMode)
88 {
89 case GL_FRONT: cull = D3D11_CULL_FRONT; break;
90 case GL_BACK: cull = D3D11_CULL_BACK; break;
91 case GL_FRONT_AND_BACK: cull = D3D11_CULL_NONE; break;
92 default: UNREACHABLE();
93 }
94 }
95 else
96 {
97 cull = D3D11_CULL_NONE;
98 }
99
100 return cull;
101}
102
daniel@transgaming.comc820c122012-11-28 19:38:30 +0000103D3D11_COMPARISON_FUNC ConvertComparison(GLenum comparison)
104{
105 D3D11_COMPARISON_FUNC d3dComp = D3D11_COMPARISON_NEVER;
106 switch (comparison)
107 {
108 case GL_NEVER: d3dComp = D3D11_COMPARISON_NEVER; break;
109 case GL_ALWAYS: d3dComp = D3D11_COMPARISON_ALWAYS; break;
110 case GL_LESS: d3dComp = D3D11_COMPARISON_LESS; break;
111 case GL_LEQUAL: d3dComp = D3D11_COMPARISON_LESS_EQUAL; break;
112 case GL_EQUAL: d3dComp = D3D11_COMPARISON_EQUAL; break;
113 case GL_GREATER: d3dComp = D3D11_COMPARISON_GREATER; break;
114 case GL_GEQUAL: d3dComp = D3D11_COMPARISON_GREATER_EQUAL; break;
115 case GL_NOTEQUAL: d3dComp = D3D11_COMPARISON_NOT_EQUAL; break;
116 default: UNREACHABLE();
117 }
118
119 return d3dComp;
120}
121
122D3D11_DEPTH_WRITE_MASK ConvertDepthMask(bool depthWriteEnabled)
123{
124 return depthWriteEnabled ? D3D11_DEPTH_WRITE_MASK_ALL : D3D11_DEPTH_WRITE_MASK_ZERO;
125}
126
127UINT8 ConvertStencilMask(GLuint stencilmask)
128{
129 return static_cast<UINT8>(stencilmask);
130}
131
132D3D11_STENCIL_OP ConvertStencilOp(GLenum stencilOp)
133{
134 D3D11_STENCIL_OP d3dStencilOp = D3D11_STENCIL_OP_KEEP;
135
136 switch (stencilOp)
137 {
138 case GL_ZERO: d3dStencilOp = D3D11_STENCIL_OP_ZERO; break;
139 case GL_KEEP: d3dStencilOp = D3D11_STENCIL_OP_KEEP; break;
140 case GL_REPLACE: d3dStencilOp = D3D11_STENCIL_OP_REPLACE; break;
141 case GL_INCR: d3dStencilOp = D3D11_STENCIL_OP_INCR_SAT; break;
142 case GL_DECR: d3dStencilOp = D3D11_STENCIL_OP_DECR_SAT; break;
143 case GL_INVERT: d3dStencilOp = D3D11_STENCIL_OP_INVERT; break;
144 case GL_INCR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_INCR; break;
145 case GL_DECR_WRAP: d3dStencilOp = D3D11_STENCIL_OP_DECR; break;
146 default: UNREACHABLE();
147 }
148
149 return d3dStencilOp;
150}
151
daniel@transgaming.com6b147712012-11-28 19:37:24 +0000152}
153
daniel@transgaming.comfeae9b32012-11-28 19:34:56 +0000154namespace d3d11_gl
155{
156
157GLenum ConvertBackBufferFormat(DXGI_FORMAT format)
158{
159 switch (format)
160 {
161 case DXGI_FORMAT_R8G8B8A8_UNORM: return GL_RGBA8_OES;
162 default:
163 UNREACHABLE();
164 }
165
166 return GL_RGBA8_OES;
167}
168
169GLenum ConvertDepthStencilFormat(DXGI_FORMAT format)
170{
171 switch (format)
172 {
173 case DXGI_FORMAT_D24_UNORM_S8_UINT: return GL_DEPTH24_STENCIL8_OES;
174 default:
175 UNREACHABLE();
176 }
177
178 return GL_DEPTH24_STENCIL8_OES;
179}
180
181GLenum ConvertRenderbufferFormat(DXGI_FORMAT format)
182{
183 switch (format)
184 {
185 case DXGI_FORMAT_R8G8B8A8_UNORM:
186 return GL_RGBA8_OES;
187 case DXGI_FORMAT_D24_UNORM_S8_UINT:
188 return GL_DEPTH24_STENCIL8_OES;
189 default:
190 UNREACHABLE();
191 }
192
193 return GL_RGBA8_OES;
194}
195
196GLenum ConvertTextureInternalFormat(DXGI_FORMAT format)
197{
198 switch (format)
199 {
200 case DXGI_FORMAT_R8G8B8A8_UNORM:
201 return GL_RGBA8_OES;
202 case DXGI_FORMAT_A8_UNORM:
203 return GL_ALPHA8_EXT;
204 case DXGI_FORMAT_BC1_UNORM:
205 return GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
206 case DXGI_FORMAT_BC2_UNORM:
207 return GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE;
208 case DXGI_FORMAT_BC3_UNORM:
209 return GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE;
210 case DXGI_FORMAT_R32G32B32A32_FLOAT:
211 return GL_RGBA32F_EXT;
212 case DXGI_FORMAT_R32G32B32_FLOAT:
213 return GL_RGB32F_EXT;
214 case DXGI_FORMAT_R16G16B16A16_FLOAT:
215 return GL_RGBA16F_EXT;
216 case DXGI_FORMAT_B8G8R8A8_UNORM:
217 return GL_BGRA8_EXT;
218 case DXGI_FORMAT_R8_UNORM:
219 return GL_R8_EXT;
220 case DXGI_FORMAT_R8G8_UNORM:
221 return GL_RG8_EXT;
222 case DXGI_FORMAT_R16_FLOAT:
223 return GL_R16F_EXT;
224 case DXGI_FORMAT_R16G16_FLOAT:
225 return GL_RG16F_EXT;
226 case DXGI_FORMAT_D24_UNORM_S8_UINT:
227 return GL_DEPTH24_STENCIL8_OES;
228 default:
229 UNREACHABLE();
230 }
231
232 return GL_RGBA8_OES;
233}
234
235}
236
237namespace gl_d3d11
238{
239
240DXGI_FORMAT ConvertRenderbufferFormat(GLenum format)
241{
242 switch (format)
243 {
244 case GL_RGBA4:
245 case GL_RGB5_A1:
246 case GL_RGBA8_OES:
247 case GL_RGB565:
248 case GL_RGB8_OES:
249 return DXGI_FORMAT_R8G8B8A8_UNORM;
250 case GL_DEPTH_COMPONENT16:
251 case GL_STENCIL_INDEX8:
252 case GL_DEPTH24_STENCIL8_OES:
253 return DXGI_FORMAT_D24_UNORM_S8_UINT;
254 default:
255 UNREACHABLE();
256 }
257
258 return DXGI_FORMAT_R8G8B8A8_UNORM;
259}
260
261DXGI_FORMAT ConvertTextureFormat(GLenum internalformat)
262{
263 switch (internalformat)
264 {
265 case GL_RGB565:
266 case GL_RGBA4:
267 case GL_RGB5_A1:
268 case GL_RGB8_OES:
269 case GL_RGBA8_OES:
270 case GL_LUMINANCE8_EXT:
271 case GL_LUMINANCE8_ALPHA8_EXT:
272 return DXGI_FORMAT_R8G8B8A8_UNORM;
273 case GL_ALPHA8_EXT:
274 return DXGI_FORMAT_A8_UNORM;
275 case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
276 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
277 return DXGI_FORMAT_BC1_UNORM;
278 case GL_COMPRESSED_RGBA_S3TC_DXT3_ANGLE:
279 return DXGI_FORMAT_BC2_UNORM;
280 case GL_COMPRESSED_RGBA_S3TC_DXT5_ANGLE:
281 return DXGI_FORMAT_BC3_UNORM;
282 case GL_RGBA32F_EXT:
283 case GL_ALPHA32F_EXT:
284 case GL_LUMINANCE_ALPHA32F_EXT:
285 return DXGI_FORMAT_R32G32B32A32_FLOAT;
286 case GL_RGB32F_EXT:
287 case GL_LUMINANCE32F_EXT:
288 return DXGI_FORMAT_R32G32B32_FLOAT;
289 case GL_RGBA16F_EXT:
290 case GL_ALPHA16F_EXT:
291 case GL_LUMINANCE_ALPHA16F_EXT:
292 case GL_RGB16F_EXT:
293 case GL_LUMINANCE16F_EXT:
294 return DXGI_FORMAT_R16G16B16A16_FLOAT;
295 case GL_BGRA8_EXT:
296 return DXGI_FORMAT_B8G8R8A8_UNORM;
297 case GL_R8_EXT:
298 return DXGI_FORMAT_R8_UNORM;
299 case GL_RG8_EXT:
300 return DXGI_FORMAT_R8G8_UNORM;
301 case GL_R16F_EXT:
302 return DXGI_FORMAT_R16_FLOAT;
303 case GL_RG16F_EXT:
304 return DXGI_FORMAT_R16G16_FLOAT;
305 case GL_DEPTH_COMPONENT16:
306 case GL_DEPTH_COMPONENT32_OES:
307 case GL_DEPTH24_STENCIL8_OES:
308 return DXGI_FORMAT_D24_UNORM_S8_UINT;
309 default:
310 UNREACHABLE();
311 }
312
313 return DXGI_FORMAT_R8G8B8A8_UNORM;
314}
315}