Added GLX_ARB_multisample support

This commit is contained in:
Elias Naur 2004-02-15 15:27:02 +00:00
parent f3e853d70b
commit e3a4f5f7f7
8 changed files with 59 additions and 52 deletions

View File

@ -79,21 +79,9 @@ public final class Window {
/** Title of the window */ /** Title of the window */
private static String title; private static String title;
/** Color bits */
private static int color;
/** Alpha bits */
private static int alpha;
/** Depth bits */
private static int depth;
/** Stencil bits */
private static int stencil;
/** Fullscreen */ /** Fullscreen */
private static boolean fullscreen; private static boolean fullscreen;
/** Vsync */ /** Vsync */
private static boolean vsync; private static boolean vsync;
@ -244,23 +232,21 @@ public final class Window {
* @param alpha Minimum bits per pixel in alpha buffer * @param alpha Minimum bits per pixel in alpha buffer
* @param depth Minimum bits per pixel in depth buffer * @param depth Minimum bits per pixel in depth buffer
* @param stencil Minimum bits per pixel in stencil buffer * @param stencil Minimum bits per pixel in stencil buffer
* @param samples Minimum samples in multisample buffer (corresponds to GL_SAMPLES_ARB in GL_ARB_multisample spec).
Pass 0 to disable multisampling. This parameter is ignored if GL_ARB_multisample is not supported.
* @throws Exception if the window could not be created for any reason; typically because * @throws Exception if the window could not be created for any reason; typically because
* the minimum requirements could not be met satisfactorily * the minimum requirements could not be met satisfactorily
*/ */
public static void create(String title, int bpp, int alpha, int depth, int stencil) throws Exception { public static void create(String title, int bpp, int alpha, int depth, int stencil, int samples) throws Exception {
if (isCreated()) if (isCreated())
throw new Exception("Only one LWJGL window may be instantiated at any one time."); throw new Exception("Only one LWJGL window may be instantiated at any one time.");
Window.fullscreen = true;
Window.x = 0; Window.x = 0;
Window.y = 0; Window.y = 0;
Window.color = bpp;
Window.alpha = alpha;
Window.depth = depth;
Window.stencil = stencil;
Window.fullscreen = true;
Window.title = title;
Window.width = Display.getWidth(); Window.width = Display.getWidth();
Window.height = Display.getHeight(); Window.height = Display.getHeight();
createWindow(); Window.title = title;
createWindow(bpp, alpha, depth, stencil, samples);
} }
/** /**
@ -278,24 +264,22 @@ public final class Window {
* @param alpha Minimum bits per pixel in alpha buffer * @param alpha Minimum bits per pixel in alpha buffer
* @param depth Minimum bits per pixel in depth buffer * @param depth Minimum bits per pixel in depth buffer
* @param stencil Minimum bits per pixel in stencil buffer * @param stencil Minimum bits per pixel in stencil buffer
* @param samples Minimum samples in multisample buffer (corresponds to GL_SAMPLES_ARB in GL_ARB_multisample spec).
Pass 0 to disable multisampling. This parameter is ignored if GL_ARB_multisample is not supported.
* @throws Exception if the window could not be created for any reason; typically because * @throws Exception if the window could not be created for any reason; typically because
* the minimum requirements could not be met satisfactorily * the minimum requirements could not be met satisfactorily
*/ */
public static void create(String title, int x, int y, int width, int height, int bpp, int alpha, int depth, int stencil) public static void create(String title, int x, int y, int width, int height, int bpp, int alpha, int depth, int stencil, int samples)
throws Exception { throws Exception {
if (isCreated()) if (isCreated())
throw new Exception("Only one LWJGL window may be instantiated at any one time."); throw new Exception("Only one LWJGL window may be instantiated at any one time.");
Window.fullscreen = false;
Window.x = x; Window.x = x;
Window.y = y; Window.y = y;
Window.width = width; Window.width = width;
Window.height = height; Window.height = height;
Window.color = bpp;
Window.alpha = alpha;
Window.depth = depth;
Window.stencil = stencil;
Window.fullscreen = false;
Window.title = title; Window.title = title;
createWindow(); createWindow(bpp, alpha, depth, stencil, samples);
} }
/** /**
@ -313,12 +297,13 @@ public final class Window {
int alpha, int alpha,
int depth, int depth,
int stencil, int stencil,
int samples,
HashSet extensions) HashSet extensions)
throws Exception; throws Exception;
private static void createWindow() throws Exception { private static void createWindow(int bpp, int alpha, int depth, int stencil, int samples) throws Exception {
HashSet extensions = new HashSet(); HashSet extensions = new HashSet();
nCreate(title, x, y, width, height, fullscreen, color, alpha, depth, stencil, extensions); nCreate(title, x, y, width, height, fullscreen, bpp, alpha, depth, stencil, samples, extensions);
GLCaps.determineAvailableExtensions(extensions); GLCaps.determineAvailableExtensions(extensions);
context = new Window(); context = new Window();
created = true; created = true;

View File

@ -1075,6 +1075,7 @@ static void extgl_InitGLXSupportedExtensions(JNIEnv *env, jobject ext_set, Displ
extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_info"); extgl_Extensions.GLX_EXT_visual_info = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_info");
extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_rating"); extgl_Extensions.GLX_EXT_visual_rating = GLXQueryExtension(env, ext_set, disp, screen, "GLX_EXT_visual_rating");
extgl_Extensions.GLX_SGI_swap_control = GLXQueryExtension(env, ext_set, disp, screen, "GLX_SGI_swap_control"); extgl_Extensions.GLX_SGI_swap_control = GLXQueryExtension(env, ext_set, disp, screen, "GLX_SGI_swap_control");
extgl_Extensions.GLX_ARB_multisample = GLXQueryExtension(env, ext_set, disp, screen, "GLX_ARB_multisample");
} }
static void extgl_InitGLXSGISwapControl(JNIEnv *env, jobject ext_set) static void extgl_InitGLXSGISwapControl(JNIEnv *env, jobject ext_set)

View File

@ -3161,6 +3161,7 @@ struct ExtensionTypes
bool GLX_EXT_visual_info; bool GLX_EXT_visual_info;
bool GLX_EXT_visual_rating; bool GLX_EXT_visual_rating;
bool GLX_SGI_swap_control; bool GLX_SGI_swap_control;
bool GLX_ARB_multisample;
#endif /* X11 */ #endif /* X11 */
bool OpenGL12; bool OpenGL12;

View File

@ -359,4 +359,5 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_GL15_nglGetQueryObjectuiv
GLuint *params_ptr = (GLuint *)env->GetDirectBufferAddress(params) + paramsOffset; GLuint *params_ptr = (GLuint *)env->GetDirectBufferAddress(params) + paramsOffset;
glGetQueryObjectuiv(id, pname, params_ptr); glGetQueryObjectuiv(id, pname, params_ptr);
CHECK_GL_ERROR CHECK_GL_ERROR
} }

View File

@ -14,10 +14,6 @@ extern "C" {
/* Inaccessible static: width */ /* Inaccessible static: width */
/* Inaccessible static: height */ /* Inaccessible static: height */
/* Inaccessible static: title */ /* Inaccessible static: title */
/* Inaccessible static: color */
/* Inaccessible static: alpha */
/* Inaccessible static: depth */
/* Inaccessible static: stencil */
/* Inaccessible static: fullscreen */ /* Inaccessible static: fullscreen */
/* Inaccessible static: vsync */ /* Inaccessible static: vsync */
/* Inaccessible static: vbo_tracker */ /* Inaccessible static: vbo_tracker */
@ -90,10 +86,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_swapBuffers
/* /*
* Class: org_lwjgl_opengl_Window * Class: org_lwjgl_opengl_Window
* Method: nCreate * Method: nCreate
* Signature: (Ljava/lang/String;IIIIZIIIILjava/util/HashSet;)V * Signature: (Ljava/lang/String;IIIIZIIIIILjava/util/HashSet;)V
*/ */
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate
(JNIEnv *, jclass, jstring, jint, jint, jint, jint, jboolean, jint, jint, jint, jint, jobject); (JNIEnv *, jclass, jstring, jint, jint, jint, jint, jboolean, jint, jint, jint, jint, jint, jobject);
/* /*
* Class: org_lwjgl_opengl_Window * Class: org_lwjgl_opengl_Window

View File

@ -297,7 +297,7 @@ GLXContext getCurrentContext(void) {
return context; return context;
} }
static GLXFBConfig *chooseVisualGLX13(Display *disp, int screen, int bpp, int depth, int alpha, int stencil) { static GLXFBConfig *chooseVisualGLX13(Display *disp, int screen, int bpp, int depth, int alpha, int stencil, int samples) {
int bpe = convertToBPE(bpp); int bpe = convertToBPE(bpp);
int attriblist[] = {GLX_RENDER_TYPE, GLX_RGBA_BIT, int attriblist[] = {GLX_RENDER_TYPE, GLX_RGBA_BIT,
GLX_DOUBLEBUFFER, True, GLX_DOUBLEBUFFER, True,
@ -308,8 +308,16 @@ static GLXFBConfig *chooseVisualGLX13(Display *disp, int screen, int bpp, int de
GLX_BLUE_SIZE, bpe, GLX_BLUE_SIZE, bpe,
GLX_ALPHA_SIZE, alpha, GLX_ALPHA_SIZE, alpha,
GLX_STENCIL_SIZE, stencil, GLX_STENCIL_SIZE, stencil,
None, None, /* For ARB_multisample */
None, None, /* */
None}; None};
int num_formats = 0; int num_formats = 0;
if (samples > 0 && extgl_Extensions.GLX_ARB_multisample) {
attriblist[18] = GLX_SAMPLE_BUFFERS_ARB;
attriblist[19] = 1;
attriblist[20] = GLX_SAMPLES_ARB;
attriblist[21] = samples;
}
GLXFBConfig* configs = glXChooseFBConfig(disp, screen, attriblist, &num_formats); GLXFBConfig* configs = glXChooseFBConfig(disp, screen, attriblist, &num_formats);
if (num_formats > 0) if (num_formats > 0)
return configs; return configs;
@ -320,7 +328,7 @@ static GLXFBConfig *chooseVisualGLX13(Display *disp, int screen, int bpp, int de
} }
} }
static XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth, int alpha, int stencil) { static XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth, int alpha, int stencil, int samples) {
int bpe = convertToBPE(bpp); int bpe = convertToBPE(bpp);
int attriblist[] = {GLX_RGBA, int attriblist[] = {GLX_RGBA,
GLX_DOUBLEBUFFER, GLX_DOUBLEBUFFER,
@ -330,19 +338,33 @@ static XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth,
GLX_BLUE_SIZE, bpe, GLX_BLUE_SIZE, bpe,
GLX_ALPHA_SIZE, alpha, GLX_ALPHA_SIZE, alpha,
GLX_STENCIL_SIZE, stencil, GLX_STENCIL_SIZE, stencil,
None, None, /* For ARB_multisample */
None, None, /* */
None}; None};
if (samples > 0 && extgl_Extensions.GLX_ARB_multisample) {
attriblist[14] = GLX_SAMPLE_BUFFERS_ARB;
attriblist[15] = 1;
attriblist[16] = GLX_SAMPLES_ARB;
attriblist[17] = samples;
}
return glXChooseVisual(disp, screen, attriblist); return glXChooseVisual(disp, screen, attriblist);
} }
static void dumpVisualInfo(Display *disp, XVisualInfo *vis_info) { static void dumpVisualInfo(Display *disp, XVisualInfo *vis_info) {
int alpha, depth, stencil, r, g, b; int alpha, depth, stencil, r, g, b;
int sample_buffers = 0;
int samples = 0;
glXGetConfig(disp, vis_info, GLX_RED_SIZE, &r); glXGetConfig(disp, vis_info, GLX_RED_SIZE, &r);
glXGetConfig(disp, vis_info, GLX_GREEN_SIZE, &g); glXGetConfig(disp, vis_info, GLX_GREEN_SIZE, &g);
glXGetConfig(disp, vis_info, GLX_BLUE_SIZE, &b); glXGetConfig(disp, vis_info, GLX_BLUE_SIZE, &b);
glXGetConfig(disp, vis_info, GLX_ALPHA_SIZE, &alpha); glXGetConfig(disp, vis_info, GLX_ALPHA_SIZE, &alpha);
glXGetConfig(disp, vis_info, GLX_DEPTH_SIZE, &depth); glXGetConfig(disp, vis_info, GLX_DEPTH_SIZE, &depth);
glXGetConfig(disp, vis_info, GLX_STENCIL_SIZE, &stencil); glXGetConfig(disp, vis_info, GLX_STENCIL_SIZE, &stencil);
printf("Pixel format chosen sizes: r = %d, g = %d, b = %d, a = %d, depth = %d, stencil = %d\n", r, g, b, alpha, depth, stencil); if (extgl_Extensions.GLX_ARB_multisample) {
glXGetConfig(disp, vis_info, GLX_SAMPLE_BUFFERS_ARB, &sample_buffers);
glXGetConfig(disp, vis_info, GLX_SAMPLES_ARB, &samples);
}
printf("Pixel format info: r = %d, g = %d, b = %d, a = %d, depth = %d, stencil = %d, sample buffers = %d, samples = %d\n", r, g, b, alpha, depth, stencil, sample_buffers, samples);
} }
static void destroy(void) { static void destroy(void) {
@ -357,8 +379,8 @@ static void destroy(void) {
extgl_Close(); extgl_Close();
} }
static bool initWindowGLX13(JNIEnv *env, Display *disp, int screen, jstring title, int x, int y, int width, int height, int bpp, int depth, int alpha, int stencil, bool fscreen) { static bool initWindowGLX13(JNIEnv *env, Display *disp, int screen, jstring title, int x, int y, int width, int height, int bpp, int depth, int alpha, int stencil, int samples, bool fscreen) {
GLXFBConfig *configs = chooseVisualGLX13(disp, screen, bpp, depth, alpha, stencil); GLXFBConfig *configs = chooseVisualGLX13(disp, screen, bpp, depth, alpha, stencil, samples);
if (configs == NULL) { if (configs == NULL) {
throwException(env, "Could not find a matching pixel format"); throwException(env, "Could not find a matching pixel format");
return false; return false;
@ -372,7 +394,7 @@ static bool initWindowGLX13(JNIEnv *env, Display *disp, int screen, jstring titl
if (glXIsDirect(disp, context) == False) { if (glXIsDirect(disp, context) == False) {
glXDestroyContext(disp, context); glXDestroyContext(disp, context);
XFree(configs); XFree(configs);
throwException(env, "Could not create a GLX context"); throwException(env, "Could not create a direct GLX context");
return false; return false;
} }
XVisualInfo * vis_info = glXGetVisualFromFBConfig(disp, configs[0]); XVisualInfo * vis_info = glXGetVisualFromFBConfig(disp, configs[0]);
@ -382,18 +404,18 @@ static bool initWindowGLX13(JNIEnv *env, Display *disp, int screen, jstring titl
throwException(env, "Could not create visual info from FB config"); throwException(env, "Could not create visual info from FB config");
return false; return false;
} }
if (ISDEBUGENABLED())
dumpVisualInfo(disp, vis_info);
createWindow(env, disp, screen, vis_info, title, x, y, width, height, fscreen); createWindow(env, disp, screen, vis_info, title, x, y, width, height, fscreen);
glx_window = glXCreateWindow(disp, configs[0], getCurrentWindow(), NULL); glx_window = glXCreateWindow(disp, configs[0], getCurrentWindow(), NULL);
makeCurrent(); makeCurrent();
if (ISDEBUGENABLED())
dumpVisualInfo(disp, vis_info);
XFree(configs); XFree(configs);
XFree(vis_info); XFree(vis_info);
return true; return true;
} }
static bool initWindowGLX(JNIEnv *env, Display *disp, int screen, jstring title, int x, int y, int width, int height, int bpp, int depth, int alpha, int stencil, bool fscreen) { static bool initWindowGLX(JNIEnv *env, Display *disp, int screen, jstring title, int x, int y, int width, int height, int bpp, int depth, int alpha, int stencil, int samples, bool fscreen) {
XVisualInfo *vis_info = chooseVisual(disp, screen, bpp, depth, alpha, stencil); XVisualInfo *vis_info = chooseVisual(disp, screen, bpp, depth, alpha, stencil, samples);
if (vis_info == NULL) { if (vis_info == NULL) {
throwException(env, "Could not find a matching pixel format"); throwException(env, "Could not find a matching pixel format");
return false; return false;
@ -424,7 +446,7 @@ static bool initWindowGLX(JNIEnv *env, Display *disp, int screen, jstring title,
* Signature: (IIII)Z * Signature: (IIII)Z
*/ */
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate
(JNIEnv * env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jobject ext_set) (JNIEnv * env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jint samples, jobject ext_set)
{ {
int screen; int screen;
Display *disp; Display *disp;
@ -450,13 +472,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate
} }
bool create_success; bool create_success;
if (USEGLX13) { if (USEGLX13) {
create_success = initWindowGLX13(env, disp, screen, title, x, y, width, height, bpp, depth, alpha, stencil, fscreen); create_success = initWindowGLX13(env, disp, screen, title, x, y, width, height, bpp, depth, alpha, stencil, samples, fscreen);
} else { } else {
create_success = initWindowGLX(env, disp, screen, title, x, y, width, height, bpp, depth, alpha, stencil, fscreen); create_success = initWindowGLX(env, disp, screen, title, x, y, width, height, bpp, depth, alpha, stencil, samples, fscreen);
} }
if (!create_success) { if (!create_success) {
XCloseDisplay(disp); XCloseDisplay(disp);
extgl_Close(); extgl_Close();
throwException(env, "Could not create window");
return; return;
} }
if (!extgl_Initialize(env, ext_set)) { if (!extgl_Initialize(env, ext_set)) {

View File

@ -101,7 +101,7 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_opengl_Window_nIsCloseRequested(JNIEnv
return JNI_FALSE; return JNI_FALSE;
} }
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jobject ext_set) { JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate(JNIEnv *env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jint samples, jobject ext_set) {
vsync_enabled = false; vsync_enabled = false;
current_fullscreen = fullscreen == JNI_TRUE; current_fullscreen = fullscreen == JNI_TRUE;
if (!extgl_Open()) { if (!extgl_Open()) {

View File

@ -501,7 +501,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_swapBuffers
* Signature: (Ljava/lang/String;IIIIZIIII)V * Signature: (Ljava/lang/String;IIIIZIIII)V
*/ */
JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate JNIEXPORT void JNICALL Java_org_lwjgl_opengl_Window_nCreate
(JNIEnv * env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jobject ext_set) (JNIEnv * env, jclass clazz, jstring title, jint x, jint y, jint width, jint height, jboolean fullscreen, jint bpp, jint alpha, jint depth, jint stencil, jint samples, jobject ext_set)
{ {
closerequested = false; closerequested = false;
minimized = false; minimized = false;