0N/A/*
2362N/A * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
862N/A#include "D3DPipeline.h"
430N/A#include <jlong.h>
0N/A#include "D3DSurfaceData.h"
430N/A#include "D3DPipelineManager.h"
0N/A#include "Trace.h"
430N/A#include "awt_Toolkit.h"
430N/A#include "awt_Window.h"
430N/A#include "awt_BitmapUtil.h"
430N/A#include "D3DRenderQueue.h"
430N/A
430N/A// REMIND: move to awt_Component.h
430N/Aextern "C" HWND AwtComponent_GetHWnd(JNIEnv *env, jlong pData);
430N/A
430N/A/**
430N/A * Initializes nativeWidth/Height fields of the SurfaceData object with
430N/A * dimensions on the native surface.
430N/A */
430N/Avoid D3DSD_SetNativeDimensions(JNIEnv *env, D3DSDOps *d3dsdo) {
430N/A jobject sdObject;
430N/A jint width, height;
430N/A
430N/A RETURN_IF_NULL(sdObject = env->NewLocalRef(d3dsdo->sdOps.sdObject));
430N/A
430N/A if (d3dsdo->pResource != NULL) {
430N/A width = d3dsdo->pResource->GetDesc()->Width;
430N/A height = d3dsdo->pResource->GetDesc()->Height;
430N/A } else {
430N/A width = d3dsdo->width;
430N/A height = d3dsdo->height;
430N/A }
430N/A
430N/A JNU_SetFieldByName(env, NULL, sdObject, "nativeWidth", "I", width);
430N/A JNU_SetFieldByName(env, NULL, sdObject, "nativeHeight", "I", height);
430N/A
430N/A env->DeleteLocalRef(sdObject);
430N/A}
430N/A
430N/Avoid D3DSD_Flush(void *pData)
430N/A{
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSD_Flush");
430N/A RETURN_IF_NULL(pData);
430N/A
430N/A D3DSDOps *d3dsdo = (D3DSDOps*)pData;
430N/A if (d3dsdo->pResource != NULL) {
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A
430N/A d3dsdo->pResource->SetSDOps(NULL);
430N/A
430N/A if ((pMgr = D3DPipelineManager::GetInstance()) != NULL &&
430N/A SUCCEEDED(pMgr->GetD3DContext(d3dsdo->adapter, &pCtx)))
430N/A {
430N/A if (pCtx->GetResourceManager()) {
430N/A pCtx->GetResourceManager()->ReleaseResource(d3dsdo->pResource);
430N/A }
430N/A }
430N/A d3dsdo->pResource = NULL;
430N/A }
430N/A}
0N/A
430N/Avoid
430N/AD3DSD_MarkLost(void *pData)
430N/A{
430N/A D3DSDOps *d3dsdo;
430N/A jobject sdObject;
430N/A JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSD_MarkLost");
430N/A
430N/A RETURN_IF_NULL(pData);
430N/A
430N/A d3dsdo = (D3DSDOps*)pData;
430N/A RETURN_IF_NULL(sdObject = env->NewLocalRef(d3dsdo->sdOps.sdObject));
430N/A
430N/A JNU_CallMethodByName(env, NULL, sdObject,
430N/A "setSurfaceLost", "(Z)V", JNI_TRUE);
430N/A
430N/A env->DeleteLocalRef(sdObject);
430N/A}
430N/A
430N/A// ------------ generic SurfaceData.h functions ----------------
430N/A
430N/Avoid
430N/AD3DSD_Dispose(JNIEnv *env, SurfaceDataOps *ops)
430N/A{
430N/A D3DSDOps *d3dsdo = (D3DSDOps *)ops;
430N/A RETURN_IF_NULL(d3dsdo);
430N/A
430N/A JNU_CallStaticMethodByName(env, NULL, "sun/java2d/d3d/D3DSurfaceData",
430N/A "dispose", "(J)V",
430N/A ptr_to_jlong(ops));
430N/A}
0N/A
430N/A/**
430N/A * This is the implementation of the general surface LockFunc defined in
430N/A * SurfaceData.h.
430N/A */
430N/Ajint
430N/AD3DSD_Lock(JNIEnv *env,
430N/A SurfaceDataOps *ops,
430N/A SurfaceDataRasInfo *pRasInfo,
430N/A jint lockflags)
430N/A{
430N/A JNU_ThrowInternalError(env, "D3DSD_Lock not implemented!");
430N/A return SD_FAILURE;
430N/A}
430N/A
430N/A/**
430N/A * This is the implementation of the general GetRasInfoFunc defined in
430N/A * SurfaceData.h.
430N/A */
430N/Avoid
430N/AD3DSD_GetRasInfo(JNIEnv *env,
430N/A SurfaceDataOps *ops,
430N/A SurfaceDataRasInfo *pRasInfo)
430N/A{
430N/A JNU_ThrowInternalError(env, "D3DSD_GetRasInfo not implemented!");
430N/A}
430N/A
430N/A/**
430N/A * This is the implementation of the general surface UnlockFunc defined in
430N/A * SurfaceData.h.
430N/A */
430N/Avoid
430N/AD3DSD_Unlock(JNIEnv *env,
430N/A SurfaceDataOps *ops,
430N/A SurfaceDataRasInfo *pRasInfo)
430N/A{
430N/A JNU_ThrowInternalError(env, "D3DSD_Unlock not implemented!");
430N/A}
430N/A
430N/A// ------------ D3DSurfaceData's JNI methods ----------------
430N/A
0N/A
0N/Aextern "C" {
0N/A
0N/A/*
0N/A * Class: sun_java2d_d3d_D3DSurfaceData
0N/A * Method: initOps
430N/A * Signature: (III)V
0N/A */
430N/AJNIEXPORT void
430N/AJNICALL Java_sun_java2d_d3d_D3DSurfaceData_initOps
430N/A (JNIEnv *env, jobject d3dsd, jint gdiScreen, jint width, jint height)
0N/A{
430N/A D3DPipelineManager *pMgr;
430N/A D3DSDOps *d3dsdo = (D3DSDOps *)SurfaceData_InitOps(env, d3dsd,
430N/A sizeof(D3DSDOps));
430N/A
0N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_initOps");
430N/A
430N/A if (d3dsdo == NULL) {
430N/A JNU_ThrowOutOfMemoryError(env, "creating native d3d ops");
430N/A return;
0N/A }
430N/A
430N/A d3dsdo->sdOps.Lock = D3DSD_Lock;
430N/A d3dsdo->sdOps.GetRasInfo = D3DSD_GetRasInfo;
430N/A d3dsdo->sdOps.Unlock = D3DSD_Unlock;
430N/A d3dsdo->sdOps.Dispose = D3DSD_Dispose;
430N/A
430N/A d3dsdo->xoff = 0;
430N/A d3dsdo->yoff = 0;
430N/A d3dsdo->width = width;
430N/A d3dsdo->height = height;
430N/A
430N/A d3dsdo->pResource = NULL;
430N/A
430N/A d3dsdo->adapter =
430N/A (pMgr = D3DPipelineManager::GetInstance()) == NULL ?
430N/A D3DADAPTER_DEFAULT :
430N/A pMgr->GetAdapterOrdinalForScreen(gdiScreen);
430N/A}
430N/A
430N/A
430N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: initTexture
430N/A * Signature: (JZZ)Z
430N/A */
430N/AJNIEXPORT jboolean
430N/AJNICALL Java_sun_java2d_d3d_D3DSurfaceData_initTexture
430N/A (JNIEnv *env, jobject d3dsd,
430N/A jlong pData, jboolean isRTT, jboolean isOpaque)
430N/A{
430N/A HRESULT res;
430N/A D3DSDOps *d3dsdo;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A D3DFORMAT format;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_initTexture");
430N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), JNI_FALSE);
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return JNI_FALSE;
430N/A }
430N/A RETURN_STATUS_IF_NULL(pCtx->GetResourceManager(), JNI_FALSE);
430N/A
430N/A pCtx->GetResourceManager()->ReleaseResource(d3dsdo->pResource);
430N/A d3dsdo->pResource = NULL;
430N/A
430N/A if (isRTT && isOpaque) {
430N/A format = pCtx->GetPresentationParams()->BackBufferFormat;
430N/A } else {
430N/A format = D3DFMT_UNKNOWN;
430N/A }
430N/A
430N/A res = pCtx->GetResourceManager()->
430N/A CreateTexture(d3dsdo->width, d3dsdo->height,
430N/A isRTT, isOpaque,
430N/A &format, 0/*usage*/, &d3dsdo->pResource);
430N/A if (SUCCEEDED(res)) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE,
430N/A " created texture pResource=%x", d3dsdo->pResource);
430N/A d3dsdo->pResource->SetSDOps(d3dsdo);
430N/A } else {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A }
430N/A D3DSD_SetNativeDimensions(env, d3dsdo);
430N/A
430N/A return SUCCEEDED(res);
0N/A}
0N/A
430N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: initPlain
430N/A * Signature: (JZ)Z
430N/A */
430N/AJNIEXPORT jboolean JNICALL
430N/AJava_sun_java2d_d3d_D3DSurfaceData_initRTSurface
430N/A (JNIEnv *env, jobject d3dsd, jlong pData, jboolean isOpaque)
0N/A{
430N/A HRESULT res;
430N/A D3DSDOps *d3dsdo;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A D3DFORMAT format = D3DFMT_UNKNOWN;
0N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_initRTSurface");
430N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), JNI_FALSE);
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
0N/A return JNI_FALSE;
0N/A }
430N/A RETURN_STATUS_IF_NULL(pCtx->GetResourceManager(), JNI_FALSE);
430N/A
430N/A pCtx->GetResourceManager()->ReleaseResource(d3dsdo->pResource);
430N/A d3dsdo->pResource = NULL;
430N/A
430N/A res = pCtx->GetResourceManager()->
430N/A CreateRTSurface(d3dsdo->width, d3dsdo->height,
430N/A isOpaque, FALSE /*lockable*/,
430N/A &format, &d3dsdo->pResource);
430N/A if (SUCCEEDED(res)) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE, " created RT surface pResource=0x%x",
430N/A d3dsdo->pResource);
430N/A d3dsdo->pResource->SetSDOps(d3dsdo);
430N/A } else {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A }
430N/A D3DSD_SetNativeDimensions(env, d3dsdo);
430N/A
430N/A return SUCCEEDED(res);
430N/A}
430N/A
430N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: initFlipBackbuffer
430N/A * Signature: (JJIZ)Z
430N/A */
430N/AJNIEXPORT jboolean
430N/AJNICALL Java_sun_java2d_d3d_D3DSurfaceData_initFlipBackbuffer
430N/A (JNIEnv *env, jobject d3dsd, jlong pData, jlong pPeerData,
430N/A jint numBuffers, jint swapEffect,
430N/A jint vSyncType)
430N/A{
430N/A HRESULT res;
430N/A D3DSDOps *d3dsdo;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A HWND hWnd;
430N/A UINT presentationInterval;
430N/A AwtComponent *pPeer;
430N/A RECT r = { 0, 0, 0, 0 };
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_initFlipBackbuffer");
430N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pPeer = (AwtComponent *)jlong_to_ptr(pPeerData),
430N/A JNI_FALSE);
430N/A
430N/A hWnd = pPeer->GetHWnd();
430N/A if (!IsWindow(hWnd)) {
430N/A J2dTraceLn(J2D_TRACE_WARNING,
430N/A "D3DSurfaceData_initFlipBackbuffer: disposed component");
430N/A return JNI_FALSE;
430N/A }
430N/A
430N/A pPeer->GetInsets(&r);
430N/A d3dsdo->xoff = -r.left;
430N/A d3dsdo->yoff = -r.top;
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return JNI_FALSE;
430N/A }
430N/A RETURN_STATUS_IF_NULL(pCtx->GetResourceManager(), JNI_FALSE);
430N/A
430N/A pCtx->GetResourceManager()->ReleaseResource(d3dsdo->pResource);
430N/A d3dsdo->pResource = NULL;
430N/A
430N/A d3dsdo->swapEffect = (D3DSWAPEFFECT)swapEffect;
430N/A
430N/A // in full-screen mode we should v-sync
430N/A if (pCtx->GetPresentationParams()->Windowed) {
430N/A if (vSyncType == VSYNC_ON) {
430N/A presentationInterval = D3DPRESENT_INTERVAL_ONE;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE,
430N/A " windowed, forced interval: ONE");
430N/A } else {
430N/A presentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE,
430N/A " windowed, default interval: IMMEDIATE");
430N/A }
430N/A
430N/A // REMIND: this is a workaround for the current issue
430N/A // we have with non-copy flip chains: since we can not specify
430N/A // the dest rectangle for Present for these modes, the result of
430N/A // Present(NULL, NULL) is scaled to the client area.
430N/A if (d3dsdo->xoff != 0 || d3dsdo->yoff != 0) {
430N/A d3dsdo->swapEffect = D3DSWAPEFFECT_COPY;
430N/A }
430N/A } else {
430N/A if (vSyncType == VSYNC_OFF) {
430N/A presentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE,
430N/A " full-screen, forced interval: IMMEDIATE");
430N/A } else {
430N/A presentationInterval = D3DPRESENT_INTERVAL_ONE;
430N/A J2dTraceLn(J2D_TRACE_VERBOSE,
430N/A " full-screen, default interval: ONE");
430N/A }
430N/A }
430N/A
430N/A res = pCtx->GetResourceManager()->
430N/A CreateSwapChain(hWnd, numBuffers,
430N/A d3dsdo->width, d3dsdo->height,
430N/A d3dsdo->swapEffect, presentationInterval,
430N/A &d3dsdo->pResource);
430N/A if (SUCCEEDED(res)) {
430N/A J2dTraceLn1(J2D_TRACE_VERBOSE, " created swap chain pResource=0x%x",
430N/A d3dsdo->pResource);
430N/A d3dsdo->pResource->SetSDOps(d3dsdo);
430N/A } else {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A }
430N/A D3DSD_SetNativeDimensions(env, d3dsdo);
430N/A
430N/A return SUCCEEDED(res);
0N/A}
0N/A
0N/A/*
0N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: dbGetPixelNative
430N/A * Signature: (JII)I
0N/A */
430N/AJNIEXPORT jint JNICALL Java_sun_java2d_d3d_D3DSurfaceData_dbGetPixelNative
430N/A (JNIEnv *env, jclass clazz, jlong pData, jint x, jint y)
0N/A{
430N/A HRESULT res;
430N/A D3DSDOps *d3dsdo;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A D3DResource *pLockableRes;
430N/A jint pixel = 0;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_dbGetPixelNative");
0N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData), pixel);
430N/A RETURN_STATUS_IF_NULL(d3dsdo->pResource, pixel);
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), pixel);
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return pixel;
430N/A }
430N/A RETURN_STATUS_IF_NULL(pCtx->GetResourceManager(), 0);
0N/A
430N/A IDirect3DDevice9 *pd3dDevice = pCtx->Get3DDevice();
430N/A IDirect3DSurface9 *pSrc = d3dsdo->pResource->GetSurface();
430N/A D3DFORMAT srcFmt = d3dsdo->pResource->GetDesc()->Format;
430N/A
430N/A pCtx->UpdateState(STATE_OTHEROP);
0N/A
430N/A res = pCtx->GetResourceManager()->
430N/A GetLockableRTSurface(1, 1, srcFmt, &pLockableRes);
430N/A if (SUCCEEDED(res)) {
430N/A IDirect3DSurface9 *pTmpSurface;
430N/A RECT srcRect = { x, y, x+1, y+1};
430N/A RECT dstRect = { 0l, 0l, 1, 1 };
0N/A
430N/A pTmpSurface = pLockableRes->GetSurface();
430N/A res = pd3dDevice->StretchRect(pSrc, &srcRect, pTmpSurface, &dstRect,
430N/A D3DTEXF_NONE);
430N/A if (SUCCEEDED(res)) {
430N/A D3DLOCKED_RECT lRect;
0N/A
430N/A res = pTmpSurface->LockRect(&lRect, &dstRect, D3DLOCK_NOSYSLOCK);
430N/A if (SUCCEEDED(res)) {
430N/A if (srcFmt == D3DFMT_X8R8G8B8) {
430N/A pixel = *(jint*)lRect.pBits;
430N/A } else {
430N/A pixel = *(unsigned short*)lRect.pBits;
430N/A }
430N/A pTmpSurface->UnlockRect();
430N/A }
430N/A }
430N/A }
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
0N/A
430N/A return pixel;
430N/A}
0N/A
430N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: dbSetPixelNative
430N/A * Signature: (JIII)V
430N/A */
430N/AJNIEXPORT void JNICALL Java_sun_java2d_d3d_D3DSurfaceData_dbSetPixelNative
430N/A (JNIEnv *env, jclass clazz, jlong pData, jint x, jint y, jint pixel)
430N/A{
430N/A HRESULT res;
430N/A D3DSDOps *d3dsdo;
430N/A D3DResource *pLockableRes;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_dbSetPixelNative");
430N/A
430N/A RETURN_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData));
430N/A RETURN_IF_NULL(d3dsdo->pResource);
430N/A RETURN_IF_NULL(pMgr = D3DPipelineManager::GetInstance());
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return;
0N/A }
430N/A RETURN_IF_NULL(pCtx->GetResourceManager());
0N/A
430N/A IDirect3DDevice9 *pd3dDevice = pCtx->Get3DDevice();
430N/A IDirect3DSurface9 *pSrc = d3dsdo->pResource->GetSurface();
430N/A D3DFORMAT srcFmt = d3dsdo->pResource->GetDesc()->Format;
430N/A
430N/A pCtx->UpdateState(STATE_OTHEROP);
430N/A
430N/A res = pCtx->GetResourceManager()->
430N/A GetLockableRTSurface(1, 1, srcFmt, &pLockableRes);
430N/A if (SUCCEEDED(res)) {
430N/A IDirect3DSurface9 *pTmpSurface;
430N/A D3DLOCKED_RECT lRect;
430N/A RECT srcRect = { 0l, 0l, 1, 1 };
430N/A RECT dstRect = { x, y, x+1, y+1};
430N/A
430N/A pTmpSurface = pLockableRes->GetSurface();
430N/A res = pTmpSurface->LockRect(&lRect, &srcRect, D3DLOCK_NOSYSLOCK);
430N/A if (SUCCEEDED(res)) {
430N/A if (srcFmt == D3DFMT_X8R8G8B8) {
430N/A *(jint*)lRect.pBits = pixel;
430N/A } else {
430N/A *(unsigned short*)lRect.pBits = (unsigned short)pixel;
430N/A }
430N/A pTmpSurface->UnlockRect();
430N/A
430N/A res = pd3dDevice->StretchRect(pTmpSurface, &srcRect, pSrc, &dstRect,
430N/A D3DTEXF_NONE);
430N/A }
0N/A }
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
0N/A}
0N/A
0N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: getNativeResourceNative
430N/A * Signature: (JI)J
0N/A */
430N/AJNIEXPORT jlong JNICALL
430N/A Java_sun_java2d_d3d_D3DSurfaceData_getNativeResourceNative
430N/A (JNIEnv *env, jclass d3sdc, jlong pData, jint resType)
0N/A{
430N/A D3DSDOps *d3dsdo;
430N/A
430N/A J2dTraceLn(J2D_TRACE_INFO, "D3DSurfaceData_getNativeResourceNative")
430N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pData), 0L);
430N/A
430N/A if (resType == D3D_DEVICE_RESOURCE) {
430N/A HRESULT res;
430N/A D3DPipelineManager *pMgr;
430N/A D3DContext *pCtx;
0N/A
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), 0L);
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return 0L;
430N/A }
430N/A return ptr_to_jlong(pCtx->Get3DDevice());
430N/A }
430N/A
430N/A RETURN_STATUS_IF_NULL(d3dsdo->pResource, 0L);
0N/A
430N/A if (resType == RT_PLAIN || resType == RT_TEXTURE) {
430N/A return ptr_to_jlong(d3dsdo->pResource->GetSurface());
430N/A }
430N/A if (resType == TEXTURE) {
430N/A return ptr_to_jlong(d3dsdo->pResource->GetTexture());
0N/A }
430N/A if (resType == FLIP_BACKBUFFER) {
430N/A return ptr_to_jlong(d3dsdo->pResource->GetSwapChain());
430N/A }
430N/A
430N/A return 0L;
0N/A}
0N/A
430N/A/*
430N/A * Class: sun_java2d_d3d_D3DSurfaceData
430N/A * Method: updateWindowAccelImpl
430N/A * Signature: (JJII)Z
430N/A */
430N/AJNIEXPORT jboolean
430N/AJNICALL Java_sun_java2d_d3d_D3DSurfaceData_updateWindowAccelImpl
430N/A (JNIEnv *env, jclass clazz, jlong pd3dsd, jlong pData, jint w, jint h)
430N/A{
430N/A HRESULT res;
430N/A AwtWindow *window;
430N/A HBITMAP hBitmap = NULL;
430N/A D3DSDOps *d3dsdo;
430N/A D3DResource *pSrcRes;
430N/A D3DContext *pCtx;
430N/A D3DPipelineManager *pMgr;
430N/A D3DResource *pLockableRes = NULL;
430N/A IDirect3DSurface9 *pTmpSurface = NULL;
430N/A IDirect3DDevice9 *pd3dDevice = NULL;
430N/A D3DLOCKED_RECT lockedRect;
430N/A
430N/A J2dTraceLn(J2D_TRACE_ERROR, "D3DSurfaceData_updateWindowAccelImpl");
430N/A
430N/A if (w <= 0 || h <= 0) {
430N/A return JNI_TRUE;
430N/A }
430N/A
430N/A RETURN_STATUS_IF_NULL(window = (AwtWindow *)jlong_to_ptr(pData), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(d3dsdo = (D3DSDOps *)jlong_to_ptr(pd3dsd), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pMgr = D3DPipelineManager::GetInstance(), JNI_FALSE);
430N/A RETURN_STATUS_IF_NULL(pSrcRes = d3dsdo->pResource, JNI_FALSE);
430N/A
430N/A if (FAILED(res = pMgr->GetD3DContext(d3dsdo->adapter, &pCtx))) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return JNI_FALSE;
430N/A }
430N/A
430N/A RETURN_STATUS_IF_NULL(pd3dDevice = pCtx->Get3DDevice(), JNI_FALSE);
430N/A pCtx->UpdateState(STATE_OTHEROP);
430N/A
430N/A res = pCtx->GetResourceManager()->
430N/A GetBlitOSPSurface(pSrcRes->GetDesc()->Width,
430N/A pSrcRes->GetDesc()->Height,
430N/A pSrcRes->GetDesc()->Format,
430N/A &pLockableRes);
430N/A if (FAILED(res)) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return JNI_FALSE;
430N/A }
430N/A pTmpSurface = pLockableRes->GetSurface();
430N/A
430N/A res = pd3dDevice->GetRenderTargetData(pSrcRes->GetSurface(), pTmpSurface);
430N/A if (FAILED(res)) {
430N/A D3DRQ_MarkLostIfNeeded(res, d3dsdo);
430N/A return JNI_FALSE;
430N/A }
430N/A
430N/A res = pTmpSurface->LockRect(&lockedRect, NULL, D3DLOCK_NOSYSLOCK);
430N/A if (SUCCEEDED(res)) {
1045N/A hBitmap =
1045N/A BitmapUtil::CreateBitmapFromARGBPre(w, h,
1045N/A lockedRect.Pitch,
1045N/A (int*)lockedRect.pBits);
430N/A pTmpSurface->UnlockRect();
430N/A }
430N/A RETURN_STATUS_IF_NULL(hBitmap, JNI_FALSE);
430N/A
1045N/A window->UpdateWindow(env, NULL, w, h, hBitmap);
430N/A
430N/A // hBitmap is released in UpdateWindow
430N/A
430N/A return JNI_TRUE;
0N/A}
430N/A}