mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-26 16:30:23 +01:00
Add NEW_INTERFACE bits.
This commit is contained in:
parent
1312498709
commit
635ba1565c
1 changed files with 128 additions and 2 deletions
|
|
@ -41,6 +41,10 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
|
||||
#include "xmlpool.h"
|
||||
|
||||
#ifndef _SOLO
|
||||
#include "GL/internal/dri_interface.h"
|
||||
#endif
|
||||
|
||||
const char __driConfigOptions[] =
|
||||
DRI_CONF_BEGIN
|
||||
DRI_CONF_SECTION_DEBUG
|
||||
|
|
@ -54,6 +58,72 @@ DRI_CONF_BEGIN
|
|||
DRI_CONF_END;
|
||||
static const GLuint __driNConfigOptions = 2;
|
||||
|
||||
#ifdef USE_NEW_INTERFACE
|
||||
static PFNGLXCREATECONTEXTMODES create_context_modes = NULL;
|
||||
#endif /* USE_NEW_INTERFACE */
|
||||
|
||||
#ifdef USE_NEW_INTERFACE
|
||||
static __GLcontextModes *
|
||||
sisFillInModes(int bpp)
|
||||
{
|
||||
__GLcontextModes *modes;
|
||||
__GLcontextModes *m;
|
||||
unsigned num_modes;
|
||||
unsigned depth_buffer_factor;
|
||||
unsigned back_buffer_factor;
|
||||
GLenum fb_format;
|
||||
GLenum fb_type;
|
||||
static const GLenum back_buffer_modes[] = {
|
||||
GLX_NONE, GLX_SWAP_UNDEFINED_OML
|
||||
};
|
||||
uint8_t depth_bits_array[4];
|
||||
uint8_t stencil_bits_array[4];
|
||||
|
||||
depth_bits_array[0] = 0;
|
||||
stencil_bits_array[0] = 0;
|
||||
depth_bits_array[1] = 16;
|
||||
stencil_bits_array[1] = 0;
|
||||
depth_bits_array[2] = 24;
|
||||
stencil_bits_array[2] = 8;
|
||||
depth_bits_array[3] = 32;
|
||||
stencil_bits_array[3] = 0;
|
||||
|
||||
depth_buffer_factor = 4;
|
||||
back_buffer_factor = 2;
|
||||
|
||||
/* Last 4 is for GLX_TRUE_COLOR & GLX_DIRECT_COLOR, with/without accum */
|
||||
num_modes = depth_buffer_factor * back_buffer_factor * 4;
|
||||
|
||||
if (bpp == 16) {
|
||||
fb_format = GL_RGB;
|
||||
fb_type = GL_UNSIGNED_SHORT_5_6_5;
|
||||
} else {
|
||||
fb_format = GL_BGRA;
|
||||
fb_type = GL_UNSIGNED_INT_8_8_8_8_REV;
|
||||
}
|
||||
|
||||
modes = (*create_context_modes)(num_modes, sizeof(__GLcontextModes));
|
||||
m = modes;
|
||||
if (!driFillInModes(&m, fb_format, fb_type, depth_bits_array,
|
||||
stencil_bits_array, depth_buffer_factor,
|
||||
back_buffer_modes, back_buffer_factor,
|
||||
GLX_TRUE_COLOR)) {
|
||||
fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!driFillInModes(&m, fb_format, fb_type, depth_bits_array,
|
||||
stencil_bits_array, depth_buffer_factor,
|
||||
back_buffer_modes, back_buffer_factor,
|
||||
GLX_DIRECT_COLOR)) {
|
||||
fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return modes;
|
||||
}
|
||||
#endif /* USE_NEW_INTERFACE */
|
||||
|
||||
/* Create the device specific screen private data struct.
|
||||
*/
|
||||
static sisScreenPtr
|
||||
|
|
@ -62,8 +132,11 @@ sisCreateScreen( __DRIscreenPrivate *sPriv )
|
|||
sisScreenPtr sisScreen;
|
||||
SISDRIPtr sisDRIPriv = (SISDRIPtr)sPriv->pDevPriv;
|
||||
|
||||
#ifndef USE_NEW_INTERFACE
|
||||
/* XXX Should this still be around for the old interface? */
|
||||
if ( !driCheckDriDdxDrmVersions( sPriv, "SiS", 4, 0, 0, 1, 1, 0 ) )
|
||||
return NULL;
|
||||
#endif
|
||||
|
||||
/* Allocate the private area */
|
||||
sisScreen = (sisScreenPtr)CALLOC( sizeof(*sisScreen) );
|
||||
|
|
@ -274,12 +347,13 @@ static struct __DriverAPIRec sisAPI = {
|
|||
* The __driCreateScreen name is the symbol that libGL.so fetches.
|
||||
* Return: pointer to a __DRIscreenPrivate.
|
||||
*/
|
||||
#if !defined(DRI_NEW_INTERFACE_ONLY)
|
||||
#ifndef _SOLO
|
||||
void *__driCreateScreen(Display *dpy, int scrn, __DRIscreen *psc,
|
||||
int numConfigs, __GLXvisualConfig *config)
|
||||
{
|
||||
__DRIscreenPrivate *psp;
|
||||
psp = __driUtilCreateScreen( dpy, scrn, psc, numConfigs, config, &sisAPI );
|
||||
psp = __driUtilCreateScreen(dpy, scrn, psc, numConfigs, config, &sisAPI);
|
||||
return (void *)psp;
|
||||
}
|
||||
#else
|
||||
|
|
@ -288,6 +362,58 @@ void *__driCreateScreen(struct DRIDriverRec *driver,
|
|||
{
|
||||
__DRIscreenPrivate *psp;
|
||||
psp = __driUtilCreateScreen(driver, driverContext, &sisAPI);
|
||||
return (void *) psp;
|
||||
return (void *)psp;
|
||||
}
|
||||
#endif
|
||||
#endif /* !defined(DRI_NEW_INTERFACE_ONLY) */
|
||||
|
||||
/**
|
||||
* This is the bootstrap function for the driver. libGL supplies all of the
|
||||
* requisite information about the system, and the driver initializes itself.
|
||||
* This routine also fills in the linked list pointed to by \c driver_modes
|
||||
* with the \c __GLcontextModes that the driver can support for windows or
|
||||
* pbuffers.
|
||||
*
|
||||
* \return A pointer to a \c __DRIscreenPrivate on success, or \c NULL on
|
||||
* failure.
|
||||
*/
|
||||
#ifdef USE_NEW_INTERFACE
|
||||
void * __driCreateNewScreen( __DRInativeDisplay *dpy, int scrn,
|
||||
__DRIscreen *psc,
|
||||
const __GLcontextModes *modes,
|
||||
const __DRIversion *ddx_version,
|
||||
const __DRIversion *dri_version,
|
||||
const __DRIversion *drm_version,
|
||||
const __DRIframebuffer *frame_buffer,
|
||||
drmAddress pSAREA, int fd,
|
||||
int internal_api_version,
|
||||
__GLcontextModes **driver_modes )
|
||||
|
||||
{
|
||||
__DRIscreenPrivate *psp;
|
||||
static const __DRIversion ddx_expected = {0, 1, 0};
|
||||
static const __DRIversion dri_expected = {4, 0, 0};
|
||||
static const __DRIversion drm_expected = {1, 0, 0};
|
||||
|
||||
if (!driCheckDriDdxDrmVersions2("SiS", dri_version, &dri_expected,
|
||||
ddx_version, &ddx_expected,
|
||||
drm_version, &drm_expected)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
psp = __driUtilCreateNewScreen(dpy, scrn, psc, NULL,
|
||||
ddx_version, dri_version, drm_version,
|
||||
frame_buffer, pSAREA, fd,
|
||||
internal_api_version, &sisAPI);
|
||||
if (psp != NULL) {
|
||||
create_context_modes = (PFNGLXCREATECONTEXTMODES)
|
||||
glXGetProcAddress((const GLubyte *)"__glXCreateContextModes");
|
||||
if (create_context_modes != NULL) {
|
||||
SISDRIPtr dri_priv = (SISDRIPtr)psp->pDevPriv;
|
||||
*driver_modes = sisFillInModes(dri_priv->bytesPerPixel * 8);
|
||||
}
|
||||
}
|
||||
|
||||
return (void *)psp;
|
||||
}
|
||||
#endif /* USE_NEW_INTERFACE */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue