xm_buffer.c revision e4b2356c07d31fbeeabb13b2fb47db703b473080
1e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/*
2e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Mesa 3-D graphics library
3e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Version:  6.3
4e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *
5e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Copyright (C) 1999-2005  Brian Paul   All Rights Reserved.
6e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *
7e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
8e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * copy of this software and associated documentation files (the "Software"),
9e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * to deal in the Software without restriction, including without limitation
10e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * and/or sell copies of the Software, and to permit persons to whom the
12e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Software is furnished to do so, subject to the following conditions:
13e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *
14e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * The above copyright notice and this permission notice shall be included
15e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * in all copies or substantial portions of the Software.
16e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul *
17e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
24e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
25e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
26e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "glxheader.h"
27e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "GL/xmesa.h"
28e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "xmesaP.h"
29e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "imports.h"
30e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul#include "renderbuffer.h"
31e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
32e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
33e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic void
34e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_delete_renderbuffer(struct gl_renderbuffer *rb)
35e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
36e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* XXX this routine should really delete the attached ximage, etc. */
37e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
38e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
39e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
40e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul/**
41e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * Reallocate renderbuffer storage.
42e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * This is called when the window's resized.  It'll get called once for
43e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul * the front color renderbuffer and again for the back color renderbuffer.
44e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul */
45e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstatic GLboolean
46e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_alloc_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
47e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul                    GLenum internalFormat, GLuint width, GLuint height)
48e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
49e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct xmesa_renderbuffer *xrb = (struct xmesa_renderbuffer *) rb;
50e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
51e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (xrb->ximage) {
52e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Needed by PIXELADDR1 macro */
53e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->width1 = xrb->ximage->bytes_per_line;
54e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->origin1 = (GLubyte *) xrb->ximage->data + xrb->width1 * (height - 1);
55e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
56e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Needed by PIXELADDR2 macro */
57e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->width2 = xrb->ximage->bytes_per_line / 2;
58e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->origin2 = (GLushort *) xrb->ximage->data + xrb->width2 * (height - 1);
59e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
60e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Needed by PIXELADDR3 macro */
61e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->width3 = xrb->ximage->bytes_per_line;
62e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->origin3 = (GLubyte *) xrb->ximage->data + xrb->width3 * (height - 1);
63e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
64e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      /* Needed by PIXELADDR4 macro */
65e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->width4 = xrb->ximage->width;
66e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->origin4 = (GLuint *) xrb->ximage->data + xrb->width4 * (height - 1);
67e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
68e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   else {
69e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      assert(xrb->pixmap);
70e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
71e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
72e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   /* for the FLIP macro: */
73e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   xrb->bottom = height - 1;
74e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
75e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   rb->Width = width;
76e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   rb->Height = height;
77e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   rb->InternalFormat = internalFormat;
78e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
79e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return GL_TRUE;
80e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
81e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
82e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
83e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulstruct xmesa_renderbuffer *
84e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paulxmesa_new_renderbuffer(GLcontext *ctx, GLuint name, GLboolean rgbMode)
85e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul{
86e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   struct xmesa_renderbuffer *xrb = CALLOC_STRUCT(xmesa_renderbuffer);
87e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   if (xrb) {
88e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      GLuint name = 0;
89e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      _mesa_init_renderbuffer(&xrb->Base, name);
90e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
91e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->Base.Delete = xmesa_delete_renderbuffer;
92e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->Base.AllocStorage = xmesa_alloc_storage;
93e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
94e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      if (rgbMode) {
95e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base.InternalFormat = GL_RGBA;
96e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base._BaseFormat = GL_RGBA;
97e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base.DataType = GL_UNSIGNED_BYTE;
98e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
99e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      else {
100e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base.InternalFormat = GL_COLOR_INDEX;
101e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base._BaseFormat = GL_COLOR_INDEX;
102e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul         xrb->Base.DataType = GL_UNSIGNED_INT;
103e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      }
104e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul      xrb->Base.ComponentSizes[0] = 0; /* XXX fix? */
105e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   }
106e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul   return xrb;
107e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul}
108e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
109e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
110e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
111e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul
112