< prev index next >

src/java.desktop/macosx/native/libawt_lwawt/java2d/opengl/CGLSurfaceData.m

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2011, 2012, 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 --- 1,7 ---- /* ! * Copyright (c) 2011, 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
*** 108,139 **** return JNI_TRUE; } /** * 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. */ void OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo) { J2dTraceLn(J2D_TRACE_INFO, "OGLSD_DestroyOGLSurface"); JNF_COCOA_ENTER(env); CGLSDOps *cglsdo = (CGLSDOps *)oglsdo->privOps; ! if (oglsdo->drawableType == OGLSD_PBUFFER) { ! if (oglsdo->textureID != 0) { ! j2d_glDeleteTextures(1, &oglsdo->textureID); ! oglsdo->textureID = 0; ! } ! if (cglsdo->pbuffer != NULL) { ! [cglsdo->pbuffer release]; ! cglsdo->pbuffer = NULL; ! } ! } else if (oglsdo->drawableType == OGLSD_WINDOW) { // detach the NSView from the NSOpenGLContext CGLGraphicsConfigInfo *cglInfo = cglsdo->configInfo; OGLContext *oglc = cglInfo->context; CGLCtxInfo *ctxinfo = (CGLCtxInfo *)oglc->ctxInfo; [ctxinfo->context clearDrawable]; --- 108,128 ---- return JNI_TRUE; } /** * This function disposes of any native windowing system resources associated ! * with this surface. */ void OGLSD_DestroyOGLSurface(JNIEnv *env, OGLSDOps *oglsdo) { J2dTraceLn(J2D_TRACE_INFO, "OGLSD_DestroyOGLSurface"); JNF_COCOA_ENTER(env); CGLSDOps *cglsdo = (CGLSDOps *)oglsdo->privOps; ! if (oglsdo->drawableType == OGLSD_WINDOW) { // detach the NSView from the NSOpenGLContext CGLGraphicsConfigInfo *cglInfo = cglsdo->configInfo; OGLContext *oglc = cglInfo->context; CGLCtxInfo *ctxinfo = (CGLCtxInfo *)oglc->ctxInfo; [ctxinfo->context clearDrawable];
*** 275,320 **** return oglc; } JNF_COCOA_ENTER(env); - // set the current surface - if (dstOps->drawableType == OGLSD_PBUFFER) { - // REMIND: pbuffers are not fully tested yet... - [ctxinfo->context clearDrawable]; - [ctxinfo->context makeCurrentContext]; - [ctxinfo->context setPixelBuffer: dstCGLOps->pbuffer - cubeMapFace: 0 - mipMapLevel: 0 - currentVirtualScreen: [ctxinfo->context currentVirtualScreen]]; - } else { CGLSDOps *cglsdo = (CGLSDOps *)dstOps->privOps; NSView *nsView = (NSView *)cglsdo->peerData; if ([ctxinfo->context view] != nsView) { [ctxinfo->context makeCurrentContext]; [ctxinfo->context setView: nsView]; } - } 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 ((srcOps != dstOps) && (srcOps->drawableType == OGLSD_PBUFFER)) { - // bind pbuffer to the render texture object (since we are preparing - // to copy from the pbuffer) - CGLSDOps *srcCGLOps = (CGLSDOps *)srcOps->privOps; - j2d_glBindTexture(GL_TEXTURE_2D, srcOps->textureID); - [ctxinfo->context - setTextureImageToPixelBuffer: srcCGLOps->pbuffer - colorBuffer: GL_FRONT]; - } - JNF_COCOA_EXIT(env); return oglc; } --- 264,288 ----
*** 462,570 **** cglsdo->peerData = NULL; cglsdo->layer = NULL; } - JNIEXPORT jboolean JNICALL - Java_sun_java2d_opengl_CGLSurfaceData_initPbuffer - (JNIEnv *env, jobject cglsd, - jlong pData, jlong pConfigInfo, jboolean isOpaque, - jint width, jint height) - { - J2dTraceLn3(J2D_TRACE_INFO, "CGLSurfaceData_initPbuffer: w=%d h=%d opq=%d", width, height, isOpaque); - - OGLSDOps *oglsdo = (OGLSDOps *)jlong_to_ptr(pData); - if (oglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: ops are null"); - return JNI_FALSE; - } - - CGLSDOps *cglsdo = (CGLSDOps *)oglsdo->privOps; - if (cglsdo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: cgl ops are null"); - return JNI_FALSE; - } - - CGLGraphicsConfigInfo *cglInfo = (CGLGraphicsConfigInfo *) - jlong_to_ptr(pConfigInfo); - if (cglInfo == NULL) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: cgl config info is null"); - return JNI_FALSE; - } - - // find the maximum allowable texture dimensions (this value ultimately - // determines our maximum pbuffer size) - int pbMax = 0; - j2d_glGetIntegerv(GL_MAX_TEXTURE_SIZE, &pbMax); - - int pbWidth = 0; - int pbHeight = 0; - if (OGLC_IS_CAP_PRESENT(cglInfo->context, CAPS_TEXNONPOW2)) { - // use non-power-of-two dimensions directly - pbWidth = (width <= pbMax) ? width : 0; - pbHeight = (height <= pbMax) ? height : 0; - } else { - // find the appropriate power-of-two dimensions - pbWidth = OGLSD_NextPowerOfTwo(width, pbMax); - pbHeight = OGLSD_NextPowerOfTwo(height, pbMax); - } - - J2dTraceLn3(J2D_TRACE_VERBOSE, " desired pbuffer dimensions: w=%d h=%d max=%d", pbWidth, pbHeight, pbMax); - - // if either dimension is 0, we cannot allocate a pbuffer/texture with the - // requested dimensions - if (pbWidth == 0 || pbHeight == 0) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: dimensions too large"); - return JNI_FALSE; - } - - int format = isOpaque ? GL_RGB : GL_RGBA; - - JNF_COCOA_ENTER(env); - - cglsdo->pbuffer = - [[NSOpenGLPixelBuffer alloc] - initWithTextureTarget: GL_TEXTURE_2D - textureInternalFormat: format - textureMaxMipMapLevel: 0 - pixelsWide: pbWidth - pixelsHigh: pbHeight]; - if (cglsdo->pbuffer == nil) { - J2dRlsTraceLn(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: could not create pbuffer"); - return JNI_FALSE; - } - - // make sure the actual dimensions match those that we requested - GLsizei actualWidth = [cglsdo->pbuffer pixelsWide]; - GLsizei actualHeight = [cglsdo->pbuffer pixelsHigh]; - if (actualWidth != pbWidth || actualHeight != pbHeight) { - J2dRlsTraceLn2(J2D_TRACE_ERROR, "CGLSurfaceData_initPbuffer: actual (w=%d h=%d) != requested", actualWidth, actualHeight); - [cglsdo->pbuffer release]; - return JNI_FALSE; - } - - GLuint texID = 0; - j2d_glGenTextures(1, &texID); - j2d_glBindTexture(GL_TEXTURE_2D, texID); - - oglsdo->drawableType = OGLSD_PBUFFER; - oglsdo->isOpaque = isOpaque; - oglsdo->width = width; - oglsdo->height = height; - oglsdo->textureID = texID; - oglsdo->textureWidth = pbWidth; - oglsdo->textureHeight = pbHeight; - oglsdo->activeBuffer = GL_FRONT; - oglsdo->needsInit = JNI_TRUE; - - OGLSD_INIT_TEXTURE_FILTER(oglsdo, GL_NEAREST); - - JNF_COCOA_EXIT(env); - - return JNI_TRUE; - } - #pragma mark - #pragma mark "--- CGLSurfaceData methods - Mac OS X specific ---" // Must be called on the QFT... JNIEXPORT void JNICALL --- 430,439 ----
< prev index next >