/* * Direct Rendering Support for SMedia Glamo 336x/337x * * (c) 2009 Thomas White * Roughly based on radeon_fbo.c (c) 2008 Red Hat Inc * * 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 "main/imports.h" #include "main/macros.h" #include "main/mtypes.h" #include "main/fbobject.h" #include "main/framebuffer.h" #include "main/renderbuffer.h" #include "main/context.h" #include "dri_util.h" /* This comes from libdrm_glamo */ #include #include "glamo_fbo.h" static void glamo_delete_renderbuffer(struct gl_renderbuffer *rb) { struct glamo_renderbuffer *grb = glamo_renderbuffer(rb); ASSERT(grb); if ( grb && grb->bo ) { glamo_bo_unref(grb->bo); } _mesa_free(grb); } static void *glamo_get_pointer(GLcontext *ctx, struct gl_renderbuffer *rb, GLint x, GLint y) { return NULL; /* Can't be directly addressed */ } /* Called for each hardware renderbuffer when a _window_ is resized. * Just update fields. * Not used for user-created renderbuffers! */ static GLboolean glamo_alloc_window_storage(GLcontext *ctx, struct gl_renderbuffer *rb, GLenum internalFormat, GLuint width, GLuint height) { ASSERT(rb->Name == 0); rb->Width = width; rb->Height = height; rb->_ActualFormat = internalFormat; return GL_TRUE; } /* Create a buffer, such as a colour or depth buffer */ struct glamo_renderbuffer *glamo_create_renderbuffer(GLenum format, __DRIdrawable *driDrawPriv) { struct glamo_renderbuffer *grb; grb = CALLOC_STRUCT(glamo_renderbuffer); if ( !grb ) return NULL; _mesa_init_renderbuffer(&grb->base, 0); grb->base.ClassID = GLAMO_RB_CLASS; switch (format) { case GL_RGB5: grb->base._ActualFormat = GL_RGB5; grb->base._BaseFormat = GL_RGBA; grb->base.RedBits = 5; grb->base.GreenBits = 6; grb->base.BlueBits = 5; grb->base.DataType = GL_UNSIGNED_BYTE; break; case GL_DEPTH_COMPONENT16: grb->base._ActualFormat = GL_DEPTH_COMPONENT16; grb->base._BaseFormat = GL_DEPTH_COMPONENT; grb->base.DepthBits = 16; grb->base.DataType = GL_UNSIGNED_SHORT; break; default: fprintf(stderr, "%s: Unknown format 0x%04x\n", __FUNCTION__, format); _mesa_delete_renderbuffer(&grb->base); return NULL; } grb->dPriv = driDrawPriv; grb->base.InternalFormat = format; grb->base.Delete = glamo_delete_renderbuffer; grb->base.AllocStorage = glamo_alloc_window_storage; grb->base.GetPointer = glamo_get_pointer; return grb; } void glamo_renderbuffer_set_bo(struct glamo_renderbuffer *grb, struct glamo_bo *bo) { struct glamo_bo *old; old = grb->bo; grb->bo = bo; glamo_bo_ref(bo); if ( old ) glamo_bo_unref(old); } /* kate: space-indent on; indent-width 3; mixedindent off; indent-mode cstyle; */