< prev index next >
src/java.desktop/windows/native/libawt/java2d/opengl/WGLSurfaceData.c
Print this page
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2004, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
@@ -105,32 +105,17 @@
}
}
/**
* This function disposes of any native windowing system resources associated
- * with this surface. For instance, if the given OGLSDOps is of type
- * OGLSD_PBUFFER, this method implementation will destroy the actual pbuffer
- * surface.
+ * with this surface.
*/
void
OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo)
{
- WGLSDOps *wglsdo = (WGLSDOps *)oglsdo->privOps;
-
J2dTraceLn(J2D_TRACE_INFO, "OGLSD_DestroyOGLSurface");
-
- if (oglsdo->drawableType == OGLSD_PBUFFER) {
- if (wglsdo->pbuffer != 0) {
- if (wglsdo->pbufferDC != 0) {
- j2d_wglReleasePbufferDCARB(wglsdo->pbuffer,
- wglsdo->pbufferDC);
- wglsdo->pbufferDC = 0;
- }
- j2d_wglDestroyPbufferARB(wglsdo->pbuffer);
- wglsdo->pbuffer = 0;
- }
- }
+ // Window is free'd later by AWT code...
}
/**
* Makes the given context current to its associated "scratch" surface. If
* the operation is successful, this method will return JNI_TRUE; otherwise,
@@ -274,23 +259,15 @@
}
ctxinfo = (WGLCtxInfo *)oglc->ctxInfo;
// get the hdc for the destination surface
- if (dstOps->drawableType == OGLSD_PBUFFER) {
- dstHDC = dstWGLOps->pbufferDC;
- } else {
dstHDC = GetDC(dstWGLOps->window);
- }
// get the hdc for the source surface
- if (srcOps->drawableType == OGLSD_PBUFFER) {
- srcHDC = srcWGLOps->pbufferDC;
- } else {
// the source will always be equal to the destination in this case
srcHDC = dstHDC;
- }
// REMIND: in theory we should be able to use wglMakeContextCurrentARB()
// even when the src/dst surfaces are the same, but this causes problems
// on ATI's drivers (see 6525997); for now we will only use it when the
// surfaces are different, otherwise we will use the old
@@ -304,26 +281,22 @@
success = j2d_wglMakeCurrent(dstHDC, ctxinfo->context);
}
if (!success) {
J2dRlsTraceLn(J2D_TRACE_ERROR,
"OGLSD_MakeOGLContextCurrent: could not make current");
- if (dstOps->drawableType != OGLSD_PBUFFER) {
ReleaseDC(dstWGLOps->window, dstHDC);
- }
return NULL;
}
if (OGLC_IS_CAP_PRESENT(oglc, CAPS_EXT_FBOBJECT)) {
// the GL_EXT_framebuffer_object extension is present, so we
// must bind to the default (windowing system provided)
// framebuffer
j2d_glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
}
- if (dstOps->drawableType != OGLSD_PBUFFER) {
ReleaseDC(dstWGLOps->window, dstHDC);
- }
return oglc;
}
/**
@@ -398,145 +371,10 @@
oglsdo->width, oglsdo->height);
return JNI_TRUE;
}
-JNIEXPORT jboolean JNICALL
-Java_sun_java2d_opengl_WGLSurfaceData_initPbuffer
- (JNIEnv *env, jobject wglsd,
- jlong pData, jlong pConfigInfo,
- jboolean isOpaque,
- jint width, jint height)
-{
- int attrKeys[] = {
- WGL_MAX_PBUFFER_WIDTH_ARB,
- WGL_MAX_PBUFFER_HEIGHT_ARB,
- };
- int attrVals[2];
- int pbAttrList[] = { 0 };
- OGLSDOps *oglsdo = (OGLSDOps *)jlong_to_ptr(pData);
- WGLGraphicsConfigInfo *wglInfo =
- (WGLGraphicsConfigInfo *)jlong_to_ptr(pConfigInfo);
- WGLSDOps *wglsdo;
- HWND hwnd;
- HDC hdc, pbufferDC;
- HPBUFFERARB pbuffer;
- int maxWidth, maxHeight;
- int actualWidth, actualHeight;
-
- J2dTraceLn3(J2D_TRACE_INFO,
- "WGLSurfaceData_initPbuffer: w=%d h=%d opq=%d",
- width, height, isOpaque);
-
- if (oglsdo == NULL) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: ops are null");
- return JNI_FALSE;
- }
-
- wglsdo = (WGLSDOps *)oglsdo->privOps;
- if (wglsdo == NULL) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: wgl ops are null");
- return JNI_FALSE;
- }
-
- if (wglInfo == NULL) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: wgl config info is null");
- return JNI_FALSE;
- }
-
- // create a scratch window
- hwnd = WGLGC_CreateScratchWindow(wglInfo->screen);
- if (hwnd == 0) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: could not create scratch window");
- return JNI_FALSE;
- }
-
- // get the HDC for the scratch window
- hdc = GetDC(hwnd);
- if (hdc == 0) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: could not get dc for scratch window");
- DestroyWindow(hwnd);
- return JNI_FALSE;
- }
-
- // get the maximum allowable pbuffer dimensions
- j2d_wglGetPixelFormatAttribivARB(hdc, wglInfo->pixfmt, 0, 2,
- attrKeys, attrVals);
- maxWidth = attrVals[0];
- maxHeight = attrVals[1];
-
- J2dTraceLn4(J2D_TRACE_VERBOSE,
- " desired pbuffer dimensions: w=%d h=%d maxw=%d maxh=%d",
- width, height, maxWidth, maxHeight);
-
- // if either dimension is 0 or larger than the maximum, we cannot
- // allocate a pbuffer with the requested dimensions
- if (width == 0 || width > maxWidth ||
- height == 0 || height > maxHeight)
- {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: invalid dimensions");
- ReleaseDC(hwnd, hdc);
- DestroyWindow(hwnd);
- return JNI_FALSE;
- }
-
- pbuffer = j2d_wglCreatePbufferARB(hdc, wglInfo->pixfmt,
- width, height, pbAttrList);
-
- ReleaseDC(hwnd, hdc);
- DestroyWindow(hwnd);
-
- if (pbuffer == 0) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: could not create wgl pbuffer");
- return JNI_FALSE;
- }
-
- // note that we get the DC for the pbuffer at creation time, and then
- // release the DC when the pbuffer is disposed; the WGL_ARB_pbuffer
- // spec is vague about such things, but from past experience we know
- // this approach to be more robust than, for example, doing a
- // Get/ReleasePbufferDC() everytime we make a context current
- pbufferDC = j2d_wglGetPbufferDCARB(pbuffer);
- if (pbufferDC == 0) {
- J2dRlsTraceLn(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: could not get dc for pbuffer");
- j2d_wglDestroyPbufferARB(pbuffer);
- return JNI_FALSE;
- }
-
- // make sure the actual dimensions match those that we requested
- j2d_wglQueryPbufferARB(pbuffer, WGL_PBUFFER_WIDTH_ARB, &actualWidth);
- j2d_wglQueryPbufferARB(pbuffer, WGL_PBUFFER_HEIGHT_ARB, &actualHeight);
-
- if (width != actualWidth || height != actualHeight) {
- J2dRlsTraceLn2(J2D_TRACE_ERROR,
- "WGLSurfaceData_initPbuffer: actual (w=%d h=%d) != requested",
- actualWidth, actualHeight);
- j2d_wglReleasePbufferDCARB(pbuffer, pbufferDC);
- j2d_wglDestroyPbufferARB(pbuffer);
- return JNI_FALSE;
- }
-
- oglsdo->drawableType = OGLSD_PBUFFER;
- oglsdo->isOpaque = isOpaque;
- oglsdo->width = width;
- oglsdo->height = height;
- wglsdo->pbuffer = pbuffer;
- wglsdo->pbufferDC = pbufferDC;
-
- OGLSD_SetNativeDimensions(env, oglsdo, width, height);
-
- return JNI_TRUE;
-}
-
void
OGLSD_SwapBuffers(JNIEnv *env, jlong pPeerData)
{
HWND window;
HDC hdc;
< prev index next >