blob: 358d387c9199e70a69de05082934a136a3309ca1 [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//
Geoff Langcec35902014-04-16 10:52:36 -04003// Copyright (c) 2002-2014 The ANGLE Project Authors. All rights reserved.
daniel@transgaming.comd8e36562012-10-31 19:52:19 +00004// 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
Brandon Jonesc7a41042014-06-23 12:03:25 -070011#include "libGLESv2/renderer/d3d/d3d9/renderer9_utils.h"
12#include "libGLESv2/renderer/d3d/d3d9/formatutils9.h"
Geoff Langcec35902014-04-16 10:52:36 -040013#include "libGLESv2/formatutils.h"
shannonwoods@chromium.orga2ecfcc2013-05-30 00:11:59 +000014#include "common/mathutil.h"
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000015#include "libGLESv2/Context.h"
16
17#include "common/debug.h"
18
Geoff Langcec35902014-04-16 10:52:36 -040019#include "third_party/systeminfo/SystemInfo.h"
20
shannonwoods@chromium.orged0adcf2013-05-30 00:08:20 +000021namespace rx
22{
23
daniel@transgaming.com682a37c2012-11-28 19:34:44 +000024namespace gl_d3d9
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000025{
26
27D3DCMPFUNC ConvertComparison(GLenum comparison)
28{
29 D3DCMPFUNC d3dComp = D3DCMP_ALWAYS;
30 switch (comparison)
31 {
32 case GL_NEVER: d3dComp = D3DCMP_NEVER; break;
33 case GL_ALWAYS: d3dComp = D3DCMP_ALWAYS; break;
34 case GL_LESS: d3dComp = D3DCMP_LESS; break;
35 case GL_LEQUAL: d3dComp = D3DCMP_LESSEQUAL; break;
36 case GL_EQUAL: d3dComp = D3DCMP_EQUAL; break;
37 case GL_GREATER: d3dComp = D3DCMP_GREATER; break;
38 case GL_GEQUAL: d3dComp = D3DCMP_GREATEREQUAL; break;
39 case GL_NOTEQUAL: d3dComp = D3DCMP_NOTEQUAL; break;
40 default: UNREACHABLE();
41 }
42
43 return d3dComp;
44}
45
Geoff Lang2a64ee42013-05-31 11:22:40 -040046D3DCOLOR ConvertColor(gl::ColorF color)
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000047{
48 return D3DCOLOR_RGBA(gl::unorm<8>(color.red),
49 gl::unorm<8>(color.green),
50 gl::unorm<8>(color.blue),
51 gl::unorm<8>(color.alpha));
52}
53
54D3DBLEND ConvertBlendFunc(GLenum blend)
55{
56 D3DBLEND d3dBlend = D3DBLEND_ZERO;
57
58 switch (blend)
59 {
60 case GL_ZERO: d3dBlend = D3DBLEND_ZERO; break;
61 case GL_ONE: d3dBlend = D3DBLEND_ONE; break;
62 case GL_SRC_COLOR: d3dBlend = D3DBLEND_SRCCOLOR; break;
63 case GL_ONE_MINUS_SRC_COLOR: d3dBlend = D3DBLEND_INVSRCCOLOR; break;
64 case GL_DST_COLOR: d3dBlend = D3DBLEND_DESTCOLOR; break;
65 case GL_ONE_MINUS_DST_COLOR: d3dBlend = D3DBLEND_INVDESTCOLOR; break;
66 case GL_SRC_ALPHA: d3dBlend = D3DBLEND_SRCALPHA; break;
67 case GL_ONE_MINUS_SRC_ALPHA: d3dBlend = D3DBLEND_INVSRCALPHA; break;
68 case GL_DST_ALPHA: d3dBlend = D3DBLEND_DESTALPHA; break;
69 case GL_ONE_MINUS_DST_ALPHA: d3dBlend = D3DBLEND_INVDESTALPHA; break;
70 case GL_CONSTANT_COLOR: d3dBlend = D3DBLEND_BLENDFACTOR; break;
71 case GL_ONE_MINUS_CONSTANT_COLOR: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
72 case GL_CONSTANT_ALPHA: d3dBlend = D3DBLEND_BLENDFACTOR; break;
73 case GL_ONE_MINUS_CONSTANT_ALPHA: d3dBlend = D3DBLEND_INVBLENDFACTOR; break;
74 case GL_SRC_ALPHA_SATURATE: d3dBlend = D3DBLEND_SRCALPHASAT; break;
75 default: UNREACHABLE();
76 }
77
78 return d3dBlend;
79}
80
81D3DBLENDOP ConvertBlendOp(GLenum blendOp)
82{
83 D3DBLENDOP d3dBlendOp = D3DBLENDOP_ADD;
84
85 switch (blendOp)
86 {
87 case GL_FUNC_ADD: d3dBlendOp = D3DBLENDOP_ADD; break;
88 case GL_FUNC_SUBTRACT: d3dBlendOp = D3DBLENDOP_SUBTRACT; break;
89 case GL_FUNC_REVERSE_SUBTRACT: d3dBlendOp = D3DBLENDOP_REVSUBTRACT; break;
Geoff Lang496123f2014-02-12 11:33:51 -050090 case GL_MIN_EXT: d3dBlendOp = D3DBLENDOP_MIN; break;
91 case GL_MAX_EXT: d3dBlendOp = D3DBLENDOP_MAX; break;
daniel@transgaming.comd8e36562012-10-31 19:52:19 +000092 default: UNREACHABLE();
93 }
94
95 return d3dBlendOp;
96}
97
98D3DSTENCILOP ConvertStencilOp(GLenum stencilOp)
99{
100 D3DSTENCILOP d3dStencilOp = D3DSTENCILOP_KEEP;
101
102 switch (stencilOp)
103 {
104 case GL_ZERO: d3dStencilOp = D3DSTENCILOP_ZERO; break;
105 case GL_KEEP: d3dStencilOp = D3DSTENCILOP_KEEP; break;
106 case GL_REPLACE: d3dStencilOp = D3DSTENCILOP_REPLACE; break;
107 case GL_INCR: d3dStencilOp = D3DSTENCILOP_INCRSAT; break;
108 case GL_DECR: d3dStencilOp = D3DSTENCILOP_DECRSAT; break;
109 case GL_INVERT: d3dStencilOp = D3DSTENCILOP_INVERT; break;
110 case GL_INCR_WRAP: d3dStencilOp = D3DSTENCILOP_INCR; break;
111 case GL_DECR_WRAP: d3dStencilOp = D3DSTENCILOP_DECR; break;
112 default: UNREACHABLE();
113 }
114
115 return d3dStencilOp;
116}
117
118D3DTEXTUREADDRESS ConvertTextureWrap(GLenum wrap)
119{
120 D3DTEXTUREADDRESS d3dWrap = D3DTADDRESS_WRAP;
121
122 switch (wrap)
123 {
124 case GL_REPEAT: d3dWrap = D3DTADDRESS_WRAP; break;
125 case GL_CLAMP_TO_EDGE: d3dWrap = D3DTADDRESS_CLAMP; break;
126 case GL_MIRRORED_REPEAT: d3dWrap = D3DTADDRESS_MIRROR; break;
127 default: UNREACHABLE();
128 }
129
130 return d3dWrap;
131}
132
133D3DCULL ConvertCullMode(GLenum cullFace, GLenum frontFace)
134{
135 D3DCULL cull = D3DCULL_CCW;
136 switch (cullFace)
137 {
138 case GL_FRONT:
139 cull = (frontFace == GL_CCW ? D3DCULL_CW : D3DCULL_CCW);
140 break;
141 case GL_BACK:
142 cull = (frontFace == GL_CCW ? D3DCULL_CCW : D3DCULL_CW);
143 break;
144 case GL_FRONT_AND_BACK:
145 cull = D3DCULL_NONE; // culling will be handled during draw
146 break;
147 default: UNREACHABLE();
148 }
149
150 return cull;
151}
152
153D3DCUBEMAP_FACES ConvertCubeFace(GLenum cubeFace)
154{
155 D3DCUBEMAP_FACES face = D3DCUBEMAP_FACE_POSITIVE_X;
156
157 switch (cubeFace)
158 {
159 case GL_TEXTURE_CUBE_MAP_POSITIVE_X:
160 face = D3DCUBEMAP_FACE_POSITIVE_X;
161 break;
162 case GL_TEXTURE_CUBE_MAP_NEGATIVE_X:
163 face = D3DCUBEMAP_FACE_NEGATIVE_X;
164 break;
165 case GL_TEXTURE_CUBE_MAP_POSITIVE_Y:
166 face = D3DCUBEMAP_FACE_POSITIVE_Y;
167 break;
168 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y:
169 face = D3DCUBEMAP_FACE_NEGATIVE_Y;
170 break;
171 case GL_TEXTURE_CUBE_MAP_POSITIVE_Z:
172 face = D3DCUBEMAP_FACE_POSITIVE_Z;
173 break;
174 case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z:
175 face = D3DCUBEMAP_FACE_NEGATIVE_Z;
176 break;
177 default: UNREACHABLE();
178 }
179
180 return face;
181}
182
183DWORD ConvertColorMask(bool red, bool green, bool blue, bool alpha)
184{
185 return (red ? D3DCOLORWRITEENABLE_RED : 0) |
186 (green ? D3DCOLORWRITEENABLE_GREEN : 0) |
187 (blue ? D3DCOLORWRITEENABLE_BLUE : 0) |
188 (alpha ? D3DCOLORWRITEENABLE_ALPHA : 0);
189}
190
191D3DTEXTUREFILTERTYPE ConvertMagFilter(GLenum magFilter, float maxAnisotropy)
192{
193 if (maxAnisotropy > 1.0f)
194 {
195 return D3DTEXF_ANISOTROPIC;
196 }
197
198 D3DTEXTUREFILTERTYPE d3dMagFilter = D3DTEXF_POINT;
199 switch (magFilter)
200 {
201 case GL_NEAREST: d3dMagFilter = D3DTEXF_POINT; break;
202 case GL_LINEAR: d3dMagFilter = D3DTEXF_LINEAR; break;
203 default: UNREACHABLE();
204 }
205
206 return d3dMagFilter;
207}
208
209void ConvertMinFilter(GLenum minFilter, D3DTEXTUREFILTERTYPE *d3dMinFilter, D3DTEXTUREFILTERTYPE *d3dMipFilter, float maxAnisotropy)
210{
211 switch (minFilter)
212 {
213 case GL_NEAREST:
214 *d3dMinFilter = D3DTEXF_POINT;
215 *d3dMipFilter = D3DTEXF_NONE;
216 break;
217 case GL_LINEAR:
218 *d3dMinFilter = D3DTEXF_LINEAR;
219 *d3dMipFilter = D3DTEXF_NONE;
220 break;
221 case GL_NEAREST_MIPMAP_NEAREST:
222 *d3dMinFilter = D3DTEXF_POINT;
223 *d3dMipFilter = D3DTEXF_POINT;
224 break;
225 case GL_LINEAR_MIPMAP_NEAREST:
226 *d3dMinFilter = D3DTEXF_LINEAR;
227 *d3dMipFilter = D3DTEXF_POINT;
228 break;
229 case GL_NEAREST_MIPMAP_LINEAR:
230 *d3dMinFilter = D3DTEXF_POINT;
231 *d3dMipFilter = D3DTEXF_LINEAR;
232 break;
233 case GL_LINEAR_MIPMAP_LINEAR:
234 *d3dMinFilter = D3DTEXF_LINEAR;
235 *d3dMipFilter = D3DTEXF_LINEAR;
236 break;
237 default:
238 *d3dMinFilter = D3DTEXF_POINT;
239 *d3dMipFilter = D3DTEXF_NONE;
240 UNREACHABLE();
241 }
242
243 if (maxAnisotropy > 1.0f)
244 {
245 *d3dMinFilter = D3DTEXF_ANISOTROPIC;
246 }
247}
248
daniel@transgaming.comd8e36562012-10-31 19:52:19 +0000249}
shannonwoods@chromium.orged0adcf2013-05-30 00:08:20 +0000250
Geoff Langcec35902014-04-16 10:52:36 -0400251namespace d3d9_gl
252{
253
Geoff Lange4a492b2014-06-19 14:14:41 -0400254static gl::TextureCaps GenerateTextureFormatCaps(GLenum internalFormat, IDirect3D9 *d3d9, D3DDEVTYPE deviceType,
Geoff Langcec35902014-04-16 10:52:36 -0400255 UINT adapter, D3DFORMAT adapterFormat)
256{
257 gl::TextureCaps textureCaps;
258
Geoff Langcec35902014-04-16 10:52:36 -0400259 D3DFORMAT renderFormat = gl_d3d9::GetRenderFormat(internalFormat);
Geoff Lang5d601382014-07-22 15:14:06 -0400260 gl::InternalFormat formatInfo = gl::GetInternalFormatInfo(internalFormat);
261 if (formatInfo.depthBits > 0 || formatInfo.stencilBits > 0)
Geoff Lang6cf8e1b2014-07-03 13:03:57 -0400262 {
263 textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, renderFormat));
264 textureCaps.filterable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, renderFormat));
265 textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, renderFormat)) ||
266 SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, renderFormat));
267 }
268 else
269 {
270 D3DFORMAT textureFormat = gl_d3d9::GetTextureFormat(internalFormat);
271 textureCaps.texturable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_TEXTURE, textureFormat)) &&
272 SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, 0, D3DRTYPE_CUBETEXTURE, textureFormat));
273 textureCaps.filterable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_QUERY_FILTER, D3DRTYPE_TEXTURE, textureFormat));
274 textureCaps.renderable = SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_RENDERTARGET, D3DRTYPE_TEXTURE, textureFormat)) ||
275 SUCCEEDED(d3d9->CheckDeviceFormat(adapter, deviceType, adapterFormat, D3DUSAGE_DEPTHSTENCIL, D3DRTYPE_TEXTURE, textureFormat));
276 }
Geoff Langcec35902014-04-16 10:52:36 -0400277
278 textureCaps.sampleCounts.insert(1);
279 for (size_t i = D3DMULTISAMPLE_2_SAMPLES; i <= D3DMULTISAMPLE_16_SAMPLES; i++)
280 {
281 D3DMULTISAMPLE_TYPE multisampleType = D3DMULTISAMPLE_TYPE(i);
282
283 HRESULT result = d3d9->CheckDeviceMultiSampleType(adapter, deviceType, renderFormat, TRUE, multisampleType, NULL);
284 if (SUCCEEDED(result))
285 {
286 textureCaps.sampleCounts.insert(i);
287 }
288 }
289
290 return textureCaps;
291}
292
Geoff Langc0b9ef42014-07-02 10:02:37 -0400293void GenerateCaps(IDirect3D9 *d3d9, IDirect3DDevice9 *device, D3DDEVTYPE deviceType, UINT adapter, gl::Caps *caps,
294 gl::TextureCapsMap *textureCapsMap, gl::Extensions *extensions)
Geoff Langcec35902014-04-16 10:52:36 -0400295{
Geoff Langcec35902014-04-16 10:52:36 -0400296 D3DCAPS9 deviceCaps;
297 if (FAILED(d3d9->GetDeviceCaps(adapter, deviceType, &deviceCaps)))
298 {
299 // Can't continue with out device caps
Geoff Langc0b9ef42014-07-02 10:02:37 -0400300 return;
Geoff Langcec35902014-04-16 10:52:36 -0400301 }
302
303 D3DDISPLAYMODE currentDisplayMode;
304 d3d9->GetAdapterDisplayMode(adapter, &currentDisplayMode);
305
Geoff Lang5f4c4632014-07-03 13:46:52 -0400306 GLuint maxSamples = 0;
Geoff Lange4a492b2014-06-19 14:14:41 -0400307 const gl::FormatSet &allFormats = gl::GetAllSizedInternalFormats();
Geoff Langcec35902014-04-16 10:52:36 -0400308 for (gl::FormatSet::const_iterator internalFormat = allFormats.begin(); internalFormat != allFormats.end(); ++internalFormat)
309 {
Geoff Langc0b9ef42014-07-02 10:02:37 -0400310 gl::TextureCaps textureCaps = GenerateTextureFormatCaps(*internalFormat, d3d9, deviceType, adapter,
311 currentDisplayMode.Format);
312 textureCapsMap->insert(*internalFormat, textureCaps);
Geoff Lang5f4c4632014-07-03 13:46:52 -0400313
314 maxSamples = std::max(maxSamples, textureCaps.getMaxSamples());
Geoff Langcec35902014-04-16 10:52:36 -0400315 }
316
Geoff Langaae65a42014-05-26 12:43:44 -0400317 // GL core feature limits
Geoff Langc0b9ef42014-07-02 10:02:37 -0400318 caps->maxElementIndex = static_cast<GLint64>(std::numeric_limits<unsigned int>::max());
Geoff Langaae65a42014-05-26 12:43:44 -0400319
320 // 3D textures are unimplemented in D3D9
Geoff Langc0b9ef42014-07-02 10:02:37 -0400321 caps->max3DTextureSize = 1;
Geoff Langaae65a42014-05-26 12:43:44 -0400322
323 // Only one limit in GL, use the minimum dimension
Geoff Langc0b9ef42014-07-02 10:02:37 -0400324 caps->max2DTextureSize = std::min(deviceCaps.MaxTextureWidth, deviceCaps.MaxTextureHeight);
Geoff Langaae65a42014-05-26 12:43:44 -0400325
326 // D3D treats cube maps as a special case of 2D textures
Geoff Langc0b9ef42014-07-02 10:02:37 -0400327 caps->maxCubeMapTextureSize = caps->max2DTextureSize;
Geoff Langaae65a42014-05-26 12:43:44 -0400328
329 // Array textures are not available in D3D9
Geoff Langc0b9ef42014-07-02 10:02:37 -0400330 caps->maxArrayTextureLayers = 1;
Geoff Langaae65a42014-05-26 12:43:44 -0400331
332 // ES3-only feature
Geoff Langc0b9ef42014-07-02 10:02:37 -0400333 caps->maxLODBias = 0.0f;
Geoff Langaae65a42014-05-26 12:43:44 -0400334
335 // No specific limits on render target size, maximum 2D texture size is equivalent
Geoff Langc0b9ef42014-07-02 10:02:37 -0400336 caps->maxRenderbufferSize = caps->max2DTextureSize;
Geoff Langaae65a42014-05-26 12:43:44 -0400337
338 // Draw buffers are not supported in D3D9
Geoff Langc0b9ef42014-07-02 10:02:37 -0400339 caps->maxDrawBuffers = 1;
340 caps->maxColorAttachments = 1;
Geoff Langaae65a42014-05-26 12:43:44 -0400341
342 // No specific limits on viewport size, maximum 2D texture size is equivalent
Geoff Langc0b9ef42014-07-02 10:02:37 -0400343 caps->maxViewportWidth = caps->max2DTextureSize;
344 caps->maxViewportHeight = caps->maxViewportWidth;
Geoff Langaae65a42014-05-26 12:43:44 -0400345
346 // Point size is clamped to 1.0f when the shader model is less than 3
Geoff Langc0b9ef42014-07-02 10:02:37 -0400347 caps->minAliasedPointSize = 1.0f;
348 caps->maxAliasedPointSize = ((D3DSHADER_VERSION_MAJOR(deviceCaps.PixelShaderVersion) >= 3) ? deviceCaps.MaxPointSize : 1.0f);
Geoff Langaae65a42014-05-26 12:43:44 -0400349
350 // Wide lines not supported
Geoff Langc0b9ef42014-07-02 10:02:37 -0400351 caps->minAliasedLineWidth = 1.0f;
352 caps->maxAliasedLineWidth = 1.0f;
Geoff Langaae65a42014-05-26 12:43:44 -0400353
354 // GL extension support
Geoff Langc0b9ef42014-07-02 10:02:37 -0400355 extensions->setTextureExtensionSupport(*textureCapsMap);
356 extensions->elementIndexUint = deviceCaps.MaxVertexIndex >= (1 << 16);
357 extensions->packedDepthStencil = true;
358 extensions->getProgramBinary = true;
359 extensions->rgb8rgba8 = true;
360 extensions->readFormatBGRA = true;
361 extensions->pixelBufferObject = false;
362 extensions->mapBuffer = false;
363 extensions->mapBufferRange = false;
Geoff Langcec35902014-04-16 10:52:36 -0400364
365 // ATI cards on XP have problems with non-power-of-two textures.
366 D3DADAPTER_IDENTIFIER9 adapterId = { 0 };
367 if (SUCCEEDED(d3d9->GetAdapterIdentifier(adapter, 0, &adapterId)))
368 {
Geoff Langc0b9ef42014-07-02 10:02:37 -0400369 extensions->textureNPOT = !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_POW2) &&
Geoff Langcec35902014-04-16 10:52:36 -0400370 !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_CUBEMAP_POW2) &&
371 !(deviceCaps.TextureCaps & D3DPTEXTURECAPS_NONPOW2CONDITIONAL) &&
372 !(isWindowsVistaOrGreater() && adapterId.VendorId == VENDOR_ID_AMD);
373 }
374 else
375 {
Geoff Langc0b9ef42014-07-02 10:02:37 -0400376 extensions->textureNPOT = false;
Geoff Langcec35902014-04-16 10:52:36 -0400377 }
378
Geoff Langc0b9ef42014-07-02 10:02:37 -0400379 extensions->drawBuffers = false;
380 extensions->textureStorage = true;
Geoff Langcec35902014-04-16 10:52:36 -0400381
382 // Must support a minimum of 2:1 anisotropy for max anisotropy to be considered supported, per the spec
Geoff Langc0b9ef42014-07-02 10:02:37 -0400383 extensions->textureFilterAnisotropic = (deviceCaps.RasterCaps & D3DPRASTERCAPS_ANISOTROPY) != 0 && deviceCaps.MaxAnisotropy >= 2;
384 extensions->maxTextureAnisotropy = static_cast<GLfloat>(deviceCaps.MaxAnisotropy);
Geoff Langcec35902014-04-16 10:52:36 -0400385
386 // Check occlusion query support by trying to create one
387 IDirect3DQuery9 *occlusionQuery = NULL;
Geoff Langc0b9ef42014-07-02 10:02:37 -0400388 extensions->occlusionQueryBoolean = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_OCCLUSION, &occlusionQuery)) && occlusionQuery;
Geoff Langcec35902014-04-16 10:52:36 -0400389 SafeRelease(occlusionQuery);
390
391 // Check event query support by trying to create one
392 IDirect3DQuery9 *eventQuery = NULL;
Geoff Langc0b9ef42014-07-02 10:02:37 -0400393 extensions->fence = SUCCEEDED(device->CreateQuery(D3DQUERYTYPE_EVENT, &eventQuery)) && eventQuery;
Geoff Langcec35902014-04-16 10:52:36 -0400394 SafeRelease(eventQuery);
395
Geoff Langc0b9ef42014-07-02 10:02:37 -0400396 extensions->timerQuery = false; // Unimplemented
397 extensions->robustness = true;
398 extensions->blendMinMax = true;
399 extensions->framebufferBlit = true;
400 extensions->framebufferMultisample = true;
Geoff Lang5f4c4632014-07-03 13:46:52 -0400401 extensions->maxSamples = maxSamples;
Geoff Langc0b9ef42014-07-02 10:02:37 -0400402 extensions->instancedArrays = deviceCaps.PixelShaderVersion >= D3DPS_VERSION(3, 0);
403 extensions->packReverseRowOrder = true;
404 extensions->standardDerivatives = (deviceCaps.PS20Caps.Caps & D3DPS20CAPS_GRADIENTINSTRUCTIONS) != 0;
405 extensions->shaderTextureLOD = true;
406 extensions->fragDepth = true;
407 extensions->textureUsage = true;
408 extensions->translatedShaderSource = true;
409 extensions->colorBufferFloat = false;
Geoff Langcec35902014-04-16 10:52:36 -0400410}
411
412}
413
shannonwoods@chromium.orged0adcf2013-05-30 00:08:20 +0000414}