2
|
1 |
/*
|
|
2 |
* Copyright 2005-2007 Sun Microsystems, Inc. All Rights Reserved.
|
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
4 |
*
|
|
5 |
* This code is free software; you can redistribute it and/or modify it
|
|
6 |
* under the terms of the GNU General Public License version 2 only, as
|
|
7 |
* published by the Free Software Foundation. Sun designates this
|
|
8 |
* particular file as subject to the "Classpath" exception as provided
|
|
9 |
* by Sun in the LICENSE file that accompanied this code.
|
|
10 |
*
|
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that
|
|
15 |
* accompanied this code).
|
|
16 |
*
|
|
17 |
* You should have received a copy of the GNU General Public License version
|
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
20 |
*
|
|
21 |
* Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
|
|
22 |
* CA 95054 USA or visit www.sun.com if you need additional information or
|
|
23 |
* have any questions.
|
|
24 |
*/
|
|
25 |
|
|
26 |
package sun.java2d.d3d;
|
|
27 |
|
|
28 |
import java.awt.AlphaComposite;
|
|
29 |
import java.awt.GraphicsConfiguration;
|
|
30 |
import java.awt.Image;
|
|
31 |
import java.awt.Transparency;
|
|
32 |
import java.awt.image.ColorModel;
|
|
33 |
import java.awt.image.DirectColorModel;
|
|
34 |
import sun.awt.SunHints;
|
|
35 |
import sun.awt.Win32GraphicsConfig;
|
|
36 |
import sun.awt.Win32GraphicsDevice;
|
|
37 |
import sun.awt.image.SurfaceManager;
|
|
38 |
import sun.java2d.InvalidPipeException;
|
|
39 |
import sun.java2d.SunGraphics2D;
|
|
40 |
import sun.java2d.SurfaceData;
|
|
41 |
import sun.java2d.SurfaceDataProxy;
|
|
42 |
import sun.java2d.loops.GraphicsPrimitive;
|
|
43 |
import sun.java2d.loops.SurfaceType;
|
|
44 |
import sun.java2d.pipe.PixelToShapeConverter;
|
|
45 |
import sun.java2d.pipe.TextPipe;
|
|
46 |
import sun.java2d.windows.Win32OffScreenSurfaceData;
|
|
47 |
import sun.java2d.windows.Win32SurfaceData;
|
|
48 |
import sun.java2d.windows.WinVolatileSurfaceManager;
|
|
49 |
import sun.java2d.windows.WindowsFlags;
|
|
50 |
|
|
51 |
import static sun.java2d.windows.Win32SurfaceData.*;
|
|
52 |
|
|
53 |
public class D3DSurfaceData extends Win32OffScreenSurfaceData {
|
|
54 |
|
|
55 |
// properties of a surface
|
|
56 |
/**
|
|
57 |
* This property is used for a back-buffer surface
|
|
58 |
*/
|
|
59 |
public static final int D3D_ATTACHED_SURFACE = (1 << 15);
|
|
60 |
/**
|
|
61 |
* A surface with this property can be used as a Direct3D rendering
|
|
62 |
* destination.
|
|
63 |
*/
|
|
64 |
public static final int D3D_RENDER_TARGET = (1 << 16);
|
|
65 |
|
|
66 |
public static final int
|
|
67 |
D3D_INVALID_SURFACE = 0;
|
|
68 |
/**
|
|
69 |
* Surface is a Direct3D plain surface (not a texture).
|
|
70 |
* Plain surface can be used as render target.
|
|
71 |
* VolatileImages typically use plain surfaces as their hardware
|
|
72 |
* accelerated surfaces.
|
|
73 |
*/
|
|
74 |
public static final int
|
|
75 |
D3D_PLAIN_SURFACE = (1 << 0) | D3D_RENDER_TARGET;
|
|
76 |
/**
|
|
77 |
* Direct3D texture. Mostly used for cached accelerated surfaces.
|
|
78 |
* Surfaces of this type can be copied from using hardware acceleration
|
|
79 |
* by using texture mapping.
|
|
80 |
*/
|
|
81 |
public static final int
|
|
82 |
D3D_TEXTURE_SURFACE = (1 << 1);
|
|
83 |
/**
|
|
84 |
* Direct3D Backbuffer surface - an attached surface. Used for
|
|
85 |
* multibuffered BufferStrategies.
|
|
86 |
*/
|
|
87 |
public static final int
|
|
88 |
D3D_BACKBUFFER_SURFACE = D3D_PLAIN_SURFACE | D3D_ATTACHED_SURFACE;
|
|
89 |
/**
|
|
90 |
* Render-to-texture. A texture which can also be a render target.
|
|
91 |
* Combines the benefits of textures (fast copies-from) and
|
|
92 |
* backbuffers or plain surfaces (hw-accelerated rendering to the surface)
|
|
93 |
*/
|
|
94 |
public static final int
|
|
95 |
D3D_RTT_SURFACE = D3D_TEXTURE_SURFACE | D3D_RENDER_TARGET;
|
|
96 |
|
|
97 |
// supported texture pixel formats
|
|
98 |
public static final int PF_INVALID = 0;
|
|
99 |
public static final int PF_INT_ARGB = 1;
|
|
100 |
public static final int PF_INT_RGB = 2;
|
|
101 |
public static final int PF_INT_RGBX = 3;
|
|
102 |
public static final int PF_INT_BGR = 4;
|
|
103 |
public static final int PF_USHORT_565_RGB = 5;
|
|
104 |
public static final int PF_USHORT_555_RGB = 6;
|
|
105 |
public static final int PF_USHORT_555_RGBX = 7;
|
|
106 |
public static final int PF_INT_ARGB_PRE = 8;
|
|
107 |
public static final int PF_USHORT_4444_ARGB= 9;
|
|
108 |
|
|
109 |
public static final String
|
|
110 |
DESC_INT_ARGB_D3D = "Integer ARGB D3D with translucency";
|
|
111 |
public static final String
|
|
112 |
DESC_USHORT_4444_ARGB_D3D = "UShort 4444 ARGB D3D with translucency";
|
|
113 |
|
|
114 |
/**
|
|
115 |
* Surface type for texture destination. We cannot render textures to
|
|
116 |
* the screen because Direct3D is not clipped by the window's clip list,
|
|
117 |
* so we only enable the texture blit loops for copies to offscreen
|
|
118 |
* accelerated surfaces.
|
|
119 |
*/
|
|
120 |
public static final String
|
|
121 |
DESC_DEST_D3D = "D3D render target";
|
|
122 |
|
|
123 |
public static final SurfaceType D3DSurface =
|
|
124 |
SurfaceType.Any.deriveSubType("Direct3D Surface");
|
|
125 |
public static final SurfaceType D3DTexture =
|
|
126 |
D3DSurface.deriveSubType("Direct3D Texture");
|
|
127 |
|
|
128 |
/**
|
|
129 |
* D3D destination surface types (derive from offscreen dd surfaces).
|
|
130 |
* Note that all of these surfaces have the same surface description;
|
|
131 |
* we do not care about the depth of the surface since texture ops
|
|
132 |
* support multiple depths.
|
|
133 |
*/
|
|
134 |
public static final SurfaceType IntRgbD3D =
|
|
135 |
IntRgbDD.deriveSubType(DESC_DEST_D3D);
|
|
136 |
|
|
137 |
public static final SurfaceType IntRgbxD3D =
|
|
138 |
IntRgbxDD.deriveSubType(DESC_DEST_D3D);
|
|
139 |
|
|
140 |
public static final SurfaceType Ushort565RgbD3D =
|
|
141 |
Ushort565RgbDD.deriveSubType(DESC_DEST_D3D);
|
|
142 |
|
|
143 |
public static final SurfaceType Ushort555RgbxD3D =
|
|
144 |
Ushort555RgbxDD.deriveSubType(DESC_DEST_D3D);
|
|
145 |
|
|
146 |
public static final SurfaceType Ushort555RgbD3D =
|
|
147 |
Ushort555RgbDD.deriveSubType(DESC_DEST_D3D);
|
|
148 |
|
|
149 |
// REMIND: Is it possible to have d3d accelerated on this type of surface?
|
|
150 |
public static final SurfaceType ThreeByteBgrD3D =
|
|
151 |
ThreeByteBgrDD.deriveSubType(DESC_DEST_D3D);
|
|
152 |
|
|
153 |
public static final SurfaceType IntArgbD3D =
|
|
154 |
SurfaceType.IntArgb.deriveSubType(DESC_INT_ARGB_D3D);
|
|
155 |
|
|
156 |
public static final SurfaceType Ushort4444ArgbD3D =
|
|
157 |
SurfaceType.Ushort4444Argb.deriveSubType(DESC_USHORT_4444_ARGB_D3D);
|
|
158 |
|
|
159 |
// Textures we can render to using d3d
|
|
160 |
public static final SurfaceType IntRgbD3D_RTT =
|
|
161 |
IntRgbD3D.deriveSubType(DESC_DEST_D3D);
|
|
162 |
|
|
163 |
public static final SurfaceType IntRgbxD3D_RTT =
|
|
164 |
IntRgbxD3D.deriveSubType(DESC_DEST_D3D);
|
|
165 |
|
|
166 |
public static final SurfaceType Ushort565RgbD3D_RTT =
|
|
167 |
Ushort565RgbD3D.deriveSubType(DESC_DEST_D3D);
|
|
168 |
|
|
169 |
public static final SurfaceType Ushort555RgbxD3D_RTT =
|
|
170 |
Ushort555RgbxD3D.deriveSubType(DESC_DEST_D3D);
|
|
171 |
|
|
172 |
public static final SurfaceType Ushort555RgbD3D_RTT =
|
|
173 |
Ushort555RgbD3D.deriveSubType(DESC_DEST_D3D);
|
|
174 |
|
|
175 |
public static final SurfaceType Ushort4444ArgbD3D_RTT =
|
|
176 |
Ushort4444ArgbD3D.deriveSubType(DESC_DEST_D3D);
|
|
177 |
|
|
178 |
public static final SurfaceType IntArgbD3D_RTT =
|
|
179 |
IntArgbD3D.deriveSubType(DESC_DEST_D3D);
|
|
180 |
|
|
181 |
public static final SurfaceType ThreeByteBgrD3D_RTT =
|
|
182 |
ThreeByteBgrD3D.deriveSubType(DESC_DEST_D3D);
|
|
183 |
|
|
184 |
// the type of this surface - texture, plain, back-buffer
|
|
185 |
protected int type;
|
|
186 |
protected int pixelFormat;
|
|
187 |
|
|
188 |
private D3DContext d3dContext;
|
|
189 |
|
|
190 |
protected static D3DRenderer d3dPipe;
|
|
191 |
protected static PixelToShapeConverter d3dTxPipe;
|
|
192 |
protected static D3DTextRenderer d3dTextPipe;
|
|
193 |
protected static D3DDrawImage d3dDrawImagePipe;
|
|
194 |
|
|
195 |
private native void initOps(int depth, int transparency);
|
|
196 |
|
|
197 |
static {
|
|
198 |
if (WindowsFlags.isD3DEnabled()) {
|
|
199 |
D3DBlitLoops.register();
|
|
200 |
D3DMaskFill.register();
|
|
201 |
}
|
|
202 |
|
|
203 |
d3dPipe = new D3DRenderer();
|
|
204 |
d3dTxPipe = new PixelToShapeConverter(d3dPipe);
|
|
205 |
d3dTextPipe = new D3DTextRenderer();
|
|
206 |
d3dDrawImagePipe = new D3DDrawImage();
|
|
207 |
|
|
208 |
if (GraphicsPrimitive.tracingEnabled()) {
|
|
209 |
d3dPipe = d3dPipe.traceWrapD3D();
|
|
210 |
d3dTextPipe = d3dTextPipe.traceWrap();
|
|
211 |
}
|
|
212 |
}
|
|
213 |
|
|
214 |
@Override
|
|
215 |
public SurfaceDataProxy makeProxyFor(SurfaceData srcData) {
|
|
216 |
//D3D may be eliminated soon so no Proxy was created for it...
|
|
217 |
//return D3DSurfaceDataProxy.createProxy(srcData, graphicsConfig);
|
|
218 |
return SurfaceDataProxy.UNCACHED;
|
|
219 |
}
|
|
220 |
|
|
221 |
/**
|
|
222 |
* Non-public constructor. Use createData() to create an object.
|
|
223 |
*
|
|
224 |
* This constructor is used to house the common construction
|
|
225 |
* code shared between the creation of D3DSurfaceData objects
|
|
226 |
* and subclasses of D3DSurfaceData (such as D3DBackBufferSD).
|
|
227 |
*
|
|
228 |
* It calls the common constructor in the parent, and then
|
|
229 |
* initializes other shared D3D data.
|
|
230 |
*/
|
|
231 |
protected D3DSurfaceData(int width, int height,
|
|
232 |
int d3dSurfaceType,
|
|
233 |
SurfaceType sType, ColorModel cm,
|
|
234 |
GraphicsConfiguration gc,
|
|
235 |
Image image, int transparency)
|
|
236 |
{
|
|
237 |
super(width, height, sType, cm, gc, image, transparency);
|
|
238 |
this.type = d3dSurfaceType;
|
|
239 |
}
|
|
240 |
|
|
241 |
/**
|
|
242 |
* Private constructor. Use createData() to create an object.
|
|
243 |
*
|
|
244 |
* This constructor calls the common constructor above and then
|
|
245 |
* performs the specific initialization of the D3DSurface.
|
|
246 |
*/
|
|
247 |
private D3DSurfaceData(int width, int height,
|
|
248 |
int d3dSurfaceType,
|
|
249 |
SurfaceType sType, ColorModel cm,
|
|
250 |
GraphicsConfiguration gc,
|
|
251 |
Image image, int transparency,
|
|
252 |
int screen)
|
|
253 |
{
|
|
254 |
this(width, height, d3dSurfaceType, sType, cm, gc, image, transparency);
|
|
255 |
pixelFormat = initSurface(width, height, screen,
|
|
256 |
null /*parent SurfaceData*/);
|
|
257 |
}
|
|
258 |
|
|
259 |
public static D3DSurfaceData createData(int width, int height,
|
|
260 |
int d3dSurfaceType,
|
|
261 |
ColorModel cm,
|
|
262 |
GraphicsConfiguration gc,
|
|
263 |
Image image)
|
|
264 |
{
|
|
265 |
Win32GraphicsDevice gd = (Win32GraphicsDevice)gc.getDevice();
|
|
266 |
// After a display change ddInstance may not be
|
|
267 |
// recreated yet, and in this case isD3DEnabledOnDevice will
|
|
268 |
// return false, until someone attempted to recreate the
|
|
269 |
// primary.
|
|
270 |
if (!gd.isD3DEnabledOnDevice()) {
|
|
271 |
return null;
|
|
272 |
}
|
|
273 |
|
|
274 |
return new D3DSurfaceData(width, height,
|
|
275 |
d3dSurfaceType,
|
|
276 |
getSurfaceType(gc, cm, d3dSurfaceType),
|
|
277 |
cm, gc, image,
|
|
278 |
cm.getTransparency(), gd.getScreen());
|
|
279 |
}
|
|
280 |
|
|
281 |
int getPixelFormat() {
|
|
282 |
return pixelFormat;
|
|
283 |
}
|
|
284 |
|
|
285 |
static SurfaceType getSurfaceType(GraphicsConfiguration gc,
|
|
286 |
ColorModel cm,
|
|
287 |
int d3dSurfaceType)
|
|
288 |
{
|
|
289 |
if (d3dSurfaceType == D3D_TEXTURE_SURFACE) {
|
|
290 |
// for non-rtt textures we have only one surface type
|
|
291 |
return D3DTexture;
|
|
292 |
} else {
|
|
293 |
int pixelSize = cm.getPixelSize();
|
|
294 |
Win32GraphicsDevice gd = (Win32GraphicsDevice)gc.getDevice();
|
|
295 |
int transparency = cm.getTransparency();
|
|
296 |
|
|
297 |
// We'll attempt to use render-to-texture if render target is
|
|
298 |
// requested, but it's not a back-buffer and we support RTT
|
|
299 |
// for this configuration.
|
|
300 |
boolean useRTT =
|
|
301 |
((d3dSurfaceType & D3D_RENDER_TARGET) != 0) &&
|
|
302 |
((d3dSurfaceType & D3D_BACKBUFFER_SURFACE) == 0) &&
|
|
303 |
gd.getD3DContext().isRTTSupported();
|
|
304 |
|
|
305 |
// if there's no RTT available, we can't accelerate non-opaque
|
|
306 |
// surfaces, so we return null.
|
|
307 |
if (transparency == Transparency.TRANSLUCENT ||
|
|
308 |
transparency == Transparency.BITMASK)
|
|
309 |
{
|
|
310 |
if (pixelSize == 16) {
|
|
311 |
return useRTT ? Ushort4444ArgbD3D_RTT :
|
|
312 |
null/*Ushort4444ArgbD3D*/;
|
|
313 |
} else {
|
|
314 |
return useRTT ? IntArgbD3D_RTT : null/*IntArgbD3D*/;
|
|
315 |
}
|
|
316 |
} else {
|
|
317 |
// it's an opaque surface, either a VI or a back-buffer
|
|
318 |
switch (pixelSize) {
|
|
319 |
case 32:
|
|
320 |
case 24:
|
|
321 |
if (cm instanceof DirectColorModel) {
|
|
322 |
if (((DirectColorModel)cm).getRedMask() == 0xff0000) {
|
|
323 |
return useRTT ? IntRgbD3D_RTT : IntRgbD3D;
|
|
324 |
} else {
|
|
325 |
return useRTT ? IntRgbxD3D_RTT : IntRgbxD3D;
|
|
326 |
}
|
|
327 |
} else {
|
|
328 |
return useRTT ? ThreeByteBgrD3D_RTT : ThreeByteBgrD3D;
|
|
329 |
}
|
|
330 |
case 15:
|
|
331 |
return useRTT ? Ushort555RgbD3D_RTT : Ushort555RgbD3D;
|
|
332 |
case 16:
|
|
333 |
if ((cm instanceof DirectColorModel) &&
|
|
334 |
(((DirectColorModel)cm).getBlueMask() == 0x3e))
|
|
335 |
{
|
|
336 |
return useRTT ? Ushort555RgbxD3D_RTT : Ushort555RgbxD3D;
|
|
337 |
} else {
|
|
338 |
return useRTT ? Ushort565RgbD3D_RTT : Ushort565RgbD3D;
|
|
339 |
}
|
|
340 |
case 8: // not supported
|
|
341 |
default:
|
|
342 |
throw new sun.java2d.InvalidPipeException("Unsupported bit " +
|
|
343 |
"depth: " +
|
|
344 |
cm.getPixelSize());
|
|
345 |
}
|
|
346 |
}
|
|
347 |
}
|
|
348 |
}
|
|
349 |
|
|
350 |
private native int initOffScreenSurface(long pCtx,
|
|
351 |
long pData, long parentPdata,
|
|
352 |
int width, int height,
|
|
353 |
int type, int screen);
|
|
354 |
|
|
355 |
protected int initSurface(int width, int height, int screen,
|
|
356 |
Win32SurfaceData parentData)
|
|
357 |
{
|
|
358 |
int pFormat = PF_INVALID;
|
|
359 |
|
|
360 |
synchronized (D3DContext.LOCK) {
|
|
361 |
long pData = getNativeOps();
|
|
362 |
long pDataParent = 0L;
|
|
363 |
if (parentData != null) {
|
|
364 |
pDataParent = parentData.getNativeOps();
|
|
365 |
}
|
|
366 |
D3DContext d3dContext = getContext();
|
|
367 |
long pCtx = d3dContext.getNativeContext();
|
|
368 |
// native context could be 0 if the context is currently invalid,
|
|
369 |
// so attempt to revalidate
|
|
370 |
if (pCtx == 0) {
|
|
371 |
d3dContext.reinitNativeContext();
|
|
372 |
pCtx = d3dContext.getNativeContext();
|
|
373 |
}
|
|
374 |
if (pData != 0 && pCtx != 0) {
|
|
375 |
pFormat = initOffScreenSurface(pCtx,
|
|
376 |
pData, pDataParent,
|
|
377 |
width, height, type, screen);
|
|
378 |
} else {
|
|
379 |
// if the context can't be restored, give up for now.
|
|
380 |
throw new InvalidPipeException("D3DSD.initSurface: pData " +
|
|
381 |
"or pCtx is null");
|
|
382 |
}
|
|
383 |
}
|
|
384 |
return pFormat;
|
|
385 |
}
|
|
386 |
|
|
387 |
@Override
|
|
388 |
public void validatePipe(SunGraphics2D sg2d) {
|
|
389 |
// we don't support COMP_XOR yet..
|
|
390 |
if (sg2d.compositeState < sg2d.COMP_XOR) {
|
|
391 |
TextPipe textpipe;
|
|
392 |
boolean validated = false;
|
|
393 |
|
|
394 |
if (((sg2d.compositeState <= sg2d.COMP_ISCOPY &&
|
|
395 |
sg2d.paintState <= sg2d.PAINT_ALPHACOLOR) ||
|
|
396 |
(sg2d.compositeState == sg2d.COMP_ALPHA &&
|
|
397 |
sg2d.paintState <= sg2d.PAINT_ALPHACOLOR &&
|
|
398 |
(((AlphaComposite)sg2d.composite).getRule() ==
|
|
399 |
AlphaComposite.SRC_OVER))) &&
|
|
400 |
sg2d.textAntialiasHint <= SunHints.INTVAL_TEXT_ANTIALIAS_GASP)
|
|
401 |
{
|
|
402 |
// D3DTextRenderer handles both AA and non-AA text, but
|
|
403 |
// only works if composite is SrcNoEa or SrcOver
|
|
404 |
textpipe = d3dTextPipe;
|
|
405 |
} else {
|
|
406 |
// do this to initialize textpipe correctly; we will attempt
|
|
407 |
// to override the non-text pipes below
|
|
408 |
super.validatePipe(sg2d);
|
|
409 |
textpipe = sg2d.textpipe;
|
|
410 |
validated = true;
|
|
411 |
}
|
|
412 |
|
|
413 |
if (sg2d.antialiasHint != SunHints.INTVAL_ANTIALIAS_ON &&
|
|
414 |
sg2d.paintState <= sg2d.PAINT_ALPHACOLOR)
|
|
415 |
{
|
|
416 |
sg2d.drawpipe =
|
|
417 |
sg2d.strokeState == sg2d.STROKE_THIN ? d3dPipe : d3dTxPipe;
|
|
418 |
sg2d.fillpipe = d3dPipe;
|
|
419 |
sg2d.shapepipe = d3dPipe;
|
|
420 |
} else if (!validated) {
|
|
421 |
super.validatePipe(sg2d);
|
|
422 |
}
|
|
423 |
// install the text pipe based on our earlier decision
|
|
424 |
sg2d.textpipe = textpipe;
|
|
425 |
} else {
|
|
426 |
super.validatePipe(sg2d);
|
|
427 |
}
|
|
428 |
|
|
429 |
// always override the image pipe with the specialized D3D pipe
|
|
430 |
sg2d.imagepipe = d3dDrawImagePipe;
|
|
431 |
}
|
|
432 |
|
|
433 |
/**
|
|
434 |
* Disables D3D acceleration on the surface manager of this surfaceData
|
|
435 |
* object. This can happen when we encounter a hard error in rendering a D3D
|
|
436 |
* primitive (for example, if we were unable to set a surface as D3D target
|
|
437 |
* surface).
|
|
438 |
* Upon next validation the SurfaceManager will create a non-D3D surface.
|
|
439 |
*/
|
|
440 |
public void disableD3D() {
|
|
441 |
markSurfaceLost();
|
|
442 |
SurfaceManager sMgr = SurfaceManager.getManager(image);
|
|
443 |
if (sMgr instanceof WinVolatileSurfaceManager) {
|
|
444 |
((WinVolatileSurfaceManager)sMgr).setD3DAccelerationEnabled(false);
|
|
445 |
}
|
|
446 |
}
|
|
447 |
|
|
448 |
@Override
|
|
449 |
public boolean surfacePunted() {
|
|
450 |
// Punting is disabled for D3D surfaces
|
|
451 |
return false;
|
|
452 |
}
|
|
453 |
|
|
454 |
D3DContext getContext() {
|
|
455 |
return ((Win32GraphicsDevice)graphicsConfig.getDevice()).getD3DContext();
|
|
456 |
}
|
|
457 |
}
|