blob: b78f5f524f147e5187e9390edc5c8836edc4dbdb [file] [log] [blame]
shannon.woods@transgaming.combdf2d802013-02-28 23:16:20 +00001#include "precompiled.h"
daniel@transgaming.comd8e36562012-10-31 19:52:19 +00002//
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.
6//
7
8// renderer9_utils.cpp: Conversion functions and other utility routines
9// specific to the D3D9 renderer.
10
11#include "libGLESv2/renderer/renderer9_utils.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000012#include "common/mathutil.h"
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000013#include "libGLESv2/Context.h"
14
15#include "common/debug.h"
16
shannonwoods@chromium.orged0adcf2013-05-30 00:08:20 +000017namespace rx
18{
19
daniel@transgaming.com682a37c2012-11-28 19:34:44 +000020namespace gl_d3d9
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000021{
22
23D3DCMPFUNC ConvertComparison(GLenum comparison)
24{
25 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
26 switch (comparison)
27 {
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();
37 }
38
39 return d3dComp;
40}
41
42D3DCOLOR ConvertColor(gl::Color color)
43{
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));
48}
49
50D3DBLEND ConvertBlendFunc(GLenum blend)
51{
52 D3DBLEND d3dBlend = D3DBLEND_ZERO;
53
54 switch (blend)
55 {
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();
72 }
73
74 return d3dBlend;
75}
76
77D3DBLENDOP ConvertBlendOp(GLenum blendOp)
78{
79 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
80
81 switch (blendOp)
82 {
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 default: UNREACHABLE();
87 }
88
89 return d3dBlendOp;
90}
91
92D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
93{
94 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
95
96 switch (stencilOp)
97 {
98 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
99 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
100 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
101 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
102 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
103 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
104 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
105 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
106 default: UNREACHABLE();
107 }
108
109 return d3dStencilOp;
110}
111
112D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
113{
114 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
115
116 switch (wrap)
117 {
118 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
119 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
120 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
121 default: UNREACHABLE();
122 }
123
124 return d3dWrap;
125}
126
127D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
128{
129 D3DCULL cull = D3DCULL_CCW;
130 switch (cullFace)
131 {
132 case GL_FRONT:
133 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
134 break;
135 case GL_BACK:
136 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
137 break;
138 case GL_FRONT_AND_BACK:
139 cull = D3DCULL_NONE; // culling will be handled during draw
140 break;
141 default: UNREACHABLE();
142 }
143
144 return cull;
145}
146
147D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace)
148{
149 D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X;
150
151 switch (cubeFace)
152 {
153 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
154 face = D3DCUBEMAP_FACE_POSITIVE_X;
155 break;
156 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
157 face = D3DCUBEMAP_FACE_NEGATIVE_X;
158 break;
159 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
160 face = D3DCUBEMAP_FACE_POSITIVE_Y;
161 break;
162 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
163 face = D3DCUBEMAP_FACE_NEGATIVE_Y;
164 break;
165 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
166 face = D3DCUBEMAP_FACE_POSITIVE_Z;
167 break;
168 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
169 face = D3DCUBEMAP_FACE_NEGATIVE_Z;
170 break;
171 default: UNREACHABLE();
172 }
173
174 return face;
175}
176
177DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
178{
179 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
180 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
181 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
182 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
183}
184
185D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy)
186{
187 if (maxAnisotropy > 1.0f)
188 {
189 return D3DTEXF_ANISOTROPIC;
190 }
191
192 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
193 switch (magFilter)
194 {
195 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
196 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
197 default: UNREACHABLE();
198 }
199
200 return d3dMagFilter;
201}
202
203void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy)
204{
205 switch (minFilter)
206 {
207 case GL_NEAREST:
208 *d3dMinFilter = D3DTEXF_POINT;
209 *d3dMipFilter = D3DTEXF_NONE;
210 break;
211 case GL_LINEAR:
212 *d3dMinFilter = D3DTEXF_LINEAR;
213 *d3dMipFilter = D3DTEXF_NONE;
214 break;
215 case GL_NEAREST_MIPMAP_NEAREST:
216 *d3dMinFilter = D3DTEXF_POINT;
217 *d3dMipFilter = D3DTEXF_POINT;
218 break;
219 case GL_LINEAR_MIPMAP_NEAREST:
220 *d3dMinFilter = D3DTEXF_LINEAR;
221 *d3dMipFilter = D3DTEXF_POINT;
222 break;
223 case GL_NEAREST_MIPMAP_LINEAR:
224 *d3dMinFilter = D3DTEXF_POINT;
225 *d3dMipFilter = D3DTEXF_LINEAR;
226 break;
227 case GL_LINEAR_MIPMAP_LINEAR:
228 *d3dMinFilter = D3DTEXF_LINEAR;
229 *d3dMipFilter = D3DTEXF_LINEAR;
230 break;
231 default:
232 *d3dMinFilter = D3DTEXF_POINT;
233 *d3dMipFilter = D3DTEXF_NONE;
234 UNREACHABLE();
235 }
236
237 if (maxAnisotropy > 1.0f)
238 {
239 *d3dMinFilter = D3DTEXF_ANISOTROPIC;
240 }
241}
242
daniel@transgaming.comd8e36562012-10-31 19:52:19 +0000243}
shannonwoods@chromium.orged0adcf2013-05-30 00:08:20 +0000244
245}