osmesa: add new OSMesaCreateContextAttribs function
This allows specifying a GL profile and version so one can get a core- profile context. Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
This commit is contained in:
@@ -56,6 +56,8 @@ Note: some of the new features are only available with certain drivers.
|
||||
<li>GL_ARB_vertex_type_10f_11f_11f_rev on freedreno/a4xx</li>
|
||||
<li>GL_KHR_texture_compression_astc_ldr on freedreno/a4xx</li>
|
||||
<li>GL_AMD_performance_monitor on radeonsi (CIK+ only)</li>
|
||||
<li>New OSMesaCreateContextAttribs() function (for creating core profile
|
||||
contexts)</li>
|
||||
</ul>
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
|
@@ -58,8 +58,8 @@ extern "C" {
|
||||
#include <GL/gl.h>
|
||||
|
||||
|
||||
#define OSMESA_MAJOR_VERSION 10
|
||||
#define OSMESA_MINOR_VERSION 0
|
||||
#define OSMESA_MAJOR_VERSION 11
|
||||
#define OSMESA_MINOR_VERSION 2
|
||||
#define OSMESA_PATCH_VERSION 0
|
||||
|
||||
|
||||
@@ -95,6 +95,18 @@ extern "C" {
|
||||
#define OSMESA_MAX_WIDTH 0x24 /* new in 4.0 */
|
||||
#define OSMESA_MAX_HEIGHT 0x25 /* new in 4.0 */
|
||||
|
||||
/*
|
||||
* Accepted in OSMesaCreateContextAttrib's attribute list.
|
||||
*/
|
||||
#define OSMESA_DEPTH_BITS 0x30
|
||||
#define OSMESA_STENCIL_BITS 0x31
|
||||
#define OSMESA_ACCUM_BITS 0x32
|
||||
#define OSMESA_PROFILE 0x33
|
||||
#define OSMESA_CORE_PROFILE 0x34
|
||||
#define OSMESA_COMPAT_PROFILE 0x35
|
||||
#define OSMESA_CONTEXT_MAJOR_VERSION 0x36
|
||||
#define OSMESA_CONTEXT_MINOR_VERSION 0x37
|
||||
|
||||
|
||||
typedef struct osmesa_context *OSMesaContext;
|
||||
|
||||
@@ -127,6 +139,35 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
|
||||
GLint accumBits, OSMesaContext sharelist);
|
||||
|
||||
|
||||
/*
|
||||
* Create an Off-Screen Mesa rendering context with attribute list.
|
||||
* The list is composed of (attribute, value) pairs and terminated with
|
||||
* attribute==0. Supported Attributes:
|
||||
*
|
||||
* Attributes Values
|
||||
* --------------------------------------------------------------------------
|
||||
* OSMESA_FORMAT OSMESA_RGBA*, OSMESA_BGRA, OSMESA_ARGB, etc.
|
||||
* OSMESA_DEPTH_BITS 0*, 16, 24, 32
|
||||
* OSMESA_STENCIL_BITS 0*, 8
|
||||
* OSMESA_ACCUM_BITS 0*, 16
|
||||
* OSMESA_PROFILE OSMESA_COMPAT_PROFILE*, OSMESA_CORE_PROFILE
|
||||
* OSMESA_CONTEXT_MAJOR_VERSION 1*, 2, 3
|
||||
* OSMESA_CONTEXT_MINOR_VERSION 0+
|
||||
*
|
||||
* Note: * = default value
|
||||
*
|
||||
* We return a context version >= what's specified by OSMESA_CONTEXT_MAJOR/
|
||||
* MINOR_VERSION for the given profile. For example, if you request a GL 1.4
|
||||
* compat profile, you might get a GL 3.0 compat profile.
|
||||
* Otherwise, null is returned if the version/profile is not supported.
|
||||
*
|
||||
* New in Mesa 11.2
|
||||
*/
|
||||
GLAPI OSMesaContext GLAPIENTRY
|
||||
OSMesaCreateContextAttribs( const int *attribList, OSMesaContext sharelist );
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Destroy an Off-Screen Mesa rendering context.
|
||||
*
|
||||
|
@@ -644,11 +644,101 @@ OSMesaCreateContext( GLenum format, OSMesaContext sharelist )
|
||||
GLAPI OSMesaContext GLAPIENTRY
|
||||
OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
|
||||
GLint accumBits, OSMesaContext sharelist )
|
||||
{
|
||||
int attribs[100], n = 0;
|
||||
|
||||
attribs[n++] = OSMESA_FORMAT;
|
||||
attribs[n++] = format;
|
||||
attribs[n++] = OSMESA_DEPTH_BITS;
|
||||
attribs[n++] = depthBits;
|
||||
attribs[n++] = OSMESA_STENCIL_BITS;
|
||||
attribs[n++] = stencilBits;
|
||||
attribs[n++] = OSMESA_ACCUM_BITS;
|
||||
attribs[n++] = accumBits;
|
||||
attribs[n++] = 0;
|
||||
|
||||
return OSMesaCreateContextAttribs(attribs, sharelist);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* New in Mesa 11.2
|
||||
*
|
||||
* Create context with attribute list.
|
||||
*/
|
||||
GLAPI OSMesaContext GLAPIENTRY
|
||||
OSMesaCreateContextAttribs(const int *attribList, OSMesaContext sharelist)
|
||||
{
|
||||
OSMesaContext osmesa;
|
||||
struct dd_function_table functions;
|
||||
GLint rind, gind, bind, aind;
|
||||
GLint redBits = 0, greenBits = 0, blueBits = 0, alphaBits =0;
|
||||
GLenum format = OSMESA_RGBA;
|
||||
GLint depthBits = 0, stencilBits = 0, accumBits = 0;
|
||||
int profile = OSMESA_COMPAT_PROFILE, version_major = 1, version_minor = 0;
|
||||
gl_api api_profile = API_OPENGL_COMPAT;
|
||||
int i;
|
||||
|
||||
for (i = 0; attribList[i]; i += 2) {
|
||||
switch (attribList[i]) {
|
||||
case OSMESA_FORMAT:
|
||||
format = attribList[i+1];
|
||||
switch (format) {
|
||||
case OSMESA_COLOR_INDEX:
|
||||
case OSMESA_RGBA:
|
||||
case OSMESA_BGRA:
|
||||
case OSMESA_ARGB:
|
||||
case OSMESA_RGB:
|
||||
case OSMESA_BGR:
|
||||
case OSMESA_RGB_565:
|
||||
/* legal */
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case OSMESA_DEPTH_BITS:
|
||||
depthBits = attribList[i+1];
|
||||
if (depthBits < 0)
|
||||
return NULL;
|
||||
break;
|
||||
case OSMESA_STENCIL_BITS:
|
||||
stencilBits = attribList[i+1];
|
||||
if (stencilBits < 0)
|
||||
return NULL;
|
||||
break;
|
||||
case OSMESA_ACCUM_BITS:
|
||||
accumBits = attribList[i+1];
|
||||
if (accumBits < 0)
|
||||
return NULL;
|
||||
break;
|
||||
case OSMESA_PROFILE:
|
||||
profile = attribList[i+1];
|
||||
if (profile == OSMESA_COMPAT_PROFILE)
|
||||
api_profile = API_OPENGL_COMPAT;
|
||||
else if (profile == OSMESA_CORE_PROFILE)
|
||||
api_profile = API_OPENGL_CORE;
|
||||
else
|
||||
return NULL;
|
||||
break;
|
||||
case OSMESA_CONTEXT_MAJOR_VERSION:
|
||||
version_major = attribList[i+1];
|
||||
if (version_major < 1)
|
||||
return NULL;
|
||||
break;
|
||||
case OSMESA_CONTEXT_MINOR_VERSION:
|
||||
version_minor = attribList[i+1];
|
||||
if (version_minor < 0)
|
||||
return NULL;
|
||||
break;
|
||||
case 0:
|
||||
/* end of list */
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Bad attribute in OSMesaCreateContextAttribs()\n");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
rind = gind = bind = aind = 0;
|
||||
if (format==OSMESA_RGBA) {
|
||||
@@ -742,7 +832,7 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
|
||||
functions.UpdateState = osmesa_update_state;
|
||||
|
||||
if (!_mesa_initialize_context(&osmesa->mesa,
|
||||
API_OPENGL_COMPAT,
|
||||
api_profile,
|
||||
osmesa->gl_visual,
|
||||
sharelist ? &sharelist->mesa
|
||||
: (struct gl_context *) NULL,
|
||||
@@ -819,6 +909,13 @@ OSMesaCreateContextExt( GLenum format, GLint depthBits, GLint stencilBits,
|
||||
|
||||
_mesa_compute_version(ctx);
|
||||
|
||||
if (ctx->Version < version_major * 10 + version_minor) {
|
||||
_mesa_destroy_visual(osmesa->gl_visual);
|
||||
_mesa_free_context_data(ctx);
|
||||
free(osmesa);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Exec table initialization requires the version to be computed */
|
||||
_mesa_initialize_dispatch_tables(ctx);
|
||||
_mesa_initialize_vbo_vtxfmt(ctx);
|
||||
@@ -1121,6 +1218,7 @@ struct name_function
|
||||
static struct name_function functions[] = {
|
||||
{ "OSMesaCreateContext", (OSMESAproc) OSMesaCreateContext },
|
||||
{ "OSMesaCreateContextExt", (OSMESAproc) OSMesaCreateContextExt },
|
||||
{ "OSMesaCreateContextAttribs", (OSMESAproc) OSMesaCreateContextAttribs },
|
||||
{ "OSMesaDestroyContext", (OSMESAproc) OSMesaDestroyContext },
|
||||
{ "OSMesaMakeCurrent", (OSMESAproc) OSMesaMakeCurrent },
|
||||
{ "OSMesaGetCurrentContext", (OSMESAproc) OSMesaGetCurrentContext },
|
||||
|
Reference in New Issue
Block a user