1 #include "precompiled.h"
3 // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style license that can be
5 // found in the LICENSE file.
8 // renderer9_utils.cpp: Conversion functions and other utility routines
9 // specific to the D3D9 renderer.
11 #include "libGLESv2/renderer/d3d9/renderer9_utils.h"
12 #include "common/mathutil.h"
13 #include "libGLESv2/Context.h"
15 #include "common/debug.h"
23 D3DCMPFUNC ConvertComparison(GLenum comparison)
25 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
28 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
29 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
30 case GL_LESS: d3dComp = D3DCMP_LESS; break;
31 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
32 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
33 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
34 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
35 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
36 default: UNREACHABLE();
42 D3DCOLOR ConvertColor(gl::ColorF color)
44 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
45 gl::unorm<8>(color.green),
46 gl::unorm<8>(color.blue),
47 gl::unorm<8>(color.alpha));
50 D3DBLEND ConvertBlendFunc(GLenum blend)
52 D3DBLEND d3dBlend = D3DBLEND_ZERO;
56 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
57 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
58 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
59 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
60 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
61 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
62 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
63 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
64 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
65 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
66 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
67 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
68 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
69 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
70 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
71 default: UNREACHABLE();
77 D3DBLENDOP ConvertBlendOp(GLenum blendOp)
79 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
83 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
84 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
85 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
86 case GL_MIN_EXT: d3dBlendOp = D3DBLENDOP_MIN; break;
87 case GL_MAX_EXT: d3dBlendOp = D3DBLENDOP_MAX; break;
88 default: UNREACHABLE();
94 D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
96 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
100 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
101 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
102 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
103 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
104 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
105 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
106 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
107 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
108 default: UNREACHABLE();
114 D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
116 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
120 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
121 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
122 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
123 default: UNREACHABLE();
129 D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
131 D3DCULL cull = D3DCULL_CCW;
135 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
138 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
140 case GL_FRONT_AND_BACK:
141 cull = D3DCULL_NONE; // culling will be handled during draw
143 default: UNREACHABLE();
149 D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace)
151 D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X;
155 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
156 face = D3DCUBEMAP_FACE_POSITIVE_X;
158 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
159 face = D3DCUBEMAP_FACE_NEGATIVE_X;
161 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
162 face = D3DCUBEMAP_FACE_POSITIVE_Y;
164 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
165 face = D3DCUBEMAP_FACE_NEGATIVE_Y;
167 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
168 face = D3DCUBEMAP_FACE_POSITIVE_Z;
170 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
171 face = D3DCUBEMAP_FACE_NEGATIVE_Z;
173 default: UNREACHABLE();
179 DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
181 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
182 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
183 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
184 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
187 D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy)
189 if (maxAnisotropy > 1.0f)
191 return D3DTEXF_ANISOTROPIC;
194 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
197 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
198 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
199 default: UNREACHABLE();
205 void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy)
210 *d3dMinFilter = D3DTEXF_POINT;
211 *d3dMipFilter = D3DTEXF_NONE;
214 *d3dMinFilter = D3DTEXF_LINEAR;
215 *d3dMipFilter = D3DTEXF_NONE;
217 case GL_NEAREST_MIPMAP_NEAREST:
218 *d3dMinFilter = D3DTEXF_POINT;
219 *d3dMipFilter = D3DTEXF_POINT;
221 case GL_LINEAR_MIPMAP_NEAREST:
222 *d3dMinFilter = D3DTEXF_LINEAR;
223 *d3dMipFilter = D3DTEXF_POINT;
225 case GL_NEAREST_MIPMAP_LINEAR:
226 *d3dMinFilter = D3DTEXF_POINT;
227 *d3dMipFilter = D3DTEXF_LINEAR;
229 case GL_LINEAR_MIPMAP_LINEAR:
230 *d3dMinFilter = D3DTEXF_LINEAR;
231 *d3dMipFilter = D3DTEXF_LINEAR;
234 *d3dMinFilter = D3DTEXF_POINT;
235 *d3dMipFilter = D3DTEXF_NONE;
239 if (maxAnisotropy > 1.0f)
241 *d3dMinFilter = D3DTEXF_ANISOTROPIC;