/* * Direct Rendering Support for SMedia Glamo 336x/337x * * (c) 2009 Thomas White * Roughly based on sis_screen.c (c) 2003 Eric Anholt * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include "dri_util.h" #include "utils.h" #include "xmlconfig.h" #include "GL/internal/dri_interface.h" #include "main/framebuffer.h" #include "main/renderbuffer.h" #include "glamo_screen.h" #include "glamo_context.h" #include "glamo_fbo.h" /* This comes from libdrm_glamo */ #include static int glamoInitDriver(__DRIscreen *psp) { return 0; } static glamoScreenPtr glamoCreateScreen(__DRIscreen *sPriv) { glamoScreenPtr glamoScreen; /* Allocate the private area */ glamoScreen = (glamoScreenPtr)CALLOC(sizeof(*glamoScreen)); if ( glamoScreen == NULL ) return NULL; glamoScreen->driScreen = sPriv; /* This is our link to the kernel's memory manager, via libdrm */ glamoScreen->bom = glamo_bo_manager_gem_ctor(sPriv->fd); return glamoScreen; } static void glamoDestroyScreen(__DRIscreen *sPriv) { glamoScreenPtr glamoScreen = (glamoScreenPtr)sPriv->private; if ( glamoScreen == NULL ) return; FREE(glamoScreen); sPriv->private = NULL; } static const __DRIconfig **glamoInitScreen(__DRIscreen *sPriv) { __DRIconfig **configs; uint8_t depth_bits_array[2]; uint8_t stencil_bits_array[2]; uint8_t msaa_samples_array[1]; static const GLenum db_modes[] = { GLX_SWAP_COPY_OML, GLX_NONE }; /* Driver initialisation */ if ( glamoInitDriver(sPriv) ) { return NULL; } /* Screen-specific initialisation */ sPriv->private = glamoCreateScreen(sPriv); if ( !sPriv->private ) { glamoDestroyScreen(sPriv); return NULL; } depth_bits_array[0] = 0; stencil_bits_array[0] = 0; depth_bits_array[1] = 16; stencil_bits_array[1] = 0; msaa_samples_array[0] = 0; configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, depth_bits_array, stencil_bits_array, 2, db_modes, 2, msaa_samples_array, 1); if ( configs == NULL ) { fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__); return NULL; } return (const __DRIconfig **)configs; } static const __DRIconfig **glamoInitScreen2(__DRIscreen *sPriv) { __DRIconfig **configs; uint8_t depth_bits_array[2]; uint8_t stencil_bits_array[2]; uint8_t msaa_samples_array[1]; static const GLenum db_modes[] = { GLX_SWAP_COPY_OML, GLX_NONE }; /* Driver initialisation */ if ( glamoInitDriver(sPriv) ) { return NULL; } /* Screen-specific initialisation */ sPriv->private = glamoCreateScreen(sPriv); if ( !sPriv->private ) { glamoDestroyScreen(sPriv); return NULL; } depth_bits_array[0] = 0; stencil_bits_array[0] = 0; depth_bits_array[1] = 16; stencil_bits_array[1] = 0; msaa_samples_array[0] = 0; configs = driCreateConfigs(GL_RGB, GL_UNSIGNED_SHORT_5_6_5, depth_bits_array, stencil_bits_array, 2, db_modes, 2, msaa_samples_array, 1); if ( configs == NULL ) { fprintf(stderr, "[%s:%u] Error creating FBConfig!\n", __func__, __LINE__); return NULL; } return (const __DRIconfig **)configs; } /* Allocate buffers for a context. This is where the fun starts... */ static GLboolean glamoCreateBuffer(__DRIscreen *driScrnPriv, __DRIdrawable *driDrawPriv, const __GLcontextModes *mesaVis, GLboolean isPixmap) { struct glamo_framebuffer *gfb; GLenum rgbFormat; if ( isPixmap ) return GL_FALSE; /* not implemented */ gfb = CALLOC_STRUCT(glamo_framebuffer); if ( !gfb ) return GL_FALSE; _mesa_initialize_framebuffer(&gfb->base, mesaVis); /* we only support this one format at the moment */ rgbFormat = GL_RGB5; /* Front color renderbuffer */ gfb->color_rb[0] = glamo_create_renderbuffer(rgbFormat, driDrawPriv); _mesa_add_renderbuffer(&gfb->base, BUFFER_FRONT_LEFT, &gfb->color_rb[0]->base); /* Back color renderbuffer, if requested */ if ( mesaVis->doubleBufferMode ) { gfb->color_rb[1] = glamo_create_renderbuffer(rgbFormat, driDrawPriv); _mesa_add_renderbuffer(&gfb->base, BUFFER_BACK_LEFT, &gfb->color_rb[1]->base); } if ( mesaVis->depthBits == 16 ) { struct glamo_renderbuffer *depth; depth = glamo_create_renderbuffer(GL_DEPTH_COMPONENT16, driDrawPriv); _mesa_add_renderbuffer(&gfb->base, BUFFER_DEPTH, &depth->base); } /* Add software renderbuffers for the things we can't support in hardware */ _mesa_add_soft_renderbuffers(&gfb->base, GL_FALSE, /* color */ GL_FALSE, /* depth */ mesaVis->stencilBits > 0, /* stencil, if required */ mesaVis->accumRedBits > 0, /* accum, if required */ GL_FALSE, /* alpha */ GL_FALSE /* aux */ ); driDrawPriv->driverPrivate = (void *)gfb; return (driDrawPriv->driverPrivate != NULL); } static void glamoDestroyBuffer(__DRIdrawable *driDrawPriv) { } static void glamoSwapBuffers(__DRIdrawable *driDrawPriv) { printf("glamoSwapBuffers\n"); fflush(stdout); } /* * Mesa entry points * * See src/mesa/drivers/dri/common/dri_util.h for information about these */ const struct __DriverAPIRec driDriverAPI = { .InitScreen = glamoInitScreen, .DestroyScreen = glamoDestroyScreen, .CreateContext = glamoCreateContext, .DestroyContext = glamoDestroyContext, .CreateBuffer = glamoCreateBuffer, .DestroyBuffer = glamoDestroyBuffer, .SwapBuffers = glamoSwapBuffers, .MakeCurrent = glamoMakeCurrent, .UnbindContext = glamoUnbindContext, .GetSwapInfo = NULL, /* Not used */ .WaitForMSC = NULL, .WaitForSBC = NULL, .SwapBuffersMSC = NULL, .CopySubBuffer = NULL, .GetDrawableMSC = NULL, /* Not used */ .InitScreen2 = glamoInitScreen2, /* For DRI2 */ }; /* kate: space-indent on; indent-width 3; mixedindent off; indent-mode cstyle; */