static void swapBuffers( D3DSurfaceData sd, final int x1, final int y1, final int x2, final int y2) { long pData = sd.getNativeOps(); D3DRenderQueue rq = D3DRenderQueue.getInstance(); // swapBuffers can be called from the toolkit thread by swing, we // should detect this and prevent the deadlocks if (rq.isRenderQueueThread()) { if (!rq.tryLock()) { // if we could not obtain the lock, repaint the area // that was supposed to be swapped, and no-op this swap final Component target = (Component) sd.getPeer().getTarget(); SunToolkit.executeOnEventHandlerThread( target, new Runnable() { public void run() { target.repaint(x1, y1, x2, y2); } }); return; } } else { rq.lock(); } try { RenderBuffer buf = rq.getBuffer(); rq.ensureCapacityAndAlignment(28, 4); buf.putInt(SWAP_BUFFERS); buf.putLong(pData); buf.putInt(x1); buf.putInt(y1); buf.putInt(x2); buf.putInt(y2); rq.flushNow(); } finally { rq.unlock(); } }