/*
* Mesa 3-D graphics library
- * Version: 6.5.2
*
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
*
* 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
- * BRIAN PAUL 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.
+ * THE AUTHORS OR COPYRIGHT HOLDERS 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/bufferobj.h"
#include "main/context.h"
#include "main/colormac.h"
+#include "main/fbobject.h"
+#include "main/framebuffer.h"
#include "main/macros.h"
+#include "main/mipmap.h"
#include "main/image.h"
#include "main/imports.h"
#include "main/mtypes.h"
{
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
if (xmesa) {
- _glthread_LOCK_MUTEX(_xmesa_lock);
+ mtx_lock(&_xmesa_lock);
XSync( xmesa->display, False );
- _glthread_UNLOCK_MUTEX(_xmesa_lock);
+ mtx_unlock(&_xmesa_lock);
}
}
const int xclass = xmesa->xm_visual->visualType;
(void) amask;
- if (ctx->DrawBuffer->Name != 0)
+ if (_mesa_is_user_fbo(ctx->DrawBuffer))
return;
xmbuf = XMESA_BUFFER(ctx->DrawBuffer);
static void
clear_buffers(struct gl_context *ctx, GLbitfield buffers)
{
- if (ctx->DrawBuffer->Name == 0) {
+ if (_mesa_is_winsys_fbo(ctx->DrawBuffer)) {
/* this is a window system framebuffer */
const GLuint *colorMask = (GLuint *) &ctx->Color.ColorMask[0];
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
if (format == GL_BGRA &&
type == GL_UNSIGNED_BYTE &&
ctx->DrawBuffer &&
- ctx->DrawBuffer->Name == 0 &&
+ _mesa_is_winsys_fbo(ctx->DrawBuffer) &&
ctx->Pixel.ZoomX == 1.0 && /* no zooming */
ctx->Pixel.ZoomY == 1.0 &&
ctx->_ImageTransferState == 0 /* no color tables, scale/bias, etc */) {
buf = (GLubyte *) ctx->Driver.MapBufferRange(ctx, 0,
unpack->BufferObj->Size,
GL_MAP_READ_BIT,
- unpack->BufferObj);
+ unpack->BufferObj,
+ MAP_INTERNAL);
if (!buf) {
- /* buffer is already mapped - that's an error */
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glDrawPixels(PBO is mapped)");
- return;
+ return; /* error */
}
pixels = ADD_POINTERS(buf, pixels);
}
const int rowLength = clippedUnpack.RowLength;
XMesaImage ximage;
- ASSERT(xmesa->xm_visual->dithered_pf == PF_8R8G8B);
- ASSERT(xmesa->xm_visual->undithered_pf == PF_8R8G8B);
- ASSERT(dpy);
- ASSERT(gc);
+ assert(xmesa->xm_visual->dithered_pf == PF_8R8G8B);
+ assert(xmesa->xm_visual->undithered_pf == PF_8R8G8B);
+ assert(dpy);
+ assert(gc);
/* This is a little tricky since all coordinates up to now have
* been in the OpenGL bottom-to-top orientation. X is top-to-bottom
}
if (_mesa_is_bufferobj(unpack->BufferObj)) {
- ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj);
+ ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj, MAP_INTERNAL);
}
}
else {
type == GL_UNSIGNED_SHORT_5_6_5 &&
!ctx->Color.DitherFlag && /* no dithering */
ctx->DrawBuffer &&
- ctx->DrawBuffer->Name == 0 &&
+ _mesa_is_winsys_fbo(ctx->DrawBuffer) &&
ctx->Pixel.ZoomX == 1.0 && /* no zooming */
ctx->Pixel.ZoomY == 1.0 &&
ctx->_ImageTransferState == 0 /* no color tables, scale/bias, etc */) {
buf = (GLubyte *) ctx->Driver.MapBufferRange(ctx, 0,
unpack->BufferObj->Size,
GL_MAP_READ_BIT,
- unpack->BufferObj);
+ unpack->BufferObj,
+ MAP_INTERNAL);
if (!buf) {
- /* buffer is already mapped - that's an error */
- _mesa_error(ctx, GL_INVALID_OPERATION,
- "glDrawPixels(PBO is mapped)");
- return;
+ return; /* error */
}
pixels = ADD_POINTERS(buf, pixels);
}
const int rowLength = clippedUnpack.RowLength;
XMesaImage ximage;
- ASSERT(xmesa->xm_visual->undithered_pf == PF_5R6G5B);
- ASSERT(dpy);
- ASSERT(gc);
+ assert(xmesa->xm_visual->undithered_pf == PF_5R6G5B);
+ assert(dpy);
+ assert(gc);
/* This is a little tricky since all coordinates up to now have
* been in the OpenGL bottom-to-top orientation. X is top-to-bottom
}
if (unpack->BufferObj->Name) {
- ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj);
+ ctx->Driver.UnmapBuffer(ctx, unpack->BufferObj, MAP_INTERNAL);
}
}
else {
struct xmesa_renderbuffer *dstXrb
= xmesa_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
- ASSERT(dpy);
- ASSERT(gc);
+ assert(dpy);
+ assert(gc);
/* Note: we don't do any special clipping work here. We could,
* but X will do it for us.
* Called when the driver should update its state, based on the new_state
* flags.
*/
-void
-xmesa_update_state( struct gl_context *ctx, GLbitfield new_state )
+static void
+xmesa_update_state(struct gl_context *ctx)
{
+ GLbitfield new_state = ctx->NewState;
const XMesaContext xmesa = XMESA_CONTEXT(ctx);
+ if (new_state & (_NEW_SCISSOR | _NEW_BUFFERS | _NEW_VIEWPORT))
+ _mesa_update_draw_buffer_bounds(ctx, ctx->DrawBuffer);
+
/* Propagate statechange information to swrast and swrast_setup
* modules. The X11 driver has no internal GL-dependent state.
*/
_swrast_InvalidateState( ctx, new_state );
_tnl_InvalidateState( ctx, new_state );
- _vbo_InvalidateState( ctx, new_state );
_swsetup_InvalidateState( ctx, new_state );
- if (ctx->DrawBuffer->Name != 0)
+ if (_mesa_is_user_fbo(ctx->DrawBuffer))
return;
/*
}
-
-/**
- * In SW, we don't really compress GL_COMPRESSED_RGB[A] textures!
- */
-static gl_format
-choose_tex_format( struct gl_context *ctx, GLint internalFormat,
- GLenum format, GLenum type )
-{
- switch (internalFormat) {
- case GL_COMPRESSED_RGB_ARB:
- return MESA_FORMAT_RGB888;
- case GL_COMPRESSED_RGBA_ARB:
- return MESA_FORMAT_RGBA8888;
- default:
- return _mesa_choose_tex_format(ctx, internalFormat, format, type);
- }
-}
-
-
/**
* Called by glViewport.
* This is a good time for us to poll the current X window size and adjust
* That problem led to the GLX_MESA_resize_buffers extension.
*/
static void
-xmesa_viewport(struct gl_context *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
+xmesa_viewport(struct gl_context *ctx)
{
XMesaContext xmctx = XMESA_CONTEXT(ctx);
XMesaBuffer xmdrawbuf = XMESA_BUFFER(ctx->WinSysDrawBuffer);
XMesaBuffer xmreadbuf = XMESA_BUFFER(ctx->WinSysReadBuffer);
xmesa_check_and_update_buffer_size(xmctx, xmdrawbuf);
xmesa_check_and_update_buffer_size(xmctx, xmreadbuf);
- (void) x;
- (void) y;
- (void) w;
- (void) h;
}
/**
* Return the difference between the two given times in microseconds.
*/
-#ifdef __VMS
-#define suseconds_t unsigned int
-#endif
static GLuint64EXT
time_diff(const struct timeval *t0, const struct timeval *t1)
{
{
driver->GetString = get_string;
driver->UpdateState = xmesa_update_state;
- driver->GetBufferSize = NULL; /* OBSOLETE */
driver->Flush = finish_or_flush;
driver->Finish = finish_or_flush;
driver->ColorMask = color_mask;
if (TEST_META_FUNCS) {
driver->Clear = _mesa_meta_Clear;
driver->CopyPixels = _mesa_meta_CopyPixels;
- driver->BlitFramebuffer = _mesa_meta_BlitFramebuffer;
+ driver->BlitFramebuffer = _mesa_meta_and_swrast_BlitFramebuffer;
driver->DrawPixels = _mesa_meta_DrawPixels;
driver->Bitmap = _mesa_meta_Bitmap;
}
driver->MapRenderbuffer = xmesa_MapRenderbuffer;
driver->UnmapRenderbuffer = xmesa_UnmapRenderbuffer;
-#if ENABLE_EXT_texure_compression_s3tc
- driver->ChooseTextureFormat = choose_tex_format;
-#else
- (void) choose_tex_format;
-#endif
+ driver->GenerateMipmap = _mesa_generate_mipmap;
#if ENABLE_EXT_timer_query
driver->NewQueryObject = xmesa_new_query_object;