/** * Returns JNI_TRUE only if all of the following conditions are met: * - the GL_ARB_fragment_shader extension is available * - the Linear/RadialGradientPaint shader codepath has been enabled via the * system property */ static jboolean OGLContext_IsGradShaderSupportAvailable(JNIEnv *env, jboolean fragShaderAvailable) { jboolean isGradShaderEnabled = JNI_FALSE; J2dTraceLn(J2D_TRACE_INFO, "OGLContext_IsGradShaderSupportAvailable"); // first see if the fragment shader extension is available if (!fragShaderAvailable) { return JNI_FALSE; } // next see if the gradshader system property has been enabled isGradShaderEnabled = JNU_GetStaticFieldByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", "isGradShaderEnabled", "Z").z; if (!isGradShaderEnabled) { J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsGradShaderSupportAvailable: disabled via flag"); return JNI_FALSE; } J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsGradShaderSupportAvailable: Linear/RadialGradientPaint shader supported"); return JNI_TRUE; }
static jobject find_origin_constant(JNIEnv* env, const char* enum_name) { jvalue field; field = JNU_GetStaticFieldByName(env, NULL, "com/sun/management/VMOption$Origin", enum_name, "Lcom/sun/management/VMOption$Origin;"); return (*env)->NewGlobalRef(env, field.l); }
/** * Returns JNI_TRUE only if all of the following conditions are met: * - the GL_ARB_fragment_shader extension is available * - the BufferedImageOp shader codepath has been enabled via the * system property */ static jboolean OGLContext_IsBIOpShaderSupportAvailable(JNIEnv *env, jboolean fragShaderAvailable) { jboolean isBIOpShaderEnabled = JNI_FALSE; J2dTraceLn(J2D_TRACE_INFO, "OGLContext_IsBIOpShaderSupportAvailable"); // first see if the fragment shader extension is available if (!fragShaderAvailable) { return JNI_FALSE; } // next see if the biopshader system property has been enabled isBIOpShaderEnabled = JNU_GetStaticFieldByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", "isBIOpShaderEnabled", "Z").z; if (!isBIOpShaderEnabled) { J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsBIOpShaderSupportAvailable: disabled via flag"); return JNI_FALSE; } /* * Note: In theory we should probably do some other checks here, like * linking a sample shader to see if the hardware truly supports our * shader programs. However, our current BufferedImageOp shaders were * designed to support first-generation shader-level hardware, so the * assumption is that if our shaders work on those GPUs, then they'll * work on newer ones as well. Also, linking a fragment program can * cost valuable CPU cycles, which is another reason to avoid these * checks at startup. */ J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsBIOpShaderSupportAvailable: BufferedImageOp shader supported"); return JNI_TRUE; }
/** * Returns JNI_TRUE only if all of the following conditions are met: * - the GL_ARB_fragment_shader extension is available * - the LCD text shader codepath has been enabled via the system property * - the hardware supports the minimum number of texture units */ static jboolean OGLContext_IsLCDShaderSupportAvailable(JNIEnv *env, jboolean fragShaderAvailable) { jboolean isLCDShaderEnabled = JNI_FALSE; GLint maxTexUnits; J2dTraceLn(J2D_TRACE_INFO, "OGLContext_IsLCDShaderSupportAvailable"); // first see if the fragment shader extension is available if (!fragShaderAvailable) { return JNI_FALSE; } // next see if the lcdshader system property has been enabled isLCDShaderEnabled = JNU_GetStaticFieldByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", "isLCDShaderEnabled", "Z").z; if (!isLCDShaderEnabled) { J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsLCDShaderSupportAvailable: disabled via flag"); return JNI_FALSE; } // finally, check to see if the hardware supports the required number // of texture units j2d_glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS_ARB, &maxTexUnits); if (maxTexUnits < 2) { J2dRlsTraceLn1(J2D_TRACE_INFO, "OGLContext_IsLCDShaderSupportAvailable: not enough tex units (%d)", maxTexUnits); } J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsLCDShaderSupportAvailable: LCD text shader supported"); return JNI_TRUE; }
/** * Returns JNI_TRUE only if all of the following conditions are met: * - the GL_EXT_framebuffer_object extension is available * - FBO support has been enabled via the system property * - we can successfully create an FBO with depth capabilities */ static jboolean OGLContext_IsFBObjectExtensionAvailable(JNIEnv *env, const char *extString) { jboolean isFBObjectEnabled = JNI_FALSE; GLuint fbobjectID, textureID, depthID; jint width = 1, height = 1; J2dTraceLn(J2D_TRACE_INFO, "OGLContext_IsFBObjectExtensionAvailable"); // first see if the fbobject extension is available if (!OGLContext_IsExtensionAvailable(extString, "GL_EXT_framebuffer_object")) { return JNI_FALSE; } // next see if the depth texture extension is available if (!OGLContext_IsExtensionAvailable(extString, "GL_ARB_depth_texture")) { return JNI_FALSE; } // next see if the fbobject system property has been enabled isFBObjectEnabled = JNU_GetStaticFieldByName(env, NULL, "sun/java2d/opengl/OGLSurfaceData", "isFBObjectEnabled", "Z").z; if (!isFBObjectEnabled) { J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsFBObjectExtensionAvailable: disabled via flag"); return JNI_FALSE; } // finally, create a dummy fbobject with depth capabilities to see // if this configuration is supported by the drivers/hardware // (first we initialize a color texture object that will be used to // construct the dummy fbobject) j2d_glGenTextures(1, &textureID); j2d_glBindTexture(GL_TEXTURE_2D, textureID); j2d_glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL); j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); j2d_glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // initialize framebuffer object using color texture created above if (!OGLSD_InitFBObject(&fbobjectID, &depthID, textureID, GL_TEXTURE_2D, width, height)) { J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsFBObjectExtensionAvailable: fbobject unsupported"); j2d_glDeleteTextures(1, &textureID); return JNI_FALSE; } // delete the temporary resources j2d_glDeleteTextures(1, &textureID); j2d_glDeleteRenderbuffersEXT(1, &depthID); j2d_glDeleteFramebuffersEXT(1, &fbobjectID); J2dRlsTraceLn(J2D_TRACE_INFO, "OGLContext_IsFBObjectExtensionAvailable: fbobject supported"); return JNI_TRUE; }