Home | History | Annotate | Download | only in main
      1 /*
      2  * Mesa 3-D graphics library
      3  * Version:  7.5
      4  *
      5  * Copyright (C) 2009  VMware, Inc.  All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included
     15  * in all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     18  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
     21  * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
     22  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 
     25 
     26 /**
     27  * \file viewport.c
     28  * glViewport and glDepthRange functions.
     29  */
     30 
     31 
     32 #include "context.h"
     33 #include "macros.h"
     34 #include "mtypes.h"
     35 #include "viewport.h"
     36 
     37 
     38 /**
     39  * Set the viewport.
     40  * \sa Called via glViewport() or display list execution.
     41  *
     42  * Flushes the vertices and calls _mesa_set_viewport() with the given
     43  * parameters.
     44  */
     45 void GLAPIENTRY
     46 _mesa_Viewport(GLint x, GLint y, GLsizei width, GLsizei height)
     47 {
     48    GET_CURRENT_CONTEXT(ctx);
     49    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
     50    _mesa_set_viewport(ctx, x, y, width, height);
     51 }
     52 
     53 
     54 /**
     55  * Set new viewport parameters and update derived state (the _WindowMap
     56  * matrix).  Usually called from _mesa_Viewport().
     57  *
     58  * \param ctx GL context.
     59  * \param x, y coordinates of the lower left corner of the viewport rectangle.
     60  * \param width width of the viewport rectangle.
     61  * \param height height of the viewport rectangle.
     62  */
     63 void
     64 _mesa_set_viewport(struct gl_context *ctx, GLint x, GLint y,
     65                     GLsizei width, GLsizei height)
     66 {
     67    if (MESA_VERBOSE & VERBOSE_API)
     68       _mesa_debug(ctx, "glViewport %d %d %d %d\n", x, y, width, height);
     69 
     70    if (width < 0 || height < 0) {
     71       _mesa_error(ctx,  GL_INVALID_VALUE,
     72                    "glViewport(%d, %d, %d, %d)", x, y, width, height);
     73       return;
     74    }
     75 
     76    /* clamp width and height to the implementation dependent range */
     77    width  = MIN2(width, (GLsizei) ctx->Const.MaxViewportWidth);
     78    height = MIN2(height, (GLsizei) ctx->Const.MaxViewportHeight);
     79 
     80    ctx->Viewport.X = x;
     81    ctx->Viewport.Width = width;
     82    ctx->Viewport.Y = y;
     83    ctx->Viewport.Height = height;
     84    ctx->NewState |= _NEW_VIEWPORT;
     85 
     86 #if 1
     87    /* XXX remove this someday.  Currently the DRI drivers rely on
     88     * the WindowMap matrix being up to date in the driver's Viewport
     89     * and DepthRange functions.
     90     */
     91    _math_matrix_viewport(&ctx->Viewport._WindowMap,
     92                          ctx->Viewport.X, ctx->Viewport.Y,
     93                          ctx->Viewport.Width, ctx->Viewport.Height,
     94                          ctx->Viewport.Near, ctx->Viewport.Far,
     95                          ctx->DrawBuffer->_DepthMaxF);
     96 #endif
     97 
     98    if (ctx->Driver.Viewport) {
     99       /* Many drivers will use this call to check for window size changes
    100        * and reallocate the z/stencil/accum/etc buffers if needed.
    101        */
    102       ctx->Driver.Viewport(ctx, x, y, width, height);
    103    }
    104 }
    105 
    106 
    107 /**
    108  * Called by glDepthRange
    109  *
    110  * \param nearval  specifies the Z buffer value which should correspond to
    111  *                 the near clip plane
    112  * \param farval  specifies the Z buffer value which should correspond to
    113  *                the far clip plane
    114  */
    115 void GLAPIENTRY
    116 _mesa_DepthRange(GLclampd nearval, GLclampd farval)
    117 {
    118    GET_CURRENT_CONTEXT(ctx);
    119    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
    120 
    121    if (MESA_VERBOSE&VERBOSE_API)
    122       _mesa_debug(ctx, "glDepthRange %f %f\n", nearval, farval);
    123 
    124    if (ctx->Viewport.Near == nearval &&
    125        ctx->Viewport.Far == farval)
    126       return;
    127 
    128    ctx->Viewport.Near = (GLfloat) CLAMP(nearval, 0.0, 1.0);
    129    ctx->Viewport.Far = (GLfloat) CLAMP(farval, 0.0, 1.0);
    130    ctx->NewState |= _NEW_VIEWPORT;
    131 
    132 #if 1
    133    /* XXX remove this someday.  Currently the DRI drivers rely on
    134     * the WindowMap matrix being up to date in the driver's Viewport
    135     * and DepthRange functions.
    136     */
    137    _math_matrix_viewport(&ctx->Viewport._WindowMap,
    138                          ctx->Viewport.X, ctx->Viewport.Y,
    139                          ctx->Viewport.Width, ctx->Viewport.Height,
    140                          ctx->Viewport.Near, ctx->Viewport.Far,
    141                          ctx->DrawBuffer->_DepthMaxF);
    142 #endif
    143 
    144    if (ctx->Driver.DepthRange) {
    145       ctx->Driver.DepthRange(ctx, nearval, farval);
    146    }
    147 }
    148 
    149 void GLAPIENTRY
    150 _mesa_DepthRangef(GLclampf nearval, GLclampf farval)
    151 {
    152    _mesa_DepthRange(nearval, farval);
    153 }
    154 
    155 /**
    156  * Initialize the context viewport attribute group.
    157  * \param ctx  the GL context.
    158  */
    159 void _mesa_init_viewport(struct gl_context *ctx)
    160 {
    161    GLfloat depthMax = 65535.0F; /* sorf of arbitrary */
    162 
    163    /* Viewport group */
    164    ctx->Viewport.X = 0;
    165    ctx->Viewport.Y = 0;
    166    ctx->Viewport.Width = 0;
    167    ctx->Viewport.Height = 0;
    168    ctx->Viewport.Near = 0.0;
    169    ctx->Viewport.Far = 1.0;
    170    _math_matrix_ctr(&ctx->Viewport._WindowMap);
    171 
    172    _math_matrix_viewport(&ctx->Viewport._WindowMap, 0, 0, 0, 0,
    173                          0.0F, 1.0F, depthMax);
    174 }
    175 
    176 
    177 /**
    178  * Free the context viewport attribute group data.
    179  * \param ctx  the GL context.
    180  */
    181 void _mesa_free_viewport_data(struct gl_context *ctx)
    182 {
    183    _math_matrix_dtr(&ctx->Viewport._WindowMap);
    184 }
    185 
    186