diff options
-rw-r--r-- | mesalib/docs/contents.html | 1 | ||||
-rw-r--r-- | mesalib/docs/subset-A.html | 3572 | ||||
-rw-r--r-- | mesalib/docs/subset.html | 25 | ||||
-rw-r--r-- | mesalib/src/glsl/builtin_variables.cpp | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/drivers/dri/common/Makefile.am | 8 | ||||
-rw-r--r-- | mesalib/src/mesa/drivers/dri/common/dri_test.c | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/main/dd.h | 12 | ||||
-rw-r--r-- | mesalib/src/mesa/main/teximage.c | 415 | ||||
-rw-r--r-- | mesalib/src/mesa/main/teximage.h | 9 | ||||
-rw-r--r-- | mesalib/src/mesa/main/texobj.h | 8 | ||||
-rw-r--r-- | mesalib/src/mesa/main/texstorage.c | 186 | ||||
-rw-r--r-- | mesalib/src/mesa/main/uniforms.h | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/main/version.c | 58 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_texture.c | 61 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_texture.c | 13 |
15 files changed, 403 insertions, 3971 deletions
diff --git a/mesalib/docs/contents.html b/mesalib/docs/contents.html index efd751919..6fc7c584a 100644 --- a/mesalib/docs/contents.html +++ b/mesalib/docs/contents.html @@ -78,7 +78,6 @@ <li><a href="helpwanted.html" target="MainFrame">Help Wanted</a> <li><a href="devinfo.html" target="MainFrame">Development Notes</a> <li><a href="sourcedocs.html" target="MainFrame">Source Documentation</a> -<li><a href="subset.html" target="MainFrame">Mesa Subset Driver</a> <li><a HREF="dispatch.html" target="MainFrame">GL Dispatch</a> </ul> diff --git a/mesalib/docs/subset-A.html b/mesalib/docs/subset-A.html deleted file mode 100644 index 6dcd84374..000000000 --- a/mesalib/docs/subset-A.html +++ /dev/null @@ -1,3572 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html lang="en"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8"> - <title>Mini GLX Specification</title> -</head> -<body> -<span style="font-style: italic;"></span><span - style="font-weight: bold;"></span> -<h1 style="text-align: center;">Mesa Subset Specification</h1> -<h2 style="text-align: center;">Tungsten Graphics, Inc.</h2> -<h2 style="text-align: center;">February 26, 2003</h2> -<p> Copyright © 2002-2003 by Tungsten Graphics, Inc., -Cedar Park, Texas. All Rights Reserved. <br> -<br> -Permission is granted to make and distribute verbatim copies of this -document provided the copyright notice and this permission notice are -preserved on all copies.<br> -</p> -<p> OpenGL is a trademark of <a href="http://www.sgi.com">Silicon -Graphics, Inc.</a>.</p> -<h1>1. Introduction</h1> -This document describes a subset of the Mesa implemented by Tungsten -Graphics, Inc. for embedded devices. Prior to reading this -document the reader should be familiar with the OpenGL 1.2.1 -specification dated April 1, 1999 (available from <a - href="http://www.opengl.org/developers/documentation/specs.html">http://www.opengl.org/developers/documentation/specs.html</a>.) - Experience with OpenGL programming is highly advisable.<a - href="http://www.opengl.org/developers/documentation/specs.html"><br> -</a><br> -Tungsten Graphics, Inc. is working with industry standards -organizations +in an attempt to standardize this Mesa subset and any -other possible subsets +as a result of this work. <br> -<br> -Appendix A contains a list of issues of which some may not be resolved.<br> -<br> -To summarize, the following major features of Mesa are omitted from the -subset:<br> -<ul> - <li>Vertex arrays</li> - <li>Texture coordinate generation</li> - <li>Lighting</li> - <li>Point size</li> - <li>Polygon stipple</li> - <li>DrawPixels, CopyPixels, PixelZoom</li> - <li>1-D and 3-D textures</li> - <li>CopyTex[Sub]Image</li> - <li>Fog</li> - <li>Depth test</li> - <li>Color Index mode</li> - <li>Accumulation buffer</li> - <li>Feedback mode</li> - <li>Evaluators</li> - <li>Push/Pop attributes</li> - <li>Display lists<br> - </li> -</ul> -<p>Further reductions are made at a lower level of detail.<br> -</p> -<p>Mesa function names are printed in <span style="font-weight: bold;">bold -face</span>. Function parameters are printed in <span - style="font-style: italic;">italics</span>.<br> -</p> -<p>The Tungsten Graphics, Inc. Mesa subset library is hereafter -referred to as <span style="font-style: italic;">the subset.</span><br> -<br> -</p> -<h1>2. Primitive Specification</h1> -<h2>2.1 glBegin, glEnd and glVertex Commands</h2> -The basic rendering primitives are points, lines and triangles. - Quadrilaterals and polygons are composed of triangles. - Primitives are drawn with the <span style="font-weight: bold;">glBegin</span> -and <span style="font-weight: bold;">glEnd</span> commands and a subset -of the <span style="font-weight: bold;">glVertex</span> commands:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glBegin</span>(GLenum<span - style="font-style: italic;">mode</span>)<br> -void <span style="font-weight: bold;">glEnd</span>(void)<br> -<br> -void <span style="font-weight: bold;">glVertex2f</span>(GLfloat <span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>)<br> -void <span style="font-weight: bold;">glVertex2fv</span>(const GLfloat -*<span style="font-style: italic;">v</span>)<br> -void <span style="font-weight: bold;">glVertex3f</span>(GLfloat <span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>, GLfloat <span - style="font-style: italic;">z</span>)<br> -void <span style="font-weight: bold;">glVertex3fv</span>(const GLfloat -*<span style="font-style: italic;">v</span>)<br> -</div> -<br> -The <span style="font-style: italic;">mode</span> parameter to <span - style="font-weight: bold;">glBegin</span> may be one of the following<br> -<br> -<div style="margin-left: 40px;">GL_POINTS - a series of individual -points<br> -GL_LINES - a series of disjoint line segments<br> -GL_LINE_STRIP - series of connected line segments<br> -GL_LINE_LOOP - a closed loop of line segments<br> -GL_TRIANGLES - a series of individual triangles<br> -GL_TRIANGLE_STRIP - a connected strip of triangles<br> -GL_TRIANGLE_FAN - a sequence of triangles all sharing a common vertex<br> -GL_QUADS - a sequence of individual quadrilaterals<br> -GL_QUAD_STRIP - a connected strip of quadrilaterals<br> -GL_POLYGON - a closed, convex polygon<br> -<br> -</div> -<br> -The <span style="font-weight: bold;">glVertex</span> commands take two -or three floating point coordinates, or a pointer to an array of two or -three floating point coordinates. Vertices are actually 4-element -homogeneous coordinates. The fourth component, unspecified by the -subset's <span style="font-weight: bold;">glVertex</span> commands, is -one.<br> -<br> -<span style="font-weight: bold;"></span> -<h2>2.2 Other Per-vertex Commands<br> -</h2> -The <span style="font-weight: bold;">glColor</span> and <span - style="font-weight: bold;">glTexCoord</span> commands may be used to -specify colors and texture coordinates for each vertex:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glColor3f</span>(GLfloat<span - style="font-style: italic;">red</span>, GLfloat <span - style="font-style: italic;">green</span>, GLfloat <span - style="font-style: italic;">blue</span>)<br> -void <span style="font-weight: bold;">glColor3fv</span>(const GLfloat *<span - style="font-style: italic;">rgb</span>)<br> -void <span style="font-weight: bold;">glColor4f</span>(GLfloat <span - style="font-style: italic;">red,</span> GLfloat <span - style="font-style: italic;">green,</span> GLfloat <span - style="font-style: italic;">blue,</span> GLfloat <span - style="font-style: italic;">alpha</span>)<br> -void <span style="font-weight: bold;">glColor4fv</span>(const GLfloat *<span - style="font-style: italic;">rgba</span>)<br> -void <span style="font-weight: bold;">glTexCoord2f</span>(GLfloat <span - style="font-style: italic;">s</span>, GLfloat<span - style="font-style: italic;"> t</span>)<br> -void <span style="font-weight: bold;">glTexCoord2fv</span>(const -GLfloat *<span style="font-style: italic;">c</span>)<br> -<br> -</div> -The <span style="font-weight: bold;">glColor</span> commands specify -the color and optionally, the alpha value, for subsequent vertices. - For the <span style="font-weight: bold;">glColor3</span> commands, -alpha is set to one.<br> -<br> -The <span style="font-weight: bold;">glTexCoord2</span> commands -specify the texture coordinate for subsequent vertices. Texture -coordinates are actually four-component coordinates: (s, t, r, q). - The <span style="font-weight: bold;">glTexCoord2</span> commands -set s and t explicitly. The r and q components are zero and one, -respectively.<br> -<br> -<span style="font-weight: bold;"></span>Only <span - style="font-weight: bold;">glVertex, glColor</span> and <span - style="font-weight: bold;">glTexCoord</span> commands are allowed -between <span style="font-weight: bold;">glBegin</span> and <span - style="font-weight: bold;">glEnd.</span> Calling any other -command between <span style="font-weight: bold;">glBegin</span> and <span - style="font-weight: bold;">glEnd</span> will result in the error -GL_INVALID_OPERATION.<br> -<br> -<h2>2.3 Unsupported Commands</h2> -None of the following commands related to primitive specification are -supported by the subset:<br> -<br> -<div style="margin-left: 40px;">Per-Vertex commands:<br> -</div> -<div style="margin-left: 40px;"> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glVertex2d, -glVertex2i, glVertex2s, glVertex3d, glVertex3i, glVertex3s, glVertex4d, -glVertex4i, glVertex4s, glVertex2dv, glVertex2iv, glVertex2sv, -glVertex3dv, glVertex3iv, glVertex3sv, glVertex4dv, glVertex4iv, -glVertex4sv,<br> -glNormal3b, glNormal3d, glNormal3f, glNormal3i, glNormal3s, </span><span - style="font-weight: bold;">glNormal3bv, glNormal3dv, glNormal3fv, -glNormal3iv, glNormal3sv,<br> -glIndexd, glIndexf, glIndexi, glIndexs, glIndexub, glIndexdv, -glIndexfv, glIndexiv, glIndexsv, glIndexubv,<br> -glColor3b, glColor3d, glColor3i, glColor3s, glColor3ub, glColor3ui, -glColor3us, </span><span style="font-weight: bold;">glColor3bv, -glColor3dv, glColor3iv, glColor3sv, glColor3ubv, glColor3uiv, -glColor3usv,</span><span style="font-weight: bold;"> lColor4b, -glColor4d, glColor4i, glColor4s, glColor4ub, glColor4ui, glColor4us, </span><span - style="font-weight: bold;">glColor4bv, glColor4dv, glColor4iv, -glColor4sv, glColor4ubv, glColor4uiv, glColor4usv,<br> -</span><span style="font-weight: bold;">glTexCoord1d, glTexCoord1f, -glTexCoord1i, glTexCoord1s, glTexCoord2d, glTexCoord2i, glTexCoord2s, -glTexCoord3d, glTexCoord3f, glTexCoord3i, glTexCoord3s, glTexCoord4d, -glTexCoord4f, glTexCoord4i, glTexCoord4s, glTexCoord1dv, glTexCoord1fv, -glTexCoord1iv, glTexCoord1sv, glTexCoord2dv, glTexCoord2iv, -glTexCoord2sv, glTexCoord3dv, glTexCoord3fv, glTexCoord3iv, -glTexCoord3sv, glTexCoord4dv, glTexCoord4fv, glTexCoord4iv, -glTexCoord4sv,<br> -glEdgeFlag, glEdgeFlagv</span><br style="font-weight: bold;"> -<br> -</div> -Vertex array commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glVertexPointer, -glColorPointer, glIndexPointer, glTexCoordPointer, glEdgeFlagPointer, -glNormalPointer, glInterleavedArrays, glArrayElement, glDrawArrays, -glDrawElements, glDrawRangeElements, glEnableClientState, -glDisableClientState</span><br> -</div> -</div> -<div style="margin-left: 40px;"><br> -Rectangle commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glRects, -glRecti, glRectf, glRectd, glRectsv, glRectiv, glRectfv, glRectdv,<br> -<br> -</span></div> -</div> -<div style="margin-left: 40px;">Lighting commands:<br> -</div> -<div style="margin-left: 80px;"><span style="font-weight: bold;">glMaterialf, -glMateriali, glMaterialfv, glMaterialiv<br> -</span><br> -</div> -<div style="margin-left: 40px;"> Evaluator commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glEvalCoord1d, -glEvalCoord1f, glEvalCoord1dv, glEvalCoord1fv, </span><span - style="font-weight: bold;">glEvalCoord2d, glEvalCoord2f, -glEvalCoord2dv, glEvalCoord2fv,<br> -</span><span style="font-weight: bold;">glEvalPoint1, glEvalPoint2</span><br> -<br> -</div> -</div> -<h1>3. Coordinate Transformation</h1> -<h2>3.1 Vertex Transformation</h2> -Vertex coordinates are transformed by the current modelview and -projection matrices then mapped to window coordinates as specified by -the viewport. The following coordinate transformation commands are -supported by the subset<br> -<br> -<div style="margin-left: 40px; font-weight: bold;">glMatrixMode<span - style="font-weight: normal;">(GLenum <span style="font-style: italic;">mode</span>)</span><br> -glLoadIdentity<span style="font-weight: normal;">(void)</span><br> -glPushMatrix<span style="font-weight: normal;">(void)</span><br> -glPopMatrix<span style="font-weight: normal;">(void)</span><br> -glLoadMatrixf<span style="font-weight: normal;">(const GLfloat *<span - style="font-style: italic;">m</span>)</span><br> -glMultMatrixf<span style="font-weight: normal;">(const GLfloat *<span - style="font-style: italic;">m</span>)</span><br> -glRotatef<span style="font-weight: normal;">(GLfloat <span - style="font-style: italic;">angle</span>, GLfloat <span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>, GLfloat <span - style="font-style: italic;">z</span>)</span><br> -glTranslatef<span style="font-weight: normal;">(GLfloat <span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>, GLfloat <span - style="font-style: italic;">z</span>)</span><br> -glScalef<span style="font-weight: normal;">(GLfloat <span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>, GLfloat <span - style="font-style: italic;">z</span>)<br> -<span style="font-weight: bold;">glFrustum(</span>GLdouble <span - style="font-style: italic;">left,</span> GLdouble <span - style="font-style: italic;">right,</span> GLdouble <span - style="font-style: italic;">bottom,</span> GLdouble <span - style="font-style: italic;">top,</span> GLdouble <span - style="font-style: italic;">near,</span> GLdouble <span - style="font-style: italic;">far</span>)</span><br> -<span style="font-weight: normal;"><span style="font-weight: bold;">glOrtho(</span>GLdouble<span - style="font-style: italic;"> left,</span> GLdouble <span - style="font-style: italic;">right,</span> GLdouble <span - style="font-style: italic;">bottom,</span> GLdouble <span - style="font-style: italic;">top,</span> GLdouble <span - style="font-style: italic;">near,</span> GLdouble <span - style="font-style: italic;">far</span>)</span><br> -glViewport<span style="font-weight: normal;">(GLint <span - style="font-style: italic;">x</span>, GLint <span - style="font-style: italic;">y</span>, GLsize <span - style="font-style: italic;">width,</span> GLsizei <span - style="font-style: italic;">height</span>)</span><br> -</div> -<br> -The <span style="font-weight: bold;">glMatrixMode</span> command -specifies the <span style="font-style: italic;">current matrix.</span> - The mode parameter may be GL_MODELVIEW or GL_PROJECTION to specify -the modelview matrix or projection matrix. Subsequent matrix -commands will effect the current matrix. Also associated with the -modelview and projection matrices are a modelview matrix stack and -projection matrix stack.<br> -<br> -The <span style="font-weight: bold;">glLoadIdentity</span> command -replaces the current matrix with the identity matrix. The matrix -elements are specified in column-major order.<br> -<br> -The <span style="font-weight: bold;">glPushMatrix</span> command pushes -a copy of the current matrix onto either the modelview matrix stack or -the projection matrix stack. The <span style="font-weight: bold;">glPopMatrix</span> -command replaces the current matrix with a copy of the top matrix off -the modelview matrix stack or projection matrix stack, the pops the -stack. Matrix stacks are useful for traversing and rendering -hierarchical models.<br> -<br> -The <span style="font-weight: bold;">glMultMatrixf</span> command -post-multiplies the current matrix by the specified matrix. The -matrix elements are specified in column-major order.<br> -<br> -The <span style="font-weight: bold;">glRotatef</span> command -post-multiplies the current matrix by a rotation matrix defined by the -angle and rotation axis defined by x, y and z.<br> -<br> -The <span style="font-weight: bold;">glTranslatef</span> command -post-multiplies the current matrix by a translation matrix defined by -the <span style="font-style: italic;">x</span>, <span - style="font-style: italic;">y</span> and <span - style="font-style: italic;">z</span> translation parameters.<br> -<span style="font-weight: bold;"></span><br> -The <span style="font-weight: bold;">glScalef</span> command -post-multiplies the current matrix by a scaling matrix defined by the <span - style="font-style: italic;">x</span>, <span - style="font-style: italic;">y</span> and <span - style="font-style: italic;">z</span> scale factors.<br> -<span style="font-weight: bold;"></span><br> -The <span style="font-weight: bold;">glFrustum</span> command -post-multiplies the current matrix by a perspective projection matrix. - The <span style="font-style: italic;">near</span> and <span - style="font-style: italic;">far</span> values specify the position of -the hither and yon Z-axis clipping planes. The <span - style="font-style: italic;">left, right, bottom</span> and <span - style="font-style: italic;">top</span> parameters are the X and Y -extents at the near clipping plane. <span - style="font-weight: bold;">glFrustum</span> is normally used to modify -the projection matrix.<br> -<br> -The <span style="font-weight: bold;">glOrtho</span> command -post-multiplies the current matrix by an orthographic projection matrix. - The <span style="font-style: italic;">near</span> and <span - style="font-style: italic;">far</span> values specify the position of -the hither and yon Z-axis clipping planes. The <span - style="font-style: italic;">left, right, bottom</span> and <span - style="font-style: italic;">top</span> parameters specify the X and -Y-axis clipping planes. <span style="font-weight: bold;">glOrtho</span> -is normally used to modify the projection matrix.<br> -<br> -The <span style="font-weight: bold;">glViewport</span> command -specifies the mapping of coordinates from normalized device coordinates -to window coordinates. The <span style="font-style: italic;">x</span> -and <span style="font-style: italic;">y</span> parameters specify the -viewport's lower-left corner in the window and the <span - style="font-style: italic;">width</span> and <span - style="font-style: italic;">height</span> parameters specify the size -of the viewport. <span style="font-weight: bold;">glViewport</span> -does not effect the current matrix.<br> -<br> -A coordinate transformed to window coordinates is hereafter known as (x<sub>w</sub>, -y<sub>w</sub>, z<sub>w</sub>).<br> -<br> -<h2>3.2 Clipping</h2> -View-volume clipping automatically discards or trims primitives which -lie completely or partially outside of the view volume specified by <span - style="font-weight: bold;">glFrustum</span> and <span - style="font-weight: bold;">glOrtho</span>. Note that the <span - style="font-weight: bold;">glViewport</span> command does not define a -clipping region.<br> -<br> -Clipping occurs in <span style="font-style: italic;">clip coordinate -space - </span>the coordinates produced after applying the projection -matrix.<br> -<br> -<h2>3.3 Current Raster Position</h2> -The current raster position specifies the location for drawing images -with <span style="font-weight: bold;">glBitmap.</span> The current -raster position is set with the commands:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glRasterPos2f</span>(GLfloat<span - style="font-style: italic;">x</span>, GLfloat <span - style="font-style: italic;">y</span>)<br> -void <span style="font-weight: bold;">glRasterPos2fv</span>(const -GLfloat *<span style="font-style: italic;">v</span>)<br> -void <span style="font-weight: bold;">glRasterPos2i</span>(GLint <span - style="font-style: italic;">x</span>, GLint <span - style="font-style: italic;">y</span>)<br> -void <span style="font-weight: bold;">glRasterPos2iv</span>(const -GLint *<span style="font-style: italic;">v</span>)<br> -</div> -<br> -<span style="font-weight: bold;">glRasterPos</span> specifies a -4-component coordinate (x, y, 0, 1). The coordinate is processed -like a vertex; it is transformed by the modelview matrix, the projection -matrix and mapped to the viewport. The resulting window coordinate -is stored as the current raster position. The coordinate is -clipped-tested against the frustum like a vertex. If the -coordinate is clipped, then the current raster position becomes invalid -and subsequent <span style="font-weight: bold;">glBitmap</span> commands -have no effect.<br> -<br> -<span style="font-weight: bold;">glRasterPos</span> also updates the -current raster color and current raster texture coordinates. The -current raster color is updated (copied) from the current color (as -specified by <span style="font-weight: bold;">glColor</span>). - The current raster texture coordinate is updated (copied) from the -current texture coordinate (as specified by <span - style="font-weight: bold;">glTexCoord</span>).<br> -<br> -<h2>3.4 Unsupported Commands</h2> -The following commands related to vertex transformation are not -supported by the subset:<br> -<br> -<div style="margin-left: 40px;">User-defined clip plane commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glClipPlane</span><br> -</div> -<span style="font-weight: bold;"></span></div> -<br> -<div style="margin-left: 40px;">Lighting and material commands:</div> -<div style="margin-left: 80px;"><span style="font-weight: bold;">glLightModeli, -glLightModelf, </span><span style="font-weight: bold;">glLightModeliv, -glLightModelfv,</span><span style="font-weight: bold;"> glLightf, -glLighti, glLightfv, glLightiv, glColorMaterial</span><br> -</div> -<br> -<div style="margin-left: 40px;">Automatic texture coordinate generation -commands:<br> -</div> -<div style="margin-left: 40px;"> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glTexGend, -glTexGenf, glTexGeni, </span><span style="font-weight: bold;">glTexGendv, -glTexGenfv, glTexGeniv, </span><br> -<br style="font-weight: bold;"> -</div> -Double-valued commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glLoadMatrixd, -glMultMatrixd, glRotated, glTranslated, glScaled</span><br - style="font-weight: bold;"> -</div> -<br> -Depth Range command:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glDepthRange</span> -(the near value is always 0.0 and the far value is always 1.0)<br> -</div> -<br> -Extra RasterPos commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glRasterPos2d, -glRasterPos2s, glRasterPos3d, glRasterPos3f, glRasterPos3i, -glRasterPos3s, glRasterPos4d, glRasterPos4f, glRasterPos4i, -glRasterPos4s, glRasterPos2dv, glRasterPos2sv, glRasterPos3dv, -glRasterPos3fv, glRasterPos3iv, glRasterPos3sv, glRasterPos4dv, -glRasterPos4fv, glRasterPos4iv, glRasterPos4sv</span><br> -</div> -<br> -<br> -</div> -<h1>4. Rasterization</h1> -This section describes the commands and options for drawing points, -lines, triangles and bitmaps. <span style="font-style: italic;">Rasterization</span> -is the term for the process which produces fragments from the geometric -description of a primitive (a point, line, polygon or bitmap). For -example, given the two coordinates for the end-points of a line segment, -rasterization determines which pixels in the frame buffer are modified -to <span style="font-style: italic;">draw</span> the line. A -fragment is a tuple which consists of a window coordinate, colors and -texture coordinates. The fragments produced by rasterization are -subsequently processed by the per-fragment operations described later.<br> -<br> -<h2>4.1 Point Rasterization</h2> -Points are rendered with the command sequence <span - style="font-weight: bold;">glBegin</span>(GL_POINTS), <span - style="font-weight: bold;">glVertex</span>, ... <span - style="font-weight: bold;">glEnd</span>. The window coordinate (x<sub>w</sub>, -y<sub>w</sub>, z<sub>w</sub>) is truncated to rasterize the point. - The truncated coordinate with its associated color and texture -coordinate is sent as a single fragment to the per-fragment processing -stages.<br> -<br> -The <span style="font-weight: bold;">glPointSize</span> command is not -supported; only 1-pixel points are supported.<br> -<br> -Point smoothing (antialiasing) is also not supported.<br> -<br> -<h2>4.2 Line Rasterization</h2> -Lines are rendered with the command sequence <span - style="font-weight: bold;">glBegin</span>(<span - style="font-style: italic;">mode</span>), <span - style="font-weight: bold;">glVertex</span>, <span - style="font-weight: bold;">glVertex</span>, ... <span - style="font-weight: bold;">glEnd</span> where <span - style="font-style: italic;">mode</span> is one of GL_LINES, -GL_LINE_STRIP or GL_LINE_LOOP. Lines are rasterized as described -in the OpenGL specification. Note that OpenGL specifies the <span - style="font-style: italic;">half-open</span> convention for drawing -lines: the last fragment in a line segment is omitted so that endpoint -pixels shared by two line segments will only be drawn once instead of -twice.<br> -<br> -<h3>4.2.1 Line Width</h3> -The width of lines can be controlled by<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glLineWidth</span>(GLfloat<span - style="font-style: italic;">width</span>)<br> -</div> -<br> -where <span style="font-style: italic;">width</span> is the line width -in pixels. The width defaults to 1.0. Attempting to set the -width to a value less than or equal to zero will raise the error -GL_INVALID_VALUE.<br> -<br> -<h3>4.2.2 Line Stipple<br> -</h3> -Lines may be stippled (i.e. dashed) with the command<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glLineStipple</span>(GLint<span - style="font-style: italic;">factor</span>, GLushort <span - style="font-style: italic;">pattern</span>)<br> -</div> -<br> -<span style="font-style: italic;">pattern</span> describes an on/off -pattern for the fragments produced by rasterization and <span - style="font-style: italic;">factor</span> specifies how many subsequent -fragments are kept or culled for each pattern bit. Line stippling -can be enabled or disabled by the commands <span - style="font-weight: bold;">glEnable</span>(GL_LINE_STIPPLE) and <span - style="font-weight: bold;">glDisable</span>(GL_LINE_STIPPLE).<br> -<br> -<h3>4.2.3 Line Antialiasing</h3> -Lines may be antialiased. For antialiased lines, each fragment -produced by rasterization is assigned a <span - style="font-style: italic;">coverage value</span> which describes how -much of the fragment's area is considered to be <span - style="font-style: italic;">inside</span> the line. Later, the -alpha value of each fragment is multiplied by the coverage value. - By blending the fragments into the frame buffer, the edges of -lines appear smoothed.<br> -<br> -Line antialiasing can be enabled or disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_LINE_SMOOTH) and <span - style="font-weight: bold;">glDisable</span>(GL_LINE_SMOOTH).<br> -<br> -<h2>4.3 Polygon Rasterization</h2> -Polygons, quadrilaterals and triangles share the same polygon -rasterization options. <br> -<br> -Triangles are rendered by the command sequence <span - style="font-weight: bold;">glBegin</span><span - style="font-style: italic;"><span style="font-style: italic;">(mode</span></span>),<span - style="font-weight: bold;">glVertex</span>, <span - style="font-weight: bold;">glVertex</span>, ... <span - style="font-weight: bold;">glEnd</span> where <span - style="font-style: italic;">mode</span> may be one of GL_TRIANGLES, -GL_TRIANGLE_STRIP or GL_TRIANGLE_FAN.<span style="font-weight: bold;"></span> - For GL_TRIANGLES mode, the number of vertices should be a multiple -of three - extra vertices will be ignored. For GL_TRIANGLE_STRIP -and GL_TRIANGLE_FAN, at least three vertices should be specified. - If less than three are specified, nothing is drawn. <br> -<br> -Quadrilaterals are <span style="font-weight: bold;"></span>rendered by -the command sequence <span style="font-weight: bold;">glBegin</span>(<span - style="font-style: italic;"><span style="font-style: italic;">mode</span></span>),<span - style="font-weight: bold;">glVertex</span>, <span - style="font-weight: bold;">glVertex</span>, ... <span - style="font-weight: bold;">glEnd</span> where <span - style="font-style: italic;">mode</span> may be one of GL_QUADS or -GL_QUAD_STRIP.<span style="font-weight: bold;"></span> For -GL_QUADS, the number of vertices should be a multiple of four - extra -vertices will be ignored. For GL_QUAD_STRIP, the number of -vertices should be even and at least four. Extra vertices (one) -will be ignored.<br> -<br> -Convex polygons are <span style="font-weight: bold;"></span>rendered -by the command sequence <span style="font-weight: bold;">glBegin</span><span - style="font-style: italic;"><span style="font-style: italic;"></span></span>(GL_POLYGON),<span - style="font-weight: bold;">glVertex</span>, <span - style="font-weight: bold;">glVertex</span>, ... <span - style="font-weight: bold;">glEnd</span>.<span - style="font-style: italic;"></span><span style="font-weight: bold;"></span> - If less than three vertices are specified, nothing is drawn.<br> -<br> -<h3>4.3.1 Polygon Orientation</h3> -The <span style="font-style: italic;">winding order</span> of vertices -(clockwise or counter-clockwise) is significant. It is used to -determine the <span style="font-style: italic;">front-facing</span> or <span - style="font-style: italic;">back-facing</span> orientation of polygons. - By default, a front-facing polygon's vertices are in -counter-clockwise order (in window coordinates). Figures 2.4 and -2.5 of the OpenGL 1.2.1 specification illustrate the winding order for -front-facing triangles and quadrilaterals, respectively.<br> -<br> -The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glFrontFace</span>(GLenum<span - style="font-style: italic;"> mode</span>)<br> -</div> -<br> -specifies whether clockwise or counter-clockwise winding indicates a -front-facing polygon. If <span style="font-style: italic;">mode</span> -is GL_CW then polygons with clockwise winding are front-facing. If <span - style="font-style: italic;">mode</span> is GL_CCW then polygons with -counter-clockwise winding are front-facing. The default value is -GL_CCW. If <span style="font-style: italic;">mode</span> is not -GL_CCW or GL_CW then the error GL_INVALID_ENUM will be raised.<span - style="font-style: italic;"></span><span style="font-style: italic;"></span><br> -<br> -<h3>4.3.2 Polygon Culling</h3> -Polygons may be culled (discarded) depending on whether they are -front-facing or back-facing. The command<br> -<br> -<div style="margin-left: 40px;">void<span style="font-weight: bold;"> -glCullFace</span>(GLenum <span style="font-style: italic;">mode</span>)<br> -</div> -<br> -specifies whether front-facing, back-facing or all polygons should be -culled. If <span style="font-style: italic;">mode</span> is -GL_FRONT then front-facing polygons will be culled. If <span - style="font-style: italic;">mode</span> is GL_BACK then back-facing -polygons will be culled. Otherwise, if <span style="font-style: italic;">mode</span> -is GL_FRONT_AND_BACK then all polygons will be culled. Any other -value for <span style="font-style: italic;">mode</span> will raise the -error GL_INVALID_ENUM.<br> -<br> -Polygon culling is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_CULL_FACE) and <span - style="font-weight: bold;">glDisable</span>(GL_CULL_FACE), -respectively.<br> -<br> -<h3>4.3.3 Polygon Antialiasing</h3> -Polygons may be antialiased in order to smooth their edges. - Polygon antialiasing is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_POLYGON_SMOOTH) and <span - style="font-weight: bold;">glDisable</span>(GL_POLYGON_SMOOTH).<br> -<br> -When polygon antialiasing is enabled each fragment produced by polygon, -triangle and quadrilateral rasterization will be given a <span - style="font-style: italic;">coverage</span> value which indicates how -much of the fragment is covered by the polygon. Fragments -completely inside the polygon have coverage 1.0. Fragments -completely outside the polygon have zero coverage (in theory). - Fragments which intersect the polygon's edge have a coverage value -in the range (0, 1).<br> -<br> -The fragment's alpha value is multiplied by the coverage value. - By enabling the appropriate blending mode, polygon edges will -appear smoothed.<br> -<br> -<h2>4.4 Shading</h2> -The command<br> -<br> -<div style="margin-left: 40px;"> void <span style="font-weight: bold;">glShadeModel</span>(GLenum<span - style="font-style: italic;">mode</span>)<br> -</div> -<br> -determines whether colors are interpolated between vertices during -rasterization. If <span style="font-style: italic;">mode</span> is -GL_FLAT then vertex colors are not interpolated. The color used -for drawing lines, triangles and quadrilaterals is that of the last -vertex used to specify each primitive. For polygons, the color of -the first vertex specifies the color for the entire polygon. If <span - style="font-style: italic;">mode</span> is GL_SMOOTH then vertex colors -are linearly interpolated to produce the fragment colors.<br> -<br> -<h2>4.5 Bitmap Rasterization</h2> -A bitmap is a monochromatic, binary image in which each image element -(or pixel) is represented by one bit. Fragments are only generated -for the bits (pixels) which are set. Bitmaps are commonly used to -draw text (glyphs) and markers.<br> -<br> -A bitmap is drawn with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glBitmap</span>(GLsizei<span - style="font-style: italic;">width</span>, GLsizei <span - style="font-style: italic;">height</span>, GLfloat <span - style="font-style: italic;">xOrig</span>, GLfloat <span - style="font-style: italic;">yOrig</span>, GLfloat <span - style="font-style: italic;">xMove</span>, GLfloat <span - style="font-style: italic;">yMove</span>, const GLubyte *<span - style="font-style: italic;">image</span>)<br> -</div> -<br> -<span style="font-style: italic;">width </span>and <span - style="font-style: italic;">height</span> specify the image size in -pixels. <span style="font-style: italic;">xOrig</span> and <span - style="font-style: italic;">yOrig</span> specify the bitmap origin. - <span style="font-style: italic;">xMove</span> and <span - style="font-style: italic;">yMove</span> are added to the current -raster position after the bitmap is rasterized. <span - style="font-style: italic;">image</span> is a pointer to the bitmap -data.<br> -<br> -If the current raster position is not valid, <span - style="font-weight: bold;">glBitmap</span> has no effect.<br> -<br> -<h3>4.5.1 Bitmap Unpacking</h3> -The first step in bitmap rendering is <span style="font-style: italic;">unpacking. - </span>Unpacking is the process of extracting image data from -client memory subject to byte swapping, non-default row strides, etc. - The unpacking parameters are specified with the command<br> -<br> -<div style="margin-left: 40px;">void<span style="font-weight: bold;"> -glPixelStorei</span>(GLenum pname, GLint value)<br> -</div> -<span style="font-style: italic;"></span><br> -The following unpacking parameters may be set:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 90%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">Parameter (<span - style="font-style: italic;">pname</span>)<br> - </td> - <td style="vertical-align: top;">Value (<span - style="font-style: italic;">value</span>)<br> - </td> - <td style="vertical-align: top;">Default<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_UNPACK_ROW_LENGTH<br> - </td> - <td style="vertical-align: top;">Width of the image in memory, in -pixels.<br> - </td> - <td style="vertical-align: top;">0<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_UNPACK_LSB_FIRST<br> - </td> - <td style="vertical-align: top;">GL_FALSE indicates that the most -significant bit is unpacked first from each byte. GL_TRUE -indicates that the least significant bit is unpacked first from each -byte. <br> - </td> - <td style="vertical-align: top;">GL_FALSE<br> - </td> - </tr> - </tbody> -</table> -<br> -<br> -The GL_UNPACK_ROW_LENGTH specifies the stride (in pixels) for advancing -from one row of the image to the next. If it's zero, the <span - style="font-style: italic;">width</span> parameter to <span - style="font-weight: bold;">glBitmap</span> specifies the width of the -image in memory.<br> -<br> -GL_UNPACK_LSB_FIRST determines whether the least significant or most -significant bit in each byte is unpacked first. Unpacking occurs -in left to right order (in image space).<br> -<br> -The value of bit (i, j) of the image (where i is the image row and j is -the image column) is found as follows:<br> -<br> -<div style="margin-left: 40px;">rowLength = (GL_UNPACK_ROW_LENGTH != 0) -? GL_UNPACK_ROW_LENGTH : <span style="font-style: italic;">width</span>;<br> -<br> -byte = <span style="font-style: italic;">image</span>[((rowLength + 7) -/ 8) * i + j / 8];<br> -<br> -if (GL_UNPACK_LSB_FIRST != 0)<br> - bitMask = 1 << (j % 8);<br> -else<br> - bitMask = 128 >> (j % 8);<br> -<br> -if (byte & bitMask)<br> - bit = 1;<br> -else<br> - bit = 0;<br> -<br> -</div> -<span style="font-style: italic;"><span style="font-style: italic;"></span></span> -<h3>4.5.2 Rasterization</h3> -If the current raster position is (x<sub>rp</sub>, y<sub>rp</sub>, z<sub>rp</sub>, -w<sub>rp</sub>), then the bitmap is rasterized according to the -following algorithm:<br> -<br> -for (j = 0; j < <span style="font-style: italic;">height</span>; -j++) {<br> - for (i = 0; i < <span style="font-style: italic;">width</span>; -i++) {<br> - if (bit(i,j)) {<br> - fragment.x = -floor(x<sub>rp</sub> - <span style="font-style: italic;">xOrig</span>) -+ i;<br> - fragment.y = -floor(y<sub>rp</sub> - <span style="font-style: italic;">yOrig</span>) -+ j;<br> - fragment.color -= GL_CURRENT_RASTER_COLOR;<br> - -fragment.texture = GL_CURRENT_RASTER_TEXTURE_COORDS;<br> - -ProcessFragment(fragment)<br> - }<br> - }<br> -}<br> -<br> -After the bitmap has been rendered the current raster position is -updated as follows:<br> -<br> -<div style="margin-left: 40px;">x<sub>rp</sub> = x<sub>rp</sub> + <span - style="font-style: italic;">xMove</span><br> -y<sub>rp</sub> = y<sub>rp</sub> + <span style="font-style: italic;">yMove</span><br> -</div> -<br> -<h3>4.5.3 Per-fragment Operations</h3> -XXX supported? See issue in appendix A.<br> -<br> -<h2>4.6 Unsupported Commands</h2> -The following commands related to rasterization are not supported by -the subset.<br> -<br> -<div style="margin-left: 40px;">Point commands:<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glPointSize</span><br> -</div> -<br> -Polygon commands:<br> -<div style="margin-left: 40px; font-weight: bold;">glPolygonStipple<br> -glPolygonOffset<br> -glPolygonMode<br> -<br> -</div> -</div> -<div style="margin-left: 40px;">Pixel storage commands:<br> -</div> -<div style="font-weight: bold; margin-left: 80px;">glPixelStoref<br> -</div> -<br> -<br> -<h1>5. Texture Mapping<br> -</h1> -There are four elements to texture mapping: texture coordinate -specification, texture image specification, texture sampling and texture -application.<br> -<br> -Texture mapping is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_TEXTURE_2D) and <span - style="font-weight: bold;">glDisable</span>(GL_TEXTURE_2D).<br> -<br> -<h2>5.1 Texture Image Specification</h2> -A texture image is specified with the command:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glTexImage2D</span>(GLenum<span - style="font-style: italic;"> target</span>, GLint <span - style="font-style: italic;">level</span>, GLint <span - style="font-style: italic;">internalFormat,</span> GLsizei <span - style="font-style: italic;">width,</span> GLsizei <span - style="font-style: italic;">height,</span> GLint <span - style="font-style: italic;">border,</span> GLenum <span - style="font-style: italic;">format,</span> GLenum <span - style="font-style: italic;">type,</span> const GLvoid *<span - style="font-style: italic;">pixels</span> )<br> -</div> -<br> -<span style="font-style: italic;">target</span> must be GL_TEXTURE_2D. - <span style="font-style: italic;">level </span>indicates the -mipmap level for mipmap textures. <span style="font-style: italic;">internalFormat</span> -is a hint to indicate the preferred internal storage format for the -texture. <span style="font-style: italic;">width</span> and <span - style="font-style: italic;">height </span>indicate the image size in -pixels (or texels). <span style="font-style: italic;">border </span>must -be zero. <span style="font-style: italic;">format</span> and <span - style="font-style: italic;">type</span> describe the pixel format and -data type for the incoming image. <span style="font-style: italic;">pixels</span> -points to the incoming texture image. These parameters are -described in more detail below.<br> -<br> -<h3>5.1.1 Texture Image Size and Mipmaps</h3> -<h3><span style="font-style: italic;"></span></h3> -Texture images must have dimensions (width and height) that are powers -of two. For example: 256 x 256, 32 x 1024, 1 x 8, etc. That is, it -must be the case that <span style="font-style: italic;">width </span>= -2<sup>n</sup> and <span style="font-style: italic;">height</span> = 2<sup>m</sup> -for some positive integers n and m.<br> -<br> -Mipmapping is a method of antialiasing or filtering textures to improve -their appearance. A mipmap is a set of images consisting of a base -image and a set of filtered, reduced-resolution images. If the -base image (<span style="font-style: italic;">level</span>=0) is of -width 2<sup>n</sup> and height 2<sup>m</sup> then the level 1 image must -be of width 2<sup>n-1</sup> and height 2<sup>m-1</sup>. Each mipmap -level is half the width and height of the previous level, or at least -one. The last mipmap level has a width and height of one.<br> -<br> -The following is an example of a mipmap's image levels:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 50%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">mipmap level<br> - </td> - <td style="vertical-align: top;">width<br> - </td> - <td style="vertical-align: top;">height<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">0<br> - </td> - <td style="vertical-align: top;">256<br> - </td> - <td style="vertical-align: top;">64<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">128<br> - </td> - <td style="vertical-align: top;">32<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">2<br> - </td> - <td style="vertical-align: top;">64<br> - </td> - <td style="vertical-align: top;">16<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">3<br> - </td> - <td style="vertical-align: top;">32<br> - </td> - <td style="vertical-align: top;">8<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">16<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">5<br> - </td> - <td style="vertical-align: top;">8<br> - </td> - <td style="vertical-align: top;">2<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">6<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">7<br> - </td> - <td style="vertical-align: top;">2<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">8<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - </tr> - </tbody> -</table> -<br> -If the <span style="font-style: italic;">width</span> or <span - style="font-style: italic;">height</span> parameters are not powers of -two, the error GL_INVALID_VALUE is raised. If the image levels in -a mipmap do not satisfy the restrictions listed above the texture is -considered to be <span style="font-style: italic;">inconsistent</span> -and the system will behave as if the texturing is disabled.<br> -<br> -<h3>5.1.2 Texture Image Formats and Unpacking</h3> -The <span style="font-weight: bold;">glTexImage2D</span> command's <span - style="font-style: italic;"><span style="font-weight: bold;"></span></span><span - style="font-style: italic;">format</span> and <span - style="font-style: italic;">type</span> parameters describe the format -of the incoming texture image. Accepted values for <span - style="font-style: italic;">format</span> are GL_INTENSITY, GL_RGB and -GL_RGBA. The <span style="font-style: italic;">type</span> -parameter must be GL_UNSIGNED_BYTE. Pixel component values are -thus in the range 0 through 255.<br> -<br> -If <span style="font-style: italic;">format</span> is GL_INTENSITY then -the image has one byte per pixel which specifies the pixel's red, green, -blue and alpha values.<span style="font-style: italic;"></span><br> -<br> -If <span style="font-style: italic;">format</span> is GL_RGB then the -image has three bytes per pixel which specify the pixel's red, green and -blue values (in that order). The alpha value defaults to 255.<br> -<br> -If <span style="font-style: italic;">format</span> is GL_RGBA then the -image has four bytes per pixel which specify the pixel's red, green, -blue and alpha values (in that order).<br> -<br> -The command<br> -<br> -<div style="margin-left: 40px;">void<span style="font-weight: bold;"> -glPixelStorei</span>(GLenum <span style="font-style: italic;">pname</span>, -GLint <span style="font-style: italic;">value</span>)<br> -</div> -<br> -controls the unpacking of texture image data from client memory. <span - style="font-style: italic;">pname</span> may be GL_UNPACK_ROW_LENGTH to -indicate the stride, in pixels, between subsequent rows of the image in -client memory. If GL_UNPACK_ROW_LENGTH is zero (the default) then -the <span style="font-style: italic;">width</span> parameter to <span - style="font-weight: bold;">glTexImage2D </span>determines the stride.<span - style="font-style: italic;"></span><br> -<br> -<h3>5.1.3 Internal Texture Format</h3> -<span style="font-weight: bold;">glTexImage2D<span - style="font-style: italic;"> </span></span>converts the incoming -texture image to one of the supported internal texture formats.<br> -<br> -The <span style="font-style: italic;">internalFormat</span> parameter -indicates the desired internal format for the texture and may be either -GL_INTENSITY8, GL_RGB5 or GL_RGBA8.<br> -<br> -If <span style="font-style: italic;">internalFormat</span> is -GL_INTENSITY8 then the texture has one byte per texel (texture element) -which indicates the texel's intensity (or brightness). The -intensity is obtained from the incoming image's red channel.<br> -<br> -If <span style="font-style: italic;">internalFormat</span> is GL_RGB5 -then the texture is stored with two bytes per texel: 5 bits per -red value, 5 bits per green value and 5 bits per blue value.<br> -<br> -If <span style="font-style: italic;">internalFormat </span>is -GL_RGBA8 then the texture is stored with four bytes per texel: 8 -bits for each of the red, green, blue and alpha values.<br> -<br> -The internal format is also significant to texture application (see -section 5.4).<br> -<br> -<h2>5.2 Texture Coordinates</h2> -Texture coordinates control the mapping from local polygon space to -texture image space. Texture coordinates are set for each vertex -with the <span style="font-weight: bold;">glTexCoord</span> commands. - During line and polygon rasterization the vertex's texture -coordinates are interpolated across the primitive to produce a texture -coordinate for each fragment. The fragment texture coordinates are -used to sample the current texture image.<br> -<br> -Texture coordinates are normally in the range [0, 1]. Values -outside that range are processed according to the <span - style="font-style: italic;">texture wrap mode</span>. The -texture wrap mode is set with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glTexParameteri</span>(GLenum<span - style="font-style: italic;"> target</span>, GLenum <span - style="font-style: italic;">pname</span>, GLint <span - style="font-style: italic;">value</span>)<br> -<br> -</div> -<span style="font-style: italic;">target</span> must be GL_TEXTURE_2D. - If <span style="font-style: italic;">pname</span> is -GL_TEXTURE_WRAP_S or GL_TEXTURE_WRAP_T then <span - style="font-style: italic;">value</span> must be either -GL_CLAMP_TO_EDGE or GL_REPEAT.<br> -<br> -For GL_CLAMP_TO_EDGE, texture coordinates are effectively clamped to -the interval [0, 1].<br> -<br> -For GL_REPEAT, the integer part of texture coordinates is ignored; only -the fractional part of the texture coordinates is used. This -allows texture images to repeated or tiled across an object.<br> -<br> -<h2>5.3 Texture Sampling</h2> -Texture sampling is the process of using texture coordinates to extract -a color from the texture image. Multiple, weighted samples may be -taken from the texture and combined during the filtering step.<br> -<br> -During texture coordinate interpolation a <span - style="font-style: italic;">level of detail</span> value (lambda) is -computed for each fragment. For a mipmapped texture, lambda -determines which level (or levels) of the mipmap will be sampled to -obtain the texture color.<br> -<br> -If lambda indicates that multiple texels map to a single screen pixel, -then the texture <span style="font-style: italic;">minification</span> -filter will be used. Otherwise, if lambda indicates that a single -texel maps to multiple screen pixels, then the texture <span - style="font-style: italic;">magnification</span> filter will be used.<br> -<span style="font-weight: bold;"></span><span - style="font-style: italic;"></span><br> -<h3>5.3.1 Texture Minification</h3> -The texture minification filter is set with the <span - style="font-weight: bold;">glTexParameteri </span><span - style="font-style: italic;"></span><span style="font-weight: bold;"></span><span - style="font-style: italic;"></span> command by setting <span - style="font-style: italic;">target</span> to GL_TEXTURE_2D, setting <span - style="font-style: italic;">pname</span> to GL_TEXTURE_MIN_FILTER and -setting <span style="font-style: italic;">value</span> to GL_NEAREST, -GL_LINEAR, GL_NEAREST_MIPMAP_NEAREST, -GL_NEAREST_MIPMAP_LINEAR, GL_LINEAR_MIPMAP_NEAREST or -GL_LINEAR_MIPMAP_LINEAR.<br> -<br> -GL_NEAREST samples the texel nearest the texture coordinate in the -level 0 texture image.<br> -<br> -GL_LINEAR samples the four texels around the texture coordinate in the -level 0 texture image. The four texels are linearly weighted to -compute the final texel value.<br> -<br> -GL_NEAREST_MIPMAP_NEAREST samples the texel nearest the texture -coordinate in the level N texture image. N is the level of detail -and is computed by the partial derivatives of the texture coordinates -with respect to the window coordinates.<br> -<br> -GL_NEAREST_MIPMAP_LINEAR samples two texels nearest the texture -coordinates in the level N and N+1 texture images. The two texels -are linearly weighted to compute the final texel value. N is the -level of detail and is computed by the partial derivatives of the -texture coordinates with respect to the window coordinates.<br> -<br> -GL_LINEAR_MIPMAP_NEAREST samples four texels around the texture -coordinate in the level N texture image. The four texels are -linearly weighted to compute the final texel value. N is the level -of detail and is computed by the partial derivatives of the texture -coordinates with respect to the window coordinates.<br> -<br> -GL_LINEAR_MIPMAP_LINEAR samples four texels around the texture -coordinate in the level N texture image and four texels around the -texture coordinate in the level N+1 texture image. The eight -texels are linearly weighted to compute the final texel value. N -is the level of detail and is computed by the partial derivatives of the -texture coordinates with respect to the window coordinates.<br> -<br> -Filter modes other than GL_LINEAR and GL_NEAREST requires that the -texture have a complete set of mipmaps. If the mipmap is -incomplete, it is as if texturing is disabled.<br> - <br> -<h3>5.3.2 Texture Magnification</h3> -The texture magnification filter is set with the <span - style="font-weight: bold;">glTexParameteri </span><span - style="font-style: italic;"></span><span style="font-weight: bold;"></span>command -by setting <span style="font-style: italic;">target</span> to -GL_TEXTURE_2D, setting <span style="font-style: italic;">pname</span> to -GL_TEXTURE_MAG_FILTER and setting <span style="font-style: italic;">value</span> -to GL_NEAREST or GL_LINEAR.<br> -<br> -GL_NEAREST samples the texel nearest the texture coordinate in the -level 0 texture image.<br> -<br> -GL_LINEAR samples the four texels around the texture coordinate in the -level 0 texture image. The four texels are linearly weighted to -compute the final texel value.<br> -<br> -<h2>5.4 Texture Application</h2> -The sampled texture value is combined with the incoming fragment color -to produce a new fragment color. The fragment and texture colors -are combined according to the texture environment mode and the current -texture's base internal format. The texture environment mode is -set with the command<br> -<br> -<div style="margin-left: 40px;">void<span style="font-weight: bold;"> -glTexEnvi</span>(GLenum <span style="font-style: italic;">target</span>, -GLenum <span style="font-style: italic;">pname</span>, GLint <span - style="font-style: italic;">value</span>)<br> -</div> -<br> -<span style="font-style: italic;">target</span> must be GL_TEXTURE_ENV. - If <span style="font-style: italic;">pname</span> is -GL_TEXTURE_ENV_MODE then <span style="font-style: italic;">value</span> -must be one of GL_REPLACE, GL_MODULATE, GL_DECAL, or GL_BLEND.<br> -<br> -There is also a <span style="font-style: italic;">texture environment -color</span> that can factor into texture application. The texture -environment color can be set with the command<br> -<br> -<div style="margin-left: 40px;">void<span style="font-weight: bold;"> -glTexEnvfv</span>(GLenum <span style="font-style: italic;">target</span>, -GLenum <span style="font-style: italic;">pname</span>, const GLfloat *<span - style="font-style: italic;">value</span>)<br> -</div> -<span style="font-style: italic;"></span><br> -<span style="font-style: italic;">target</span> must be GL_TEXTURE_ENV. - If <span style="font-style: italic;">pname</span> is -GL_TEXTURE_ENV_COLOR then <span style="font-style: italic;">value </span>must -point to an array of four values which specify the red, green, blue, -and alpha values of the texture environment color. The values are -clamped to the range [0, 1]. The default color is (0, 0, 0, 0).<br> -<span style="font-style: italic;"></span><br> -The following table describes the arithmetic used for each combination -of environment mode and base internal format. (Rf, Gf, Bf, Af) is -the incoming fragment color. (Rt, Gt, Bt, At) is the sampled -texture color. Lt is the sampled texture luminance. <span - style="font-style: italic;"></span>'It' is the sampled texture -intensity. (Rc, Gc, Bc, Ac) is the texture environment color. - (Rv, Gv, Bv, Av) is the resulting value.<br> -<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 90%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">Base Internal Format<br> - </td> - <td style="vertical-align: top;">GL_REPLACE<br> - </td> - <td style="vertical-align: top;">GL_MODULATE<br> - </td> - <td style="vertical-align: top;">GL_DECAL<br> - </td> - <td style="vertical-align: top;">GL_BLEND<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INTENSITY<br> - </td> - <td style="vertical-align: top;">Rv = It<br> -Gv = It<br> -Bv = It<br> -Bf = It<br> - </td> - <td style="vertical-align: top;">Rv = Rf * It<br> -Gv = Gf * It<br> -Bv = Bf * It<br> -Av = Af * It</td> - <td style="vertical-align: top;">undefined<br> - </td> - <td style="vertical-align: top;">Rv = Rf*(1-It) + Rc*It<br> -Gv = Gf*(1-It) + Gc*It<br> -Bv = Bf*(1-It) + Bc*It<br> -Av = Af*(1-It) + Ac*It</td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RGB<br> - </td> - <td style="vertical-align: top;">Rv = Rt<br> -Gv = Gt<br> -Bv = Bt<br> -Av = Af<br> - </td> - <td style="vertical-align: top;">Rv = Rf * Rt<br> -Gv = Gf * Gt<br> -Bv = Bf * Bt<br> -Av = Af<br> - </td> - <td style="vertical-align: top;">Rv = Rt<br> -Gv = Gt<br> -Bv = Bt<br> -Av = Af</td> - <td style="vertical-align: top;">Rv = Rf*(1-Rt) + Rc*Rt<br> -Gv = Gf*(1-Gt) + Gc*Gt<br> -Bv = Bf*(1-Bt) + Bc*Bt<br> -Av = Af</td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RGBA<br> - </td> - <td style="vertical-align: top;">Rv = Rt<br> -Gv = Gt<br> -Bv = Bt<br> -Av = At<br> - </td> - <td style="vertical-align: top;">Rv = Rf * Rt<br> -Gv = Gf * Gt<br> -Bv = Bf * Bt<br> -Av = Af * At</td> - <td style="vertical-align: top;">Rv = Rf*(1-At) + Rt*At<br> -Gv = Gf*(1-At) + Gt*At<br> -Bv = Bf*(1-At) + Bt*At<br> -Av = Af<br> - </td> - <td style="vertical-align: top;">Rv = Rf*(1-Rt) + Rc*Rt<br> -Gv = Gf*(1-Gt) + Gc*Gt<br> -Bv = Bf*(1-Bt) + Bc*Bt<br> -Av = Af*At</td> - </tr> - </tbody> -</table> -<br> -<br> -<br> -<h2>5.5 Texture Objects</h2> -Texture objects encapsulate a set of texture images (mipmap) and -related state into a named object. This facilitates use of -multiple textures in an application. Texture objects are named -with GLuints (unsigned integers). There is a default texture -object with the name/identifier zero which can never be deleted.<br> -<br> -<h3>5.5.1 Creating Texture Objects</h3> -A texture object is created by binding a new GLuint identifier to the -GL_TEXTURE_2D target with the command:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glBindTexture</span>(GLenum<span - style="font-style: italic;"> target</span>, GLuint <span - style="font-style: italic;">textureID</span>)<br> -</div> -<br> -<span style="font-style: italic;">target</span> must be GL_TEXTURE_2D. - <span style="font-style: italic;">textureID</span> may be any -unsigned integer. If <span style="font-style: italic;">textureID</span> -does not name an existing texture object, a new texture object with that -ID will be created, initialized to the default state. Whether the -ID is new or existed previously, that named texture object is bound as -the <span style="font-style: italic;">current texture object</span>. - Subsequent <span style="font-weight: bold;">glTexParameter </span>and<span - style="font-weight: bold;">glTexImage2D<span - style="font-style: italic;"> </span></span>calls will effect the -current texture object.<br> -<span style="font-style: italic;"></span><span - style="font-weight: bold;"><span style="font-style: italic;"> </span></span><br> -<h3>5.5.2 Deleting Texture Objects</h3> -One or more texture objects may be deleted with the command:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glDeleteTextures</span>(GLsizei<span - style="font-style: italic;">n</span>, const GLuint *<span - style="font-style: italic;">textureIDs</span>)<br> -</div> -<br> -<span style="font-style: italic;">textureIDs</span> is an array of <span - style="font-style: italic;">n</span> texture IDs. The named -texture objects will be deleted. If the current texture object is -deleted the default texture object (number 0) will be bound as the -current texture object.<br> -<br> -<h3>5.5.3 Allocating Texture Object Identifiers</h3> -A list of new, unused texture IDs can be obtained by calling the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glGenTextures</span>(GLsizei<span - style="font-style: italic;"> n</span>, GLuint *<span - style="font-style: italic;">textureIDs</span>)<br> -</div> -<br> -An array of <span style="font-style: italic;">n</span> unused texture -IDs will be returned in the <span style="font-style: italic;">textureIDs</span> -array.<br> -<br> -<br> -<h1>6. Per-fragment Operations</h1> -The fragments produced by rasterization are subjected to a number of -operations which either modify the fragment or test the fragment -(discarding the fragment if the test fails.) This chapter -describes the per-fragment operations. They are presented in the -order in which they're performed. If a fragment fails a test it is -discarded and not subjected to subsequent tests or modifications.<br> -<br> -<h2>6.1 Scissor Test</h2> -The scissor test limits rendering to a 2-D rectangular region of the -framebuffer. The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glScissor</span>(GLint<span - style="font-style: italic;">x</span>, GLint <span - style="font-style: italic;">y</span>, GLsizei <span - style="font-style: italic;">width</span>, GLsizei<span - style="font-style: italic;"> height</span>)<br> -</div> -<br> -defines a clipping region with the lower-left corner at (<span - style="font-style: italic;">x, y</span>) and the given <span - style="font-style: italic;">width</span> and <span - style="font-style: italic;">height</span>. The scissor test is -enabled and disabled with the command <span style="font-weight: bold;">glEnable</span>(GL_SCISSOR_TEST) -and <span style="font-weight: bold;">glDisable</span>(GL_SCISSOR_TEST).<br> -<br> -If the incoming fragment's position is (x<sub>f</sub>, y<sub>f</sub>) -then the fragment will pass the test if <span - style="font-style: italic;">x</span> <= x<sub>f</sub> < <span - style="font-style: italic;">x</span> + <span - style="font-style: italic;">width</span> and <span - style="font-style: italic;">y</span> <= y<sub>f</sub> < <span - style="font-style: italic;">y</span> + <span - style="font-style: italic;">height. </span>Otherwise, the -fragment is discarded.<br> -<br> -If <span style="font-style: italic;">width</span> or <span - style="font-style: italic;">height</span> is less than zero the error -GL_INVALID_VALUE is raised. The default scissor rectangle bounds -are (0, 0, w, h) where w is the initial window width and h is the -initial window height. The scissor test is disabled by default.<br> -<br> -<h2>6.2 Alpha Test</h2> -The alpha test compares the fragment's alpha value against a reference -value and discards the fragment if the comparison fails. The test -is specified by the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glAlphaFunc</span>(GLenum<span - style="font-style: italic;">mode</span>, GLclampf <span - style="font-style: italic;">reference</span>)<br> -</div> -<br> -<span style="font-style: italic;">mode</span> specifies an inequality -and <span style="font-style: italic;">reference</span> specifies a value -to compare against. The following table lists all possible -modes <span style="font-style: italic;"></span>and the -corresponding test:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 50%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">Comparison mode<br> - </td> - <td style="vertical-align: top;">The test passes if<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LESS<br> - </td> - <td style="vertical-align: top;">alpha < <span - style="font-style: italic;">reference</span><br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LEQUAL<br> - </td> - <td style="vertical-align: top;">alpha <= <span - style="font-style: italic;">reference</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_GREATER<br> - </td> - <td style="vertical-align: top;">alpha > <span - style="font-style: italic;">reference</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_GEQUAL<br> - </td> - <td style="vertical-align: top;">alpha >= <span - style="font-style: italic;">reference</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_EQUAL<br> - </td> - <td style="vertical-align: top;">alpha == <span - style="font-style: italic;">reference</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NOTEQUAL<br> - </td> - <td style="vertical-align: top;">alpha != <span - style="font-style: italic;">reference</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NEVER<br> - </td> - <td style="vertical-align: top;">never pass<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALWAYS<br> - </td> - <td style="vertical-align: top;">always passes<br> - </td> - </tr> - </tbody> -</table> -<br> -The <span style="font-style: italic;">reference</span> parameter is -clamped to the range [0, 1].<br> -<br> -The alpha test is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_ALPHA_TEST) and <span - style="font-weight: bold;">glDisable</span>(GL_ALPHA_TEST).<br> -<br> -The default mode is GL_ALWAYS and the default reference value is 0.<br> -<br> -<h2>6.3 Stencil Test</h2> -The stencil buffer stores an N-bit integer value for each pixel in the -frame buffer. The stencil test compares the stencil buffer value -at the fragment's position to a reference value and possibly discards -the fragment based on the outcome. Furthermore, the stencil buffer -value may be updated or modified depending on the outcome. If -there is no stencil buffer the stencil test is bypassed.<br> -<br> -Stenciling is controlled by the commands<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glStencilFunc</span>(GLenum<span - style="font-style: italic;">func</span>, GLint <span - style="font-style: italic;">ref</span>, GLuint <span - style="font-style: italic;">mask</span>)<br> -void <span style="font-weight: bold;">glStencilOp</span>(GLenum <span - style="font-style: italic;">stencilFail</span>, GLenum <span - style="font-style: italic;">depthTestFail</span>, GLenum <span - style="font-style: italic;">depthTestPass</span>)<br> -</div> -<br> -The <span style="font-weight: bold;">glStencilFunc<span - style="font-style: italic;"> </span></span>command controls the -stencil test while <span style="font-weight: bold;">glStencilOp</span> -command controls the how the stencil buffer is updated/modified after -the test.<br> -<br> -<span style="font-style: italic;">ref</span> is clamped to the range [0, -2<sup>N</sup>-1] where N is the number of bits per stencil value in the -stencil buffer.<span style="font-style: italic;"></span><br> -<br> -The following table lists all possible values for the <span - style="font-style: italic;">func</span> parameter and when the stencil -test will pass. Both the stencil buffer value and the stencil -reference value are bit-wise ANDed with the <span - style="font-style: italic;">mask</span> parameter before the test.<br> -<br> -<span style="font-style: italic;"></span><span - style="font-style: italic;"></span><span style="font-style: italic;"></span> -<table - style="text-align: left; margin-left: auto; margin-right: auto; width: 70%;" - border="1" cellspacing="2" cellpadding="2"> - <tbody> - <tr> - <td style="vertical-align: top;">Stencil <span - style="font-style: italic;">func</span> value<br> - </td> - <td style="vertical-align: top;">Stencil test passes if<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LESS<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span>&<span - style="font-style: italic;">mask)</span> < (stencil buffer value -& <span style="font-style: italic;">mask)</span><br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LEQUAL<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span> -& <span style="font-style: italic;">mask) </span><= (stencil -buffer value & <span style="font-style: italic;">mask)</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_GREATER<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span> -& <span style="font-style: italic;">mask) </span>> (stencil -buffer value & <span style="font-style: italic;">mask)</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_GEQUAL<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span> -& <span style="font-style: italic;">mask) </span>>= (stencil -buffer value & <span style="font-style: italic;">mask)</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_EQUAL<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span> -& <span style="font-style: italic;">mask) </span>== (stencil -buffer value & <span style="font-style: italic;">mask)</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NOTEQUAL<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">(ref</span> -& <span style="font-style: italic;">mask) </span>!= (stencil -buffer value & <span style="font-style: italic;">mask)</span></td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NEVER<br> - </td> - <td style="vertical-align: top;">never passes<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALWAYS<br> - </td> - <td style="vertical-align: top;">always passes<br> - </td> - </tr> - </tbody> -</table> -<br> -<span style="font-style: italic;"></span><br> -If the stencil test passes, the fragment is passed to the next -per-fragment operation. Otherwise, if the stencil test fails, the -value in the stencil buffer is updated according to the value of the <span - style="font-style: italic;">stencilFail</span> parameter to <span - style="font-weight: bold;">glStencilOp</span>.<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 70%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;"><span style="font-style: italic;">stencilFail</span> -value<br> - </td> - <td style="vertical-align: top;">New stencil buffer value<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_KEEP<br> - </td> - <td style="vertical-align: top;">originalValue<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ZERO<br> - </td> - <td style="vertical-align: top;">0<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INVERT<br> - </td> - <td style="vertical-align: top;">BitWiseInvert(originalValue) -i.e. ~originalValue<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_REPLACE<br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">ref</span><br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INCR<br> - </td> - <td style="vertical-align: top;">originalValue + 1, clamped to -[0, 2<sup>N</sup>-1]</td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DECR<br> - </td> - <td style="vertical-align: top;">originalValue - 1, clamped to -[0, 2<sup>N</sup>-1]</td> - </tr> - </tbody> -</table> -<span style="font-style: italic;"></span><span - style="font-style: italic;"></span><br> -<br> -The <span style="font-style: italic;">depthTestFail</span> and <span - style="font-style: italic;">depthTestPass</span> parameters to <span - style="font-weight: bold;">glStencilOp</span> are ignored. Values -for <span style="font-style: italic;">func</span> and <span - style="font-style: italic;">stencilFail</span> other than those listed -in the table will cause the error GL_INVALID_ENUM to be raised.<br> -<br> -The stencil test is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_STENCIL_TEST) and <span - style="font-weight: bold;">glDisable</span>(GL_STENCIL_TEST).<br> -<br> -The default stencil function is GL_ALWAYS. The default stencil -reference value is 0. The default stencil mask is ~0. The -default stencil fail operation is GL_KEEP.<br> -<br> -Values written into the stencil buffer are masked with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glStencilMask</span>(GLuint<span - style="font-style: italic;">mask</span>)<br> -</div> -<br> -Only the bits which are set in <span style="font-style: italic;">mask</span> -will be modified in the stencil buffer when written to. If each -stencil buffer value has N bits, only the least significant N bits of <span - style="font-style: italic;">mask</span> are relevant. The default -stencil mask is ~0.<br> -<br> -<h2>6.4 Blending and Logicop</h2> -Blending or a logic operation combines the incoming fragment color with -the destination frame buffer color according to a blending equation or -bit-wise Boolean logical operation.<br> -<br> -Blending is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_BLEND) and <span - style="font-weight: bold;">glDisable</span>(GL_BLEND).<br> -<br> -The logic operation is enabled and disabled with the commands <span - style="font-weight: bold;">glEnable</span>(GL_LOGIC_OP) and <span - style="font-weight: bold;">glDisable</span>(GL_LOGIC_OP).<br> -<br> -If both blending and the logic operation are enabled, the logic -operation has higher priority; blending is bypassed.<br> -<br> -<h3>6.4.1 Logic Op</h3> -The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glLogicop</span>(GLenum<span - style="font-style: italic;">mode</span>)<br> -<br> -</div> -Specifies the Boolean logic operation for combining the incoming -fragment color with the destination frame buffer color. Both the -incoming fragment color and destination frame buffer colors are -interpreted as four-tuples of unsigned integer color components in the -range [0, 2<sup>N</sup>-1] where N is the number of bits per color -channel. N may not be the same for all color channels.<br> -<br> -The following table lists all values for <span - style="font-style: italic;">mode</span> and the boolean arithmetic used -to combine the incoming fragment color value (src)<span - style="font-style: italic;"></span><span style="font-style: italic;"></span><span - style="font-style: italic;"></span><span style="font-style: italic;"></span><span - style="font-style: italic;"></span> with the destination framebuffer -color value (dst). Standard ANSI C operators used.<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 50%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">LogicOp <span - style="font-style: italic;">mode</span><br> - </td> - <td style="vertical-align: top;">Resulting channel value<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CLEAR<br> - </td> - <td style="vertical-align: top;">0<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SET<br> - </td> - <td style="vertical-align: top;">~0<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_COPY<br> - </td> - <td style="vertical-align: top;">src<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_COPY_INVERTED<br> - </td> - <td style="vertical-align: top;">~s<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NOOP<br> - </td> - <td style="vertical-align: top;">dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INVERT<br> - </td> - <td style="vertical-align: top;">~dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_AND<br> - </td> - <td style="vertical-align: top;">src & dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NAND<br> - </td> - <td style="vertical-align: top;">~(src & dst)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_AND_REVERSE<br> - </td> - <td style="vertical-align: top;">src & ~dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_AND_INVERTED<br> - </td> - <td style="vertical-align: top;">~src & dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_OR<br> - </td> - <td style="vertical-align: top;">src | dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NOR<br> - </td> - <td style="vertical-align: top;">~(src | dst)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_OR_REVERSE<br> - </td> - <td style="vertical-align: top;">src | ~dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_OR_INVERTED<br> - </td> - <td style="vertical-align: top;">~src | dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_XOR<br> - </td> - <td style="vertical-align: top;">src ^ dst<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_EQUIV<br> - </td> - <td style="vertical-align: top;">~(src ^ dst)<br> - </td> - </tr> - </tbody> -</table> -<br> -The fragment's color is replaced by the result of the logic operation.<br> -<br> -Specifying any value for <span style="font-style: italic;">mode</span> -other than those listed in the above table will cause the error -GL_INVALID_ENUM to be raised.<br> -<br> -The default value for <span style="font-style: italic;">mode</span> is -GL_COPY. The logic operation is disabled by default.<br> -<br> -<h3>6.4.2 Blending</h3> -The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glBlendFunc</span>(GLenum<span - style="font-style: italic;">srcTerm</span>, GLenum <span - style="font-style: italic;">dstTerm</span>)<br> -</div> -<br> -specifies the terms of the blending equation. If Cf = (Rf, Gf, -Bf, Af) is the incoming fragment color and Cb = (Rb, Gb, Bb, Ab) is the -frame buffer color, then the resulting color Cv = (Rv, Gv, Bv, Av) is -computed by:<br> -<br> -<div style="margin-left: 40px;">Cv = Cf * <span - style="font-style: italic;">srcTerm</span> + Cb * <span - style="font-style: italic;">dstTerm</span><br> -<span style="font-style: italic;"></span></div> -<span style="font-style: italic;"> </span><br> -All possible values for <span style="font-style: italic;">srcTerm</span> -and the corresponding arithmetic term are listed in the following table:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 70%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;"><span style="font-style: italic;">srcTerm</span><br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">srcTerm</span>Arithmetic<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ZERO<br> - </td> - <td style="vertical-align: top;">(0, 0, 0, 0)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE<br> - </td> - <td style="vertical-align: top;">(1, 1, 1, 1)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DST_COLOR<br> - </td> - <td style="vertical-align: top;">(Rb, Gb, Bb, Ab)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_DST_COLOR<br> - </td> - <td style="vertical-align: top;">(1-Rb, 1-Gb, 1-Bb, 1-Ab)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SRC_ALPHA<br> - </td> - <td style="vertical-align: top;">(Af, Af, Af, AF)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_SRC_ALPHA<br> - </td> - <td style="vertical-align: top;">(1-Af, 1-Af, 1-Af, 1-Af)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DST_ALPHA<br> - </td> - <td style="vertical-align: top;">(Ab, Ab, Ab, Ab)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_DST_ALPHA<br> - </td> - <td style="vertical-align: top;">(1-Ab, 1-Ab, 1-Ab, 1-Ab)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SRC_ALPHA_SATURATE<br> - </td> - <td style="vertical-align: top;">(m, m, m, 1) where m = MIN(Af, -1-Ab)<br> - </td> - </tr> - </tbody> -</table> -<br> -All possible values for <span style="font-style: italic;">srcTerm</span> -and the corresponding arithmetic term are listed in the following table:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 70%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;"><span style="font-style: italic;">dstTerm</span><br> - </td> - <td style="vertical-align: top;"><span style="font-style: italic;">dstTerm</span>Arithmetic<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ZERO<br> - </td> - <td style="vertical-align: top;">(0, 0, 0, 0)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE<br> - </td> - <td style="vertical-align: top;">(1, 1, 1, 1)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SRC_COLOR<br> - </td> - <td style="vertical-align: top;">(Rf, Gf, Bf, Af)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_SRC_COLOR<br> - </td> - <td style="vertical-align: top;">(1-Rf, 1-Gf, 1-Bf, 1-Af)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SRC_ALPHA<br> - </td> - <td style="vertical-align: top;">(Af, Af, Af, AF)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_SRC_ALPHA<br> - </td> - <td style="vertical-align: top;">(1-Af, 1-Af, 1-Af, 1-Af)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DST_ALPHA<br> - </td> - <td style="vertical-align: top;">(Ab, Ab, Ab, Ab)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ONE_MINUS_DST_ALPHA<br> - </td> - <td style="vertical-align: top;">(1-Ab, 1-Ab, 1-Ab, 1-Ab)<br> - </td> - </tr> - </tbody> -</table> -<br> -The fragment's color is replaced by the result of the blending equation.<br> -<br> -Values for <span style="font-style: italic;">srcTerm</span> and <span - style="font-style: italic;">dstTerm</span> other than those listed in -the table will cause the error GL_INVALID_ENUM to be raised.<br> -<br> -The default value for <span style="font-style: italic;">srcTerm</span> -is GL_ONE. The default value for <span style="font-style: italic;">dstTerm</span> -is GL_ZERO. Blending is disabled by default.<br> -<br> -<h2>6.5 Color Mask</h2> -The final fragment color is written into the current color buffer at -the end of the per-fragment operations. Normally, all color -channels in the frame buffer are replaced with the final fragment color. - However, the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glColorMask</span>(GLboolean<span - style="font-style: italic;">redMask</span>, GLboolean <span - style="font-style: italic;">greenMask</span>, GLboolean <span - style="font-style: italic;">blueMask</span>, GLboolean <span - style="font-style: italic;">alphaMask</span>)<br> -</div> -<br> -allows selective writing to individual color channels. If <span - style="font-style: italic;">redMask</span> is GL_TRUE then writing to -the red color channel is enabled, otherwise it's disabled. - Similarly, the green, blue and alpha channels can also be masked.<br> -<br> -Initially all four mask values are GL_TRUE.<br> -<br> -Color masking is not enabled/disabled with the <span - style="font-weight: bold;">glEnable</span>/<span - style="font-weight: bold;">glDisable</span> commands.<br> -<br> -<h1>7. Frame Buffer Operations</h1> -The frame buffer is considered to be a two-dimensional array of pixels. - The frame buffer is also organized into layers or logical buffers. - There may be a front color buffer, back color buffer and stencil -buffer. A double-buffered frame buffer has both a front color -buffer and back color buffer. A single-buffered framebuffer only -has a front color buffer. Each pixel in a color buffer has a red, -green and blue value and an optional alpha value.<br> -<br> -<h2>7.1 Clearing Buffers</h2> -Buffers are cleared (set to uniform values) with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glClear</span>(GLbitfield<span - style="font-style: italic;">buffers</span>)<br> -</div> -<br> -<span style="font-style: italic;">buffers</span> is a bitmask for which -the value may be the bitwise-OR of the values GL_COLOR_BUFFER_BIT and -GL_STENCIL_BUFFER_BIT. If the GL_COLOR_BUFFER_BIT bit is -specified, the current color buffer will be cleared. If the -GL_STENCIL_BUFFER_BIT bit is specified, the stencil buffer will be -cleared.<br> -<br> -The current color buffer is specified with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glDrawBuffer</span>(GLenum<span - style="font-style: italic;"> buffer</span>)<br> -</div> -<br> -<span style="font-style: italic;">buffer</span> may be either GL_FRONT, -GL_BACK or GL_NONE. GL_FRONT indicates that the front color buffer -will be modified by <span style="font-weight: bold;">glClear</span> and -any drawing command. GL_BACK indicates that the back color buffer -will be modified by <span style="font-weight: bold;">glClear</span> and -any drawing command. GL_NONE indicates that neither color buffer -will be modified by <span style="font-weight: bold;">glClear</span> or -any drawing command. GL_BACK is only valid for double-buffered -frame buffers.<br> -<br> -The current scissor rectangle, set by the <span - style="font-weight: bold;">glScissor</span> command, effects <span - style="font-weight: bold;">glClear</span><span - style="font-style: italic;">,</span><span style="font-style: italic;"> </span>limiting -the clear to the scissor rectangle, if it's enabled. Furthermore, <span - style="font-weight: bold;"></span>only the color channels enabled by <span - style="font-weight: bold;">glColorMask</span> will be effected by <span - style="font-weight: bold;">glClear</span>(GL_COLOR_BUFFER_BIT). - Likewise, only the stencil bits enabled by <span - style="font-weight: bold;">glStencilMask</span> will be effected by <span - style="font-weight: bold;">glClear</span>(GL_STENCIL_BUFFER_BIT).<br> -<br> -The current clear color is set with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glClearColor</span>(GLclampf<span - style="font-style: italic;">red</span>, GLclampf <span - style="font-style: italic;">green</span>, GLclampf <span - style="font-style: italic;">blue</span>, GLclampf <span - style="font-style: italic;">alpha</span>)<br> -</div> -<br> -Subsequent calls to <span style="font-weight: bold;">glClear</span> -will use the color (<span style="font-style: italic;">red, green, blue, -alpha</span>) to clear the front or back color buffers.<br> -<span style="font-style: italic;"></span><br> -The current stencil clear value is set with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glClearStencil</span>(GLint<span - style="font-style: italic;">clearValue</span>)<br> -</div> -<br> -If the stencil buffer is N bits deep, the least significant N bits of <span - style="font-style: italic;">clearValue</span> will be used to clear the -stencil buffer.<br> -<br> -<br> -<h1>8. Other Features</h1> -<h2>8.1 Frame Buffer Readback</h2> -A rectangular region of pixels can be read from the frame buffer and -placed in client memory with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glReadPixels</span>(GLint<span - style="font-style: italic;">x</span>, GLint <span - style="font-style: italic;">y</span>, GLsizei <span - style="font-style: italic;">width</span>, GLsizei <span - style="font-style: italic;">height</span>, GLenum <span - style="font-style: italic;">format</span>, GLenum <span - style="font-style: italic;">type</span>, GLvoid *<span - style="font-style: italic;">data</span>)<br> -</div> -<br> -<span style="font-style: italic;">x</span> and <span - style="font-style: italic;">y</span> specify the coordinate of the -lower-left corner of the region to read and <span - style="font-style: italic;">width</span> and <span - style="font-style: italic;">height</span> specify the size of the -rectangular region to read. <span style="font-style: italic;">format</span> -specifies the format of image data and must be either GL_RGB or -GL_RGBA. <span style="font-style: italic;">type</span> specify the -data type of the image data and must be either GL_UNSIGNED_BYTE or -GL_FLOAT. Other values for <span style="font-style: italic;">format</span> -or <span style="font-style: italic;">type</span> will cause the error -GL_INVALID_ENUM to be raised.<br> -<br> -The framebuffer may contain 3-component colors (red, green, blue) or -4-component colors (red, green, blue, alpha). If an alpha channel -is not present, alpha values default to 1.0.<br> -<br> -The frame buffer color components (red, green, blue, alpha) are either -converted to 8-bit unsigned integers in the range[0, 255] if <span - style="font-style: italic;">type </span>is GL_UNSIGNED_BYTE or -converted to floating point values in the range [0, 1] if <span - style="font-style: italic;">type</span> is GL_FLOAT. The (red, -green, blue, alpha) tuples are then stored as GL_RGB triplets (by -dropping the alpha component) or GL_RGBA quadruples in client memory.<br> -<br> -Image data is <span style="font-style: italic;">packed</span> into -client memory according to the pixel packing parameters which are set by -the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glPixelStorei</span>(GLenum<span - style="font-style: italic;"> pname</span>, GLint <span - style="font-style: italic;">value</span>)<br> -</div> -<br> -<span style="font-style: italic;">pname</span> must be -GL_PACK_ROW_LENGTH. <span style="font-style: italic;">value</span> -indicates the stride (in pixels) between subsequent rows in the -destination image. If GL_PACK_ROW_LENGTH is zero (the default) -then the <span style="font-style: italic;">width</span> parameter to <span - style="font-weight: bold;">glReadPixels</span> indicates the row stride.<br> -<br> -Pixel readback takes place as follows:<br> -<br> -<div style="margin-left: 40px;">if (GL_PACK_ROW_LENGTH == 0)<br> - rowLength = <span style="font-style: italic;">width</span>;<br> -else<br> - rowLength = GL_PACK_ROW_LENGTH<br> -<br> -if (<span style="font-style: italic;">format</span> == GL_RGB) {<br> - for (i = 0; i < <span style="font-style: italic;">height</span>; -i++) {<br> - for (j = 0; j < <span - style="font-style: italic;">width</span>; j++) {<br> - k = (i * -rowLength + j) * 3;<br> - <span - style="font-style: italic;">data</span>[k+0] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).red;<br> - <span - style="font-style: italic;">data</span>[k+1] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).green;<br> - <span - style="font-style: italic;">data</span>[k+2] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).blue;<span - style="font-style: italic;"></span><br> - }<br> - }<br> -}<br> -else {<br> - for (i = 0; i < <span style="font-style: italic;">height</span>; -i++) {<br> - for (j = 0; j < <span - style="font-style: italic;">width</span>; j++) {<br> - k = (i * -rowLength + j) * 4;<br> - <span - style="font-style: italic;">data</span>[k+0] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).red;<br> - <span - style="font-style: italic;">data</span>[k+1] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).green;<br> - <span - style="font-style: italic;">data</span>[k+2] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).blue;<span - style="font-style: italic;"></span><br> - <span - style="font-style: italic;">data</span>[k+3] = FrameBuffer(<span - style="font-style: italic;">x</span> + j, <span - style="font-style: italic;">y</span> + i).alpha;<span - style="font-style: italic;"></span><br> - }<br> - }<br> -}<br> -</div> -<br> -The function FrameBuffer(<span style="font-style: italic;">c, r</span>) -returns the pixel in the frame buffer at column <span - style="font-style: italic;">c</span> of row <span - style="font-style: italic;">r. </span><span - style="font-style: italic;">data</span> is considered to be either a -GLubyte pointer or a GLfloat pointer, depending on the <span - style="font-style: italic;">type</span> parameter. Similarly, the -FrameBuffer function returns either GLubyte values in the range [0, 255] -or GLfloat values in the range [0,1], depending on the <span - style="font-style: italic;">type</span> parameter.<br> -<br> -Pixels may be read from either the front or back color buffer. - The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glReadBuffer</span>(GLenum<span - style="font-style: italic;">buffer</span>)<br> -</div> -<br> -specifies the source for reading images with <span - style="font-weight: bold;">glReadPixels</span>. If <span - style="font-style: italic;">buffer</span> is GL_FRONT then front color -buffer is the source. If <span style="font-style: italic;">buffer</span> -is GL_BACK then the back color buffer is the source. It is illegal -to specify GL_BACK when the color buffer is not double buffered. - Any invalid value for <span style="font-style: italic;">buffer</span> -will raise the error GL_INVALID_ENUM.<br> -<br> -The default read source is GL_BACK if the frame buffer is double -buffered. Otherwise, the default read source is GL_FRONT.<br> -<br> -<h2>8.2 Selection Mode</h2> -Selection mode is typically used to implement <span - style="font-style: italic;">picking</span>: determining which -primitive(s) are present at particular window positions. The -command<br> -<br> -<div style="margin-left: 40px;">GLint <span style="font-weight: bold;">glRenderMode</span>(GLenum<span - style="font-style: italic;">mode</span>)<br> -</div> -<br> -is used to enable selection mode. If <span - style="font-style: italic;">mode</span> is GL_SELECTION the graphics -library is put into selection mode. If <span - style="font-style: italic;">mode</span> is GL_RENDER the graphic -library is put into normal rendering mode. Any other value for <span - style="font-style: italic;">mode</span> will raise the error -GL_INVALID_ENUM.<br> -<br> -When in selection mode rendering commands will not effect the -framebuffer. Instead, a record of the primitives that would have -been drawn is placed in the <span style="font-style: italic;">selection</span> <span - style="font-style: italic;">buffer</span>. The selection buffer -is specified with the command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glSelectionBuffer</span>(GLsizei<span - style="font-style: italic;">n</span>, GLuint *<span - style="font-style: italic;">buffer</span>)<br> -</div> -<span style="font-style: italic;"></span><span - style="font-style: italic;"><br> -buffer</span> is an array of <span style="font-style: italic;">n</span> -unsigned integers. No more than <span style="font-style: italic;">n</span> -values will be placed in the buffer.<br> -<br> -The <span style="font-style: italic;">name stack</span> is a stack -(LIFO) of unsigned integer names. The following commands -manipulate the name stack:<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glInitNames</span>(void)<br> -void <span style="font-weight: bold;">glPushName</span>(GLuint <span - style="font-style: italic;">name</span>)<br> -void <span style="font-weight: bold;">glPopName</span>(void)<br> -void <span style="font-weight: bold;">glLoadName</span>(GLuint <span - style="font-style: italic;">name</span>)<br> -</div> -<br> -<span style="font-weight: bold;">glInitNames</span> resets the name -stack to an empty state. <span style="font-weight: bold;">glPushName<span - style="font-style: italic;"> </span></span>pushes the given <span - style="font-style: italic;">name</span> value onto the stack. <span - style="font-weight: bold;">glPopName</span> pops the top name from the -stack. <span style="font-weight: bold;">glLoadName<span - style="font-style: italic;"> </span></span>replaces the top value on -the stack with the specified <span style="font-style: italic;">name</span>. - Stack underflow and overflow conditions cause the errors -GL_STACK_OVERFLOW and GL_STACK_UNDERFLOW to be raised.<br> -<br> -While in selection mode, primitives (points, lines, polygons) are -transformed and clip-tested normally. Primitives which aren't -discarded by clipping cause the <span style="font-style: italic;">hit</span> <span - style="font-style: italic;">data</span> to be updated. The hit -data consists of three pieces of information: a hit flag, a minimum Z -value and a maximum Z value. First, the hit flag is set. - Then, for each of the primitive's vertices, the vertex Z value is -compared to the minimum and maximum Z values. The minimum Z value -is updated if the vertex's Z value is less than the minimum Z value. - The maximum Z value is updated if the vertex's Z value is greater -than the maximum Z value.<br> -<br> -When any of <span style="font-weight: bold;">glInitNames</span><span - style="font-style: italic;"><span style="font-style: italic;">, </span></span><span - style="font-weight: bold;">glPushName</span>, <span - style="font-weight: bold;">glPopName</span>, <span - style="font-weight: bold;">glLoadName</span> or <span - style="font-weight: bold;">glRenderMode</span> are called and the hit -flag is set, a <span style="font-style: italic;">hit record</span> is -written to the selection buffer.<br> -<br> -A hit record consists of a sequence of unsigned integers. The -first value is the size of the name stack. The second value is the -minimum Z value multiplied by 2<sup>32</sup>-1. The third value is -the maximum Z value multiplied by 2<sup>32</sup>-1. The remaining -values are the values in the name stack, in bottom to top order. - The hit flag is cleared after a hit record is written to the -selection buffer. Hit records are places sequentially into the -selection buffer until it is full or selection mode is terminated.<br> -<br> -Selection mode is terminated by calling <span - style="font-weight: bold;">glRenderMode</span>(GL_RENDER). The -return value of <span style="font-weight: bold;">glRenderMode</span> -will be -1 if the selection buffer overflowed. Otherwise, the -return value will indicate the number of values written into the -selection buffer.<br> -<br> -<h2>8.3 Synchronization</h2> -The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glFlush</span>(void)<br> -</div> -<br> -makes the graphics library to flush all pending graphics commands. - The command<br> -<div style="margin-left: 40px;"><br> -void <span style="font-weight: bold;">glFinish</span>(void)<br> -</div> -<br> -makes the graphics library flush the command queue and wait until those -commands are completed. <span style="font-weight: bold;">glFlush</span> -will not return until all previous graphics commands have been fully -completed.<br> -<br> -These commands are typically used to force completion of rendering to -the front color buffer. Otherwise, rendering to the front color -buffer may not appear. The <span style="font-style: italic;">swapbuffers</span> -command (part of the window system binding library) does an implicit -flush before swapping the front and back color buffers. The <span - style="font-weight: bold;">glReadPixels</span> command also does an -implicit flush before reading pixel data from the frame buffer.<br> -<br> -<h1>9. State Queries</h1> -The current value of nearly all library state variables can be queried. - This chapter describes the commands used for querying the value of -state variables.<br> -<br> -<h2>9.1 General State Queries</h2> -The command<br> -<br> -<div style="margin-left: 40px;">void <span style="font-weight: bold;">glGetFloatv</span>(GLenum<span - style="font-style: italic;">pname</span>, GLfloat *<span - style="font-style: italic;">values</span>)<br> -</div> -<br> -returns the value(s) of the state variable specified by <span - style="font-style: italic;">pname</span>. The following table -lists all accepted values for <span style="font-style: italic;">pname</span> -and a description of the value(s). Specifying any other value for <span - style="font-style: italic;">pname</span> causes the error -GL_INVALID_ENUM to be raised.<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 90%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">Variable (<span - style="font-style: italic;">pname)</span><br> - </td> - <td style="vertical-align: top;">Number of values<br> - </td> - <td style="vertical-align: top;">Value(s) Description<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALPHA_BITS<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Number of bits per alpha value -in the frame buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALPHA_TEST<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if the alpha test is -disabled.<br> -One if the alpha test is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALPHA_TEST_FUNC<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">The alpha test function.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_BLEND<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if blending is disabled.<br> -One if blending is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_BLEND_DST<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Blend destination function/term.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_BLEND_SRC<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Blend source function/term.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_BLUE_BITS<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Number of bits per blue value in -the frame buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_COLOR_CLEAR_VALUE<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Clear color (red, green, blue, -alpha).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_COLOR_WRITE_MASK<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Color buffer writemask (red, -green, blue, alpha).<br> -Zero if writing is disabled.<br> -One if writing is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CULL_FACE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if polygon culling is -disabled.<br> -One if polygon culling is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CULL_FACE_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Polygon cull mode: GL_FRONT, -GL_BACK or GL_FRONT_AND_BACK.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_COLOR<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current color (red, green, blue, -alpha).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_RASTER_COLOR<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current raster position color -(red, green, blue, alpha).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_RASTER_TEXTURE_COORDS<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current raster position texture -coordinates (s, t, r, q).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_RASTER_POSITION<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current raster position (x, y, -z, w).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_POSITION_VALID<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if current raster position -is invalid.<br> -One if current raster position is valid.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_CURRENT_TEXTURE_COORDS<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current texture coordinates (s, -t, r, q)<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DOUBLEBUFFER<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if color buffer is -single-buffered.<br> -One if color buffer is double-buffered.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_DRAW_BUFFER<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current color draw buffer: -GL_FRONT or GL_BACK.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_FRONT_FACE</td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Polygon front-face winding: -GL_CW or GL_CCW.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_GREEN_BITS<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Number of bits per green value -in the frame buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_SMOOTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if line smoothing is -disabled.<br> -One if line smoothing is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_STIPPLE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if line stippling is -disabled.<br> -One if line stippling is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_STIPPLE_PATTERN<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Line stipple pattern.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_STIPPLE_REPEAT<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Line stipple repeat factor.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_WIDTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Line width in pixels.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_WIDTH_GRANULARITY<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Aliased line width granularity.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LINE_WIDTH_RANGE<br> - </td> - <td style="vertical-align: top;">2<br> - </td> - <td style="vertical-align: top;">Minimum and maximum aliased line -widths.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_ALIASED_LINE_WIDTH_RANGE<br> - </td> - <td style="vertical-align: top;">2<br> - </td> - <td style="vertical-align: top;">Minimum and maximum antialiased -line widths.</td> - </tr> - <tr> - <td style="vertical-align: top;">GL_COLOR_LOGIC_OP<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if logicop is disabled.<br> -One if logicop is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_LOGIC_OP_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Logicop function.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MATRIX_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Matrix mode: GL_MODELVIEW or -GL_PROJECTION.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MAX_MODELVIEW_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Maximum size of the modelview -matrix stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MAX_NAME_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Maximum size of the selection -name stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MAX_PROJECTION_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Maximum size of the projection -matrix stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MAX_TEXTURE_SIZE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Maximum 2D texture image width -and height.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MAX_VIEWPORT_DIMS<br> - </td> - <td style="vertical-align: top;">2</td> - <td style="vertical-align: top;">Maximum viewport width and -height in pixels.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MODELVIEW_MATRIX<br> - </td> - <td style="vertical-align: top;">16<br> - </td> - <td style="vertical-align: top;">Current/top modelview matrix -values.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_MODELVIEW_MATRIX_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current size of the modelview -matrix stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NAME_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current size of the selection -name stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_PACK_ROW_LENGTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Pixel packing row length.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_POLYGON_SMOOTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if polygon smoothing is -disabled.<br> -One if polygon smoothing is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_PROJECTION_MATRIX<br> - </td> - <td style="vertical-align: top;">16<br> - </td> - <td style="vertical-align: top;">Current/top projection matrix -values.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_PROJECTION_STACK_DEPTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current size of projection -matrix stack.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_READ_BUFFER<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current read buffer: GL_FRONT or -GL_BACK.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RED_BITS<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Number of bits per red value in -the frame buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RENDER_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Current rendering mode: -GL_RENDER or GL_SELECTION.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RGBA_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Always one.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SCISSOR_BOX<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Scissor box (x, y, width, -height).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SCISSOR_TEST<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if scissor test is disabled.<br> -One if scissor test is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SELECTION_BUFFER_SIZE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Size of selection buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_SHADE_MODEL<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Shade model: GL_FLAT or -GL_SMOOTH.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_BITS<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Number of bits per stencil value -in the frame buffer.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_CLEAR_VALUE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil buffer clear value.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_FAIL<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil fail operation.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_FUNC<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil function.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_REF<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil reference value.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_TEST<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if stencil test is disabled.<br> -One if stencil test is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_VALUE_MASK<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil mask value.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STENCIL_WRITE_MASK<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Stencil buffer write mask.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_TEXTURE_2D<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if 2D texture mapping is -disabled.<br> -One if 2D texture mapping is enabled.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_TEXTURE_BINDING_2D</td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Name of currently bound 2D -texture object.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_TEXTURE_ENV_COLOR<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Texture environment color (red, -green, blue, alpha).<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_TEXTURE_ENV_MODE<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Texture environment mode.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_UNPACK_ROW_LENGTH<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Pixel unpacking row length.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_UNPACK_LSB_FIRST<br> - </td> - <td style="vertical-align: top;">1<br> - </td> - <td style="vertical-align: top;">Zero if most significant bit is -unpacked first for bitmaps.<br> -One if least significant bit is unpacked first for bitmaps.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_VIEWPORT<br> - </td> - <td style="vertical-align: top;">4<br> - </td> - <td style="vertical-align: top;">Current viewport (x, y, width, -height).<br> - </td> - </tr> - </tbody> -</table> -<br> -<br> -<h2>9.2 String Queries</h2> -The command<br> -<br> -<div style="margin-left: 40px;">const GLubyte *<span - style="font-weight: bold;">glGetString</span>(GLenum <span - style="font-style: italic;">name</span>)<br> -</div> -<br> -is used to query string-valued values. The legal values for <span - style="font-style: italic;">name</span> are described in the following -table:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 80%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;"><span style="font-style: italic;">name</span><br> - </td> - <td style="vertical-align: top;">Return value<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_VERSION<br> - </td> - <td style="vertical-align: top;">The library version, such as -"1.2".<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_RENDERER<br> - </td> - <td style="vertical-align: top;">The renderer, such as "Mesa DRI -Radeon".<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_VENDOR<br> - </td> - <td style="vertical-align: top;">The vendor of this -implementation, such as "Tungsten Graphics, Inc."<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_EXTENSIONS<br> - </td> - <td style="vertical-align: top;">A white-space separated list of -the supported extensions. </td> - </tr> - </tbody> -</table> -<br> -<h2>9.3 Error Queries</h2> -The command<br> -<br> -<div style="margin-left: 40px;">GLenum <span style="font-weight: bold;">glGetError</span>(void)<br> -</div> -<br> -returns the current error code. The current error code will be -set by a GL command when an error condition has been detected. If -the current error code is already set, subsequent errors will not be -recorded. The error code is reset/cleared to GL_NO_ERROR when <span - style="font-weight: bold;">glGetError</span> returns. The -following error codes are possible:<br> -<br> -<table cellpadding="2" cellspacing="2" border="1" - style="text-align: left; width: 80%; margin-left: auto; margin-right: auto;"> - <tbody> - <tr> - <td style="vertical-align: top;">Error code<br> - </td> - <td style="vertical-align: top;">Meaning<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_NO_ERROR<br> - </td> - <td style="vertical-align: top;">No error has been recorded.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INVALID_ENUM<br> - </td> - <td style="vertical-align: top;">An enum parameter had an invalid -value.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INVALID_VALUE<br> - </td> - <td style="vertical-align: top;">A numeric parameter had an -invalid value.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_INVALID_OPERATION<br> - </td> - <td style="vertical-align: top;">A function was called when not -legal to do so.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STACK_OVERFLOW<br> - </td> - <td style="vertical-align: top;">The current transformation -matrix stack is full.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_STACK_UNDERFLOW<br> - </td> - <td style="vertical-align: top;">The current transformation -matrix stack is empty.<br> - </td> - </tr> - <tr> - <td style="vertical-align: top;">GL_OUT_OF_MEMORY<br> - </td> - <td style="vertical-align: top;">The system ran out of dynamic -memory.<br> - </td> - </tr> - </tbody> -</table> -<br> -<br> -<h1>10. Unsupported Features</h1> -This section lists other features and functions which are not supported -and not previously discussed.<br> -<br> -<h2>10.1 Feedback Mode</h2> -Feedback mode and the following related functions are not supported.<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glFeedbackBuffer</span><br> -<span style="font-weight: bold;">glPassThrough</span><br> -</div> -<br> -<h2>10.2 1D and 3D Textures<br> -</h2> -Only 2D texture images are supported. The following functions -used to specify 1D and 3D texture images are not supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glTexImage1D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexImage3D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexSubImage1D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glTexSubImage3D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glCopyTexImage1D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glCopyTexSubImage1D</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glCopyTexSubImage3D</span><br> -</div> -<br> -<h2>10.3 Alternate Texture Image Commands<br> -</h2> -Texture images may only be specified with <span - style="font-weight: bold;">glTexImage2D</span>. The following -alternate texture image commands are not supported:<br> -<br> -<div style="margin-left: 40px; font-weight: bold;">glTexSubImage2D<br> -glCopyTexImage2D<br> -glCopyTexSubImage2D<br> -</div> -<br> -<h2>10.4 Proxy Textures</h2> -Proxy textures are not supported and the GL_PROXY_TEXTURE_2D token is -not supported by any function.<br> -<br> -<br> -<h2>10.5 Other Texture Commands</h2> -The following commands related to texture mapping are not supported by -the subset:<br> -<br> -<div style="margin-left: 40px; font-weight: bold;"> glPrioritizeTextures<br> -glAreTexturesResident<br> -glIsTexture<br> -glTexEnviv<br> -glTexEnvf<br> -glTexParameterf<br> -glTexParameteriv<br> -glTexParameterfv<br> -</div> -<br> -<br> -<h2>10.6 Copy and Draw Pixels<br> -</h2> -The following commands are not supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glDrawPixels<br> -glCopyPixels<br> -glPixelZoom<br> -<br> -</span></div> -<h2>10.7 Color Index Mode<br> -</h2> -Color index mode and the following related commands are not supported:<br> -<br> -<span style="font-weight: bold;"></span> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glIndexub<br> -</span><span style="font-weight: bold;">glIndexi</span><br> -<span style="font-weight: bold;">glIndexs<br> -glIndexf<br> -glIndexd<br> -</span><span style="font-weight: bold;">glIndexubv<br> -</span><span style="font-weight: bold;">glIndexiv</span><br> -<span style="font-weight: bold;">glIndexsv<br> -glIndexfv<br> -glIndexdv</span><span style="font-weight: bold;"><br> -glIndexMask<br> -</span><span style="font-weight: bold;">glClearIndex<br> -glIndexPointer</span><br style="font-weight: bold;"> -<br> -</div> -<h2>10.8 Pixel Transfer Operations</h2> -The pixel transfer operations (scale, bias, look-up table, etc) are not -supported and the following commands are omitted:<br> -<br style="font-weight: bold;"> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glPixelTransferf</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glPixelTransferi</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glPixelMapfv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glPixelMapuiv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glPixelMapusv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetPixelMapfv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetPixelMapuiv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetPixelMapusv</span><br> -</div> -<br> -<h2>10.9 Hints</h2> -Hints and the following related command is not supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glHint<br> -</span><br> -</div> -<h2>10.10 State Query Commands<br> -</h2> -The following state query commands are not supported:<br> -<br> -<div style="margin-left: 40px; font-weight: bold;">glGetBooleanv<br> -glGetIntegerv<br> -glGetDoublev<br> -glGetPointerv<br> -glGetTexEnvi<br> -glGetTexEnvf<br> -glGetTexParameteriv<br> -glGetTexParameterfv<br> -glGetTexLevelParameteriv<br> -glGetTexLevelParameterfv<br> -glGetTexImage<br> -glGetClipPlane<br> -</div> -<br> -<h2>10.11 Attribute Stacks</h2> -State attribute stacks and the following related commands are not -supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glPushAttrib</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glPopAtttrib</span><br> -<br style="font-weight: bold;"> -</div> -<h2>10.12 Double-Valued Functions</h2> -All functions which take double-precision floating point values, but -for which there is an equivalent single-precision valued function, are -omitted. This includes, but is not limited to:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glVertex2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glVertex2dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glVertex3d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glVertex3dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glVertex4d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glVertex4dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glColor3d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glColor3d</span><span - style="font-weight: bold;">v</span><br style="font-weight: bold;"> -<span style="font-weight: bold;">glColor4d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glColor4dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexCoord1d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexCoord1d</span><span - style="font-weight: bold;">v</span><br style="font-weight: bold;"> -<span style="font-weight: bold;">glTexCoord2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glTexCoord2dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexCoord3d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glTexCoord3dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTexCoord4d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glTexCoord4dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glRasterPos2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glRasterPos2dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glRasterPos3d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glRasterPos3dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glRasterPos4d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;"> glRasterPos4dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glLoadMatrixd</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMultMatrixd</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glScaled</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glRotated</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glTranslated<br> -glRectd<br> -glRectdv<br> -</span> <span style="font-weight: bold;"><br> -</span> </div> -<h2>10.13 Evaluators</h2> -Evaluators and the following related commands are not supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glMap1f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMap2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMap2f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetMapdv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetMapfv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glGetMapiv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord1d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord1f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord1dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord1fv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord2f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord2dv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalCoord2fv</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMapGrid1d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMapGrid1f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMapGrid2d</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glMapGrid2f</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalPoint1</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalPoint2</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalMesh1</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glEvalMesh2</span><br - style="font-weight: bold;"> -</div> -<br> -<h2>10.14 Display Lists</h2> -Display lists and the following related commands are not supported:<br> -<br> -<div style="margin-left: 40px; font-weight: bold;">glIsList<br> -glDeleteLists<br> -glGenLists<br> -glNewList<br> -glEndList<br> -glCallList<br> -glCallLists<br> -glListBase<br> -</div> -<br> -<h2>10.15 Accumulation Buffer</h2> -The accumulation buffer and the following related commands are not -supported:<br> -<br style="font-weight: bold;"> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glAccum</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glClearAccum</span><br> -</div> -<br> -<h2>10.16 Fog</h2> -Fog and the following related commands are not supported:<br> -<br> -<div style="margin-left: 40px; font-weight: bold;"> glFogi<br> -glFogf<br> -glFogiv<br> -glFogfv<br> -</div> -<br> -<h2>10.17 Depth Test</h2> -Depth testing and the following related commands are not supported:<br> -<br> -<div style="margin-left: 40px;"><span style="font-weight: bold;">glDepthFunc</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glDepthMask</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glDepthRange</span><br - style="font-weight: bold;"> -<span style="font-weight: bold;">glClearDepth</span><br> -</div> -<br> -<h2>10.18 Imaging Subset</h2> -The OpenGL imaging subset (which implements features such as -convolution, histogram, min/max recording, color matrix and color -tables) is not supported.<br> -<br> -<br> -<h1>Appendix A: Issues</h1> -This appendix lists documentation and subset issues with their current -status. For items which are still open, the documentation (above) -follows the recommended solution.<br> -<br> -<h2>A.1 Vertex Arrays</h2> -Should vertex arrays be supported? Is there a performance -advantage?<br> -<br> -RESOLUTION: No, there isn't enough of a performance advantage to -justify them.<br> -<br> -<h2>A.2 Polygon Antialiasing and Edge Flags</h2> -Should edge flags be supported for antialiasing?<br> -<br> -Edge flags don't effect antialiasing, at least not normally. A -number of approaches to antialiasing have been summarized in email.<br> -<br> -RECOMMENDATION: don't support edge flags. They don't effect -polygon antialiasing.<br> -<br> -RESOLUTION: closed, as of 26 Feb 2003.<br> -<br> -<h2>A.3 glRasterPos vs. glWindowPos</h2> -Should glRasterPos and/or glWindowPos commands be supported?<br> -<br> -RESOLUTION: Closed: implement glRasterPos commands, but not glWindowPos -commands.<br> -<br> -<h2>A.4 GL_IBM_rasterpos_clip extension</h2> -Should the GL_IBM_rasterpos_clip extension be implemented?<br> -<br> -RESOLUTION: No. It's not required.<br> -<br> -<h2>A.5 Image Formats and Types</h2> -Which image formats and types should be supported for <span - style="font-weight: bold;">glTexImage2D</span> and <span - style="font-weight: bold;">glReadPixels</span>?<br> -<br> -OpenGL specifies a <span style="font-weight: bold;">large</span> -variety of image formats and data types. Only a few are commonly -used.<br> -<br> -RECOMMENDATION: we propose a subset:<br> -<br> -For <span style="font-weight: bold;">glTexImage2D</span> only allow <span - style="font-style: italic;">type</span>=GL_UNSIGNED_BYTE and <span - style="font-style: italic;">format</span>=GL_RGBA, GL_RGB, -GL_INTENSITY. Only allow <span style="font-style: italic;">internalFormat</span> -to be GL_RGBA, GL_RGB or GL_INTENSITY as well. Basically, only -support image formats/types that are directly supported by the Radeon -hardware. This will allow <span style="font-weight: bold;">glTexImage2D</span> -to basically just use <span style="font-weight: bold;">memcpy</span> to -copy texture images.<br> -<br> -For <span style="font-weight: bold;">glReadPixels</span>, only allow <span - style="font-style: italic;">type</span> = GL_UNSIGNED_BYTE or GL_FLOAT. - Only allow <span style="font-style: italic;">format</span> = -GL_RGB or GL_RGBA. This is just enough to support the OpenGL -conformance tests.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.6 Texture Environment Modes</h2> -Which texture environment modes should be supported? OpenGL 1.2 -has GL_REPLACE, GL_MODULATE, GL_DECAL and GL_BLEND. GL_DECAL isn't -defined for all base internal texture formats. GL_ADD is another -useful mode. Perhaps drop GL_DECAL mode and add GL_ADD mode.<br> -<br> -RECOMMENDATION: implement the standard modes GL_REPLACE, GL_MODULATE, -GL_DECAL and GL_BLEND.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.7 Truncated Mipmaps and LOD Control</h2> -Should we support the GL_TEXTURE_BASE_LEVEL, GL_TEXTURE_MAX_LEVEL, -GL_TEXTURE_MIN_LOD and GL_TEXTURE_MAX_LOD texture parameters?<br> -<br> -RECOMMENDATION: We propose omitting these features at this time, -in the interest of simplifying the driver.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.8 Texture Priorities and Residency</h2> -Should the subset support texture priorities via <span - style="font-weight: bold;">glPrioritizeTextures</span> and the <span - style="font-weight: bold;">glAreTexturesResident</span> command?<br> -<br> -RECOMMENDATION: Few applications use these features and -functions. We propose omitting them to simplify the driver.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.9 Pixel Pack/Unpack Alignment Control</h2> -Should we support the GL_PACK_ALIGNMENT and GL_UNPACK_ALIGNMENT options?<br> -<br> -These are used to align pixel data addresses to 1, 2 and 4-byte -multiples for <span style="font-weight: bold;">glBitmap, glTexImage2D</span> -and <span style="font-weight: bold;">glReadPixels</span>. These -aren't strictly needed since the user can provide a 1, 2 or 4-byte -aligned address and appropriate GL_PACK_ROW_LENGTH or -GL_UNPACK_ROW_LENGTH values instead.<br> -<br> -RECOMMENDATION: We recommend omitting them to simplify the driver.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.10 Pixel Pack/Unpack Skip Rows/Pixels Control</h2> -Should we support the GL_UNPACK_SKIP_PIXELS, GL_UNPACK_SKIP_ROWS, -GL_PACK_SKIP_PIXELS and GL_PACK_SKIP_ROWS options for pixel -unpacking/packing?<br> -<br> -These options aren't really needed since the user can adjust the start -address and GL_PACK/UNPACK_ROW_LENGTH parameters to achieve the same -effect.<br> -<br> -RECOMMENDATION: omit these parameters.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.11 Texture State Queries</h2> -Should we support the command <span style="font-weight: bold;">glGetTexEnvi/fv, -glGetTexParameteri/fv</span> and <span style="font-weight: bold;">glGetTexLevelParameteri/fv</span>?<br> -<br> -RECOMMENDATION: No. They're seldom needed and their -implementation is several hundred lines of code in length.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.12 glGetIntegerv, glGetBooleanv and glGetDoublev</h2> -Should we support the commands <span style="font-weight: bold;">glGetIntegerv, -glGetBooleanv </span>and <span style="font-weight: bold;">glGetDoublev</span> -in addition to <span style="font-weight: bold;">glGetFloatv</span>?<br> -<br> -RECOMMENDATION: Omit the boolean, integer and double-valued -functions. All state values which can be queried by these commands can -be expressed as floating point values and queried with <span - style="font-weight: bold;">glGetFloatv</span>. The -implementation of the other three commands involves many lines of code.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.13 glBitmap and Per-Fragment Operations</h2> -Should bitmaps rendered with <span style="font-weight: bold;">glBitmap</span> -be subjected to the per-fragment operations?<br> -<br> -If bitmaps are implemented with points it will be easy to implement the -per-fragment operations. Otherwise, it could be difficult.<br> -<br> -RECOMMENDATION: Implement glBitmap by drawing points/pixels with -the hardware. This will make supporting the per-fragments -trivially easy. Also, it makes portrait-mode display relatively -easy.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.14 Reduced gl.h Header File</h2> -Should we produce a reduced gl.h header file which only defines the -tokens and functions which are implemented by the subset?<br> -<br> -RECOMMENDATION: yes. It would be a useful reference to -programmers to quickly determine which functions and tokens are -supported.<br> -<br> -RESOLUTION: open<br> -<br> -<h2>A.15 glPolygonMode</h2> -Is <span style="font-weight: bold;">glPolygonMode</span> needed?<br> -<br> -RECOMMENDATION: No. Omit it.<br> -<br> -RESOLUTION: closed, as of 26 Feb 2003<br> -<br> -<br> -<p> </p> -</body> -</html> diff --git a/mesalib/docs/subset.html b/mesalib/docs/subset.html deleted file mode 100644 index 0ceb13666..000000000 --- a/mesalib/docs/subset.html +++ /dev/null @@ -1,25 +0,0 @@ -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> -<html lang="en"> -<head> - <meta http-equiv="content-type" content="text/html; charset=utf-8"> - <title>Mesa Subset Driver</title> - <link rel="stylesheet" type="text/css" href="mesa.css"> -</head> -<body> - -<h1>Mesa Subset Driver</h1> - -<p> -In 2002/2003 Tungsten Graphics was contracted to develop a subset Mesa/Radeon -driver for an embedded environment. The result is a reduced-size DRI driver -for the ATI R200 chip, for use with -fbdev/DRI environment. -</p> - -<p> -The specification for this subset can be found -<a href="subset-A.html">here</a>. -</p> - -</body> -</html> diff --git a/mesalib/src/glsl/builtin_variables.cpp b/mesalib/src/glsl/builtin_variables.cpp index 03b64c931..353805b7f 100644 --- a/mesalib/src/glsl/builtin_variables.cpp +++ b/mesalib/src/glsl/builtin_variables.cpp @@ -328,7 +328,7 @@ static struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = { #define STATEVAR(name) {#name, name ## _elements, Elements(name ## _elements)} -const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = { +static const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = { STATEVAR(gl_DepthRange), STATEVAR(gl_ClipPlane), STATEVAR(gl_Point), diff --git a/mesalib/src/mesa/drivers/dri/common/Makefile.am b/mesalib/src/mesa/drivers/dri/common/Makefile.am index d81bc0e3f..6e9d738fa 100644 --- a/mesalib/src/mesa/drivers/dri/common/Makefile.am +++ b/mesalib/src/mesa/drivers/dri/common/Makefile.am @@ -28,11 +28,17 @@ AM_CFLAGS = \ $(API_DEFINES) \ $(LIBDRM_CFLAGS) -noinst_LTLIBRARIES = libdricommon.la +noinst_LTLIBRARIES = \ + libdricommon.la \ + libdri_test_stubs.la libdricommon_la_SOURCES = \ utils.c \ dri_util.c \ xmlconfig.c +libdri_test_stubs_la_SOURCES = \ + dri_test.c +libdri_test_stubs_la_CFLAGS = $(AM_CFLAGS) -DNO_MAIN + sysconf_DATA = drirc diff --git a/mesalib/src/mesa/drivers/dri/common/dri_test.c b/mesalib/src/mesa/drivers/dri/common/dri_test.c index 793f0c37d..35732857d 100644 --- a/mesalib/src/mesa/drivers/dri/common/dri_test.c +++ b/mesalib/src/mesa/drivers/dri/common/dri_test.c @@ -82,8 +82,10 @@ _glthread_GetID(void) return 0; } +#ifndef NO_MAIN int main(int argc, char** argv) { void* p = __driDriverExtensions; return (int)(unsigned long)p; } +#endif diff --git a/mesalib/src/mesa/main/dd.h b/mesalib/src/mesa/main/dd.h index e6a1e68cb..0000a397a 100644 --- a/mesalib/src/mesa/main/dd.h +++ b/mesalib/src/mesa/main/dd.h @@ -251,14 +251,14 @@ struct dd_function_table { struct gl_texture_object *texObj); /** - * Called by glTexImage[123]D when user specifies a proxy texture - * target. - * - * \return GL_TRUE if the proxy test passes, or GL_FALSE if the test fails. + * Called by glTexImage, glCompressedTexImage, glCopyTexImage + * and glTexStorage to check if the dimensions of the texture image + * are too large. + * \param target any GL_PROXY_TEXTURE_x target + * \return GL_TRUE if the image is OK, GL_FALSE if too large */ GLboolean (*TestProxyTexImage)(struct gl_context *ctx, GLenum target, - GLint level, GLint internalFormat, - GLenum format, GLenum type, + GLint level, gl_format format, GLint width, GLint height, GLint depth, GLint border); /*@}*/ diff --git a/mesalib/src/mesa/main/teximage.c b/mesalib/src/mesa/main/teximage.c index da8fbcd32..83e79a5a3 100644 --- a/mesalib/src/mesa/main/teximage.c +++ b/mesalib/src/mesa/main/teximage.c @@ -1209,44 +1209,22 @@ _mesa_clear_texture_image(struct gl_context *ctx, /** - * This is the fallback for Driver.TestProxyTexImage(). Test the texture - * level, width, height and depth against the ctx->Const limits for textures. - * - * A hardware driver might override this function if, for example, the - * max 3D texture size is 512x512x64 (i.e. not a cube). - * - * Note that width, height, depth == 0 is not an error. However, a - * texture with zero width/height/depth will be considered "incomplete" - * and texturing will effectively be disabled. - * - * \param target one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, - * GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV, - * GL_PROXY_TEXTURE_CUBE_MAP_ARB. - * \param level as passed to glTexImage - * \param internalFormat as passed to glTexImage - * \param format as passed to glTexImage - * \param type as passed to glTexImage - * \param width as passed to glTexImage - * \param height as passed to glTexImage - * \param depth as passed to glTexImage - * \param border as passed to glTexImage - * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. + * Check the width, height, depth and border of a texture image are legal. + * Used by all the glTexImage, glCompressedTexImage and glCopyTexImage + * functions. + * The target and level parameters will have already been validated. + * \return GL_TRUE if size is OK, GL_FALSE otherwise. */ GLboolean -_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, - GLint internalFormat, GLenum format, GLenum type, - GLint width, GLint height, GLint depth, GLint border) +_mesa_legal_texture_dimensions(struct gl_context *ctx, GLenum target, + GLint level, GLint width, GLint height, + GLint depth, GLint border) { GLint maxSize; - (void) internalFormat; - (void) format; - (void) type; - switch (target) { + case GL_TEXTURE_1D: case GL_PROXY_TEXTURE_1D: - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); /* level zero size */ maxSize >>= level; /* level size */ if (width < 2 * border || width > 2 * border + maxSize) @@ -1257,9 +1235,8 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, } return GL_TRUE; + case GL_TEXTURE_2D: case GL_PROXY_TEXTURE_2D: - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) @@ -1274,9 +1251,8 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, } return GL_TRUE; + case GL_TEXTURE_3D: case GL_PROXY_TEXTURE_3D: - if (level >= ctx->Const.Max3DTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) @@ -1295,6 +1271,7 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, } return GL_TRUE; + case GL_TEXTURE_RECTANGLE_NV: case GL_PROXY_TEXTURE_RECTANGLE_NV: if (level != 0) return GL_FALSE; @@ -1305,9 +1282,13 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_FALSE; return GL_TRUE; + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: case GL_PROXY_TEXTURE_CUBE_MAP_ARB: - if (level >= ctx->Const.MaxCubeTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) @@ -1322,9 +1303,8 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, } return GL_TRUE; + case GL_TEXTURE_1D_ARRAY_EXT: case GL_PROXY_TEXTURE_1D_ARRAY_EXT: - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) @@ -1337,9 +1317,8 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, } return GL_TRUE; + case GL_TEXTURE_2D_ARRAY_EXT: case GL_PROXY_TEXTURE_2D_ARRAY_EXT: - if (level >= ctx->Const.MaxTextureLevels) - return GL_FALSE; maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); maxSize >>= level; if (width < 2 * border || width > 2 * border + maxSize) @@ -1357,25 +1336,43 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, return GL_TRUE; default: - _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage"); + _mesa_problem(ctx, "Invalid target in _mesa_legal_texture_dimensions()"); return GL_FALSE; } } /** - * Check if the memory used by the texture would exceed the driver's limit. - * This lets us support a max 3D texture size of 8K (for example) but - * prevents allocating a full 8K x 8K x 8K texture. - * XXX this could be rolled into the proxy texture size test (above) but - * we don't have the actual texture internal format at that point. + * This is the fallback for Driver.TestProxyTexImage() for doing device- + * specific texture image size checks. + * + * A hardware driver might override this function if, for example, the + * max 3D texture size is 512x512x64 (i.e. not a cube). + * + * Note that width, height, depth == 0 is not an error. However, a + * texture with zero width/height/depth will be considered "incomplete" + * and texturing will effectively be disabled. + * + * \param target any texture target/type + * \param level as passed to glTexImage + * \param format the MESA_FORMAT_x for the tex image + * \param width as passed to glTexImage + * \param height as passed to glTexImage + * \param depth as passed to glTexImage + * \param border as passed to glTexImage + * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. */ -static GLboolean -legal_texture_size(struct gl_context *ctx, gl_format format, - GLint width, GLint height, GLint depth) +GLboolean +_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, + gl_format format, + GLint width, GLint height, GLint depth, GLint border) { + /* We just check if the image size is less than MaxTextureMbytes. + * Some drivers may do more specific checks. + */ uint64_t bytes = _mesa_format_image_size64(format, width, height, depth); uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */ + mbytes *= _mesa_num_tex_faces(target); return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes; } @@ -1664,19 +1661,11 @@ get_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh) /** - * Special value returned by error some texture error checking functions when - * an error is detected and the proxy texture image's width/height/depth/format - * fields should be zeroed-out. - */ -#define PROXY_ERROR 2 - - -/** * Test the glTexImage[123]D() parameters for errors. * * \param ctx GL context. * \param dimensions texture image dimensions (must be 1, 2 or 3). - * \param target texture target given by the user. + * \param target texture target given by the user (already validated). * \param level image level given by the user. * \param internalFormat internal format given by the user. * \param format pixel data format given by the user. @@ -1686,14 +1675,17 @@ get_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh) * \param depth image depth given by the user. * \param border image border given by the user. * - * \return PROXY_ERROR if there's an error that should zero-out the proxy image, - * GL_TRUE if a regular GL error is found, or GL_FALSE if no error, + * \return GL_TRUE if a error is found, GL_FALSE otherwise * * Verifies each of the parameters against the constants specified in * __struct gl_contextRec::Const and the supported extensions, and according * to the OpenGL specification. + * Note that we don't fully error-check the width, height, depth values + * here. That's done in _mesa_legal_texture_dimensions() which is used + * by several other GL entrypoints. Plus, texture dims have a special + * interaction with proxy textures. */ -static GLenum +static GLboolean texture_error_check( struct gl_context *ctx, GLuint dimensions, GLenum target, GLint level, GLint internalFormat, @@ -1701,9 +1693,6 @@ texture_error_check( struct gl_context *ctx, GLint width, GLint height, GLint depth, GLint border ) { - const GLenum proxyTarget = _mesa_get_proxy_target(target); - const GLboolean isProxy = target == proxyTarget; - GLboolean sizeOK = GL_TRUE; GLboolean colorFormat; GLenum err; @@ -1720,8 +1709,8 @@ texture_error_check( struct gl_context *ctx, * zero-out behaviour is only used in cases related to memory allocation. */ - /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ - if (level < 0 || level >= MAX_TEXTURE_LEVELS) { + /* level check */ + if (level < 0 || level >= _mesa_max_texture_levels(ctx, target)) { _mesa_error(ctx, GL_INVALID_VALUE, "glTexImage%dD(level=%d)", dimensions, level); return GL_TRUE; @@ -1769,30 +1758,11 @@ texture_error_check( struct gl_context *ctx, } } - /* Do this simple check before calling the TestProxyTexImage() function */ - if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { - sizeOK = (width == height); - } - - /* - * Use the proxy texture driver hook to see if the size/level/etc are - * legal. - */ - sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, - internalFormat, format, - type, width, height, - depth, border); - if (!sizeOK) { - if (isProxy) { - /* No GL error is recorded, but we need to zero-out the image dims */ - return PROXY_ERROR; - } - else { - _mesa_error(ctx, GL_INVALID_VALUE, - "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)", - dimensions, level, width, height, depth); - return GL_TRUE; - } + if ((target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || + _mesa_is_cube_face(target)) && width != height) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glTexImage2D(cube width != height)"); + return GL_TRUE; } /* Check internalFormat */ @@ -1921,8 +1891,9 @@ texture_error_check( struct gl_context *ctx, /** * Error checking for glCompressedTexImage[123]D(). - * \param reason returns reason for error, if any - * \return error code or GL_NO_ERROR or PROXY_ERROR. + * Note that the width, height and depth values are not fully error checked + * here. + * \return GL_TRUE if a error is found, GL_FALSE otherwise */ static GLenum compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, @@ -1931,7 +1902,6 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, GLsizei height, GLsizei depth, GLint border, GLsizei imageSize) { - const GLenum proxyTarget = _mesa_get_proxy_target(target); const GLint maxLevels = _mesa_max_texture_levels(ctx, target); GLint expectedSize; GLenum choose_format; @@ -2033,13 +2003,15 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, } /* For cube map, width must equal height */ - if (_mesa_is_cube_face(target) && width != height) { + if ((target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || + _mesa_is_cube_face(target)) && width != height) { reason = "width != height"; error = GL_INVALID_VALUE; goto error; } /* check image size against compression block size */ + /* XXX possibly move this into the _mesa_legal_texture_dimensions() func */ { gl_format texFormat = ctx->Driver.ChooseTextureFormat(ctx, target, proxy_format, @@ -2060,20 +2032,6 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, } } - /* check image sizes */ - if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, - proxy_format, choose_format, - choose_type, - width, height, depth, border)) { - /* See error comment above */ - if (target == proxyTarget) { - return PROXY_ERROR; - } - reason = "invalid width, height or format"; - error = GL_INVALID_OPERATION; - goto error; - } - /* check image size in bytes */ if (expectedSize != imageSize) { /* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...] @@ -2091,11 +2049,11 @@ compressed_texture_error_check(struct gl_context *ctx, GLint dimensions, goto error; } - return GL_NO_ERROR; + return GL_FALSE; error: _mesa_error(ctx, error, "glCompressedTexImage%dD(%s)", dimensions, reason); - return error; + return GL_TRUE; } @@ -2105,7 +2063,7 @@ error: * * \param ctx GL context. * \param dimensions texture image dimensions (must be 1, 2 or 3). - * \param target texture target given by the user. + * \param target texture target given by the user (already validated) * \param level image level given by the user. * \param xoffset sub-image x offset given by the user. * \param yoffset sub-image y offset given by the user. @@ -2131,8 +2089,8 @@ subtexture_error_check( struct gl_context *ctx, GLuint dimensions, { GLenum err; - /* Basic level check */ - if (level < 0 || level >= MAX_TEXTURE_LEVELS) { + /* level check */ + if (level < 0 || level >= _mesa_max_texture_levels(ctx, target)) { _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level); return GL_TRUE; } @@ -2306,9 +2264,6 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions, GLenum target, GLint level, GLint internalFormat, GLint width, GLint height, GLint border ) { - const GLenum proxyTarget = _mesa_get_proxy_target(target); - const GLenum type = GL_FLOAT; - GLboolean sizeOK; GLint baseFormat; /* check target */ @@ -2318,8 +2273,8 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions, return GL_TRUE; } - /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ - if (level < 0 || level >= MAX_TEXTURE_LEVELS) { + /* level check */ + if (level < 0 || level >= _mesa_max_texture_levels(ctx, target)) { _mesa_error(ctx, GL_INVALID_VALUE, "glCopyTexImage%dD(level=%d)", dimensions, level); return GL_TRUE; @@ -2403,25 +2358,10 @@ copytexture_error_check( struct gl_context *ctx, GLuint dimensions, } } - /* Do size, level checking */ - sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) - ? (width == height) : 1; - - sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, - internalFormat, baseFormat, - type, width, height, - 1, border); - - if (!sizeOK) { - if (dimensions == 1) { - _mesa_error(ctx, GL_INVALID_VALUE, - "glCopyTexImage1D(width=%d)", width); - } - else { - ASSERT(dimensions == 2); - _mesa_error(ctx, GL_INVALID_VALUE, - "glCopyTexImage2D(width=%d, height=%d)", width, height); - } + if ((target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || + _mesa_is_cube_face(target)) && width != height) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glTexImage2D(cube width != height)"); return GL_TRUE; } @@ -2497,7 +2437,7 @@ copytexsubimage_error_check1( struct gl_context *ctx, GLuint dimensions, } /* Check level */ - if (level < 0 || level >= MAX_TEXTURE_LEVELS) { + if (level < 0 || level >= _mesa_max_texture_levels(ctx, target)) { _mesa_error(ctx, GL_INVALID_VALUE, "glCopyTexSubImage%dD(level=%d)", dimensions, level); return GL_TRUE; @@ -2901,9 +2841,11 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, GLsizei imageSize, const GLvoid *pixels) { const char *func = compressed ? "glCompressedTexImage" : "glTexImage"; - GLenum error; struct gl_pixelstore_attrib unpack_no_border; const struct gl_pixelstore_attrib *unpack = &ctx->Unpack; + struct gl_texture_object *texObj; + gl_format texFormat; + GLboolean dimensionsOK, sizeOK; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -2937,22 +2879,23 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, /* general error checking */ if (compressed) { - error = compressed_texture_error_check(ctx, dims, target, level, - internalFormat, - width, height, depth, - border, imageSize); + if (compressed_texture_error_check(ctx, dims, target, level, + internalFormat, + width, height, depth, + border, imageSize)) + return; } else { - error = texture_error_check(ctx, dims, target, level, internalFormat, - format, type, width, height, depth, border); + if (texture_error_check(ctx, dims, target, level, internalFormat, + format, type, width, height, depth, border)) + return; } -#if FEATURE_ES /* Here we convert a cpal compressed image into a regular glTexImage2D * call by decompressing the texture. If we really want to support cpal * textures in any driver this would have to be changed. */ - if (compressed && !error && dims == 2) { + if (ctx->API == API_OPENGLES && compressed && dims == 2) { switch (internalFormat) { case GL_PALETTE4_RGB8_OES: case GL_PALETTE4_RGBA8_OES: @@ -2969,50 +2912,55 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, return; } } -#endif + + texObj = _mesa_get_current_tex_object(ctx, target); + assert(texObj); + + texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, + internalFormat, format, type); + assert(texFormat != MESA_FORMAT_NONE); + + /* check that width, height, depth are legal for the mipmap level */ + dimensionsOK = _mesa_legal_texture_dimensions(ctx, target, level, width, + height, depth, border); + + /* check that the texture won't take too much memory, etc */ + sizeOK = ctx->Driver.TestProxyTexImage(ctx, _mesa_get_proxy_target(target), + level, texFormat, + width, height, depth, border); if (_mesa_is_proxy_texture(target)) { /* Proxy texture: just clear or set state depending on error checking */ struct gl_texture_image *texImage = get_proxy_tex_image(ctx, target, level); - gl_format texFormat = MESA_FORMAT_NONE; - if (!error) { - /* No parameter errors. Choose a texture format and see if we - * can really allocate the texture. - */ - struct gl_texture_object *texObj = - _mesa_get_current_tex_object(ctx, target); - texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, - internalFormat, format, type); - if (!legal_texture_size(ctx, texFormat, width, height, depth)) { - error = PROXY_ERROR; - } - } + if (!texImage) + return; /* GL_OUT_OF_MEMORY already recorded */ - if (error == PROXY_ERROR) { - /* image too large, etc. Clear all proxy texture image parameters. */ - if (texImage) - clear_teximage_fields(texImage); - } - else if (error == GL_FALSE) { - /* no error: store the teximage parameters */ - if (texImage) - _mesa_init_teximage_fields(ctx, texImage, width, height, depth, - border, internalFormat, texFormat); + if (dimensionsOK && sizeOK) { + _mesa_init_teximage_fields(ctx, texImage, width, height, depth, + border, internalFormat, texFormat); } else { - /* other, regular error (was already recorded) */ + clear_teximage_fields(texImage); } } else { /* non-proxy target */ const GLuint face = _mesa_tex_target_to_face(target); - struct gl_texture_object *texObj; struct gl_texture_image *texImage; - if (error) { - return; /* error was recorded */ + if (!dimensionsOK) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glTexImage%uD(invalid width or height or depth)", + dims); + return; + } + + if (!sizeOK) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, + "glTexImage%uD(image too large)", dims); + return; } /* Allow a hardware driver to just strip out the border, to provide @@ -3029,8 +2977,6 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, if (ctx->NewState & _NEW_PIXEL) _mesa_update_state(ctx); - texObj = _mesa_get_current_tex_object(ctx, target); - _mesa_lock_texture(ctx, texObj); { texImage = _mesa_get_tex_image(ctx, texObj, target, level); @@ -3039,38 +2985,27 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims); } else { - gl_format texFormat; - ctx->Driver.FreeTextureImageBuffer(ctx, texImage); - texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, - internalFormat, format, - type); - - if (legal_texture_size(ctx, texFormat, width, height, depth)) { - _mesa_init_teximage_fields(ctx, texImage, - width, height, depth, - border, internalFormat, texFormat); - - /* Give the texture to the driver. <pixels> may be null. */ - if (compressed) { - ctx->Driver.CompressedTexImage(ctx, dims, texImage, - imageSize, pixels); - } - else { - ctx->Driver.TexImage(ctx, dims, texImage, format, - type, pixels, unpack); - } - - check_gen_mipmap(ctx, target, texObj, level); - - _mesa_update_fbo_texture(ctx, texObj, face, level); + _mesa_init_teximage_fields(ctx, texImage, + width, height, depth, + border, internalFormat, texFormat); - _mesa_dirty_texobj(ctx, texObj, GL_TRUE); + /* Give the texture to the driver. <pixels> may be null. */ + if (compressed) { + ctx->Driver.CompressedTexImage(ctx, dims, texImage, + imageSize, pixels); } else { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims); + ctx->Driver.TexImage(ctx, dims, texImage, format, + type, pixels, unpack); } + + check_gen_mipmap(ctx, target, texObj, level); + + _mesa_update_fbo_texture(ctx, texObj, face, level); + + _mesa_dirty_texobj(ctx, texObj, GL_TRUE); } } _mesa_unlock_texture(ctx, texObj); @@ -3078,6 +3013,7 @@ teximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, } + /* * Called from the API. Note that width includes the border. */ @@ -3343,6 +3279,7 @@ copyteximage(struct gl_context *ctx, GLuint dims, struct gl_texture_object *texObj; struct gl_texture_image *texImage; const GLuint face = _mesa_tex_target_to_face(target); + gl_format texFormat; ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); @@ -3360,7 +3297,27 @@ copyteximage(struct gl_context *ctx, GLuint dims, width, height, border)) return; + if (!_mesa_legal_texture_dimensions(ctx, target, level, width, height, + 1, border)) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glCopyTexImage%uD(invalid width or height)", dims); + return; + } + texObj = _mesa_get_current_tex_object(ctx, target); + assert(texObj); + + texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, + internalFormat, GL_NONE, GL_NONE); + assert(texFormat != MESA_FORMAT_NONE); + + if (!ctx->Driver.TestProxyTexImage(ctx, _mesa_get_proxy_target(target), + level, texFormat, + width, height, 1, border)) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, + "glCopyTexImage%uD(image too large)", dims); + return; + } if (border && ctx->Const.StripTextureBorder) { x += border; @@ -3380,45 +3337,33 @@ copyteximage(struct gl_context *ctx, GLuint dims, _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); } else { - /* choose actual hw format */ - gl_format texFormat = _mesa_choose_texture_format(ctx, texObj, - target, level, - internalFormat, - GL_NONE, GL_NONE); - - if (legal_texture_size(ctx, texFormat, width, height, 1)) { - GLint srcX = x, srcY = y, dstX = 0, dstY = 0, dstZ = 0; + GLint srcX = x, srcY = y, dstX = 0, dstY = 0, dstZ = 0; - /* Free old texture image */ - ctx->Driver.FreeTextureImageBuffer(ctx, texImage); + /* Free old texture image */ + ctx->Driver.FreeTextureImageBuffer(ctx, texImage); - _mesa_init_teximage_fields(ctx, texImage, width, height, 1, - border, internalFormat, texFormat); + _mesa_init_teximage_fields(ctx, texImage, width, height, 1, + border, internalFormat, texFormat); - /* Allocate texture memory (no pixel data yet) */ - ctx->Driver.TexImage(ctx, dims, texImage, - GL_NONE, GL_NONE, - NULL, &ctx->Unpack); + /* Allocate texture memory (no pixel data yet) */ + ctx->Driver.TexImage(ctx, dims, texImage, + GL_NONE, GL_NONE, + NULL, &ctx->Unpack); - if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY, - &width, &height)) { - struct gl_renderbuffer *srcRb = - get_copy_tex_image_source(ctx, texImage->TexFormat); + if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY, + &width, &height)) { + struct gl_renderbuffer *srcRb = + get_copy_tex_image_source(ctx, texImage->TexFormat); - ctx->Driver.CopyTexSubImage(ctx, dims, texImage, dstX, dstY, dstZ, - srcRb, srcX, srcY, width, height); - } + ctx->Driver.CopyTexSubImage(ctx, dims, texImage, dstX, dstY, dstZ, + srcRb, srcX, srcY, width, height); + } - check_gen_mipmap(ctx, target, texObj, level); + check_gen_mipmap(ctx, target, texObj, level); - _mesa_update_fbo_texture(ctx, texObj, face, level); + _mesa_update_fbo_texture(ctx, texObj, face, level); - _mesa_dirty_texobj(ctx, texObj, GL_TRUE); - } - else { - /* probably too large of image */ - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); - } + _mesa_dirty_texobj(ctx, texObj, GL_TRUE); } } _mesa_unlock_texture(ctx, texObj); diff --git a/mesalib/src/mesa/main/teximage.h b/mesalib/src/mesa/main/teximage.h index 36fd1c2bc..c7c32d8ac 100644 --- a/mesalib/src/mesa/main/teximage.h +++ b/mesalib/src/mesa/main/teximage.h @@ -128,8 +128,8 @@ _mesa_max_texture_levels(struct gl_context *ctx, GLenum target); extern GLboolean _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, - GLint internalFormat, GLenum format, GLenum type, - GLint width, GLint height, GLint depth, GLint border); + gl_format format, + GLint width, GLint height, GLint depth, GLint border); extern GLuint @@ -142,6 +142,11 @@ extern GLenum _mesa_es_error_check_format_and_type(GLenum format, GLenum type, unsigned dimensions); +extern GLboolean +_mesa_legal_texture_dimensions(struct gl_context *ctx, GLenum target, + GLint level, GLint width, GLint height, + GLint depth, GLint border); + /** * Lock a texture for updating. See also _mesa_lock_context_textures(). */ diff --git a/mesalib/src/mesa/main/texobj.h b/mesalib/src/mesa/main/texobj.h index a6f1d3a14..f22c58cad 100644 --- a/mesalib/src/mesa/main/texobj.h +++ b/mesalib/src/mesa/main/texobj.h @@ -85,7 +85,13 @@ _mesa_reference_texobj(struct gl_texture_object **ptr, static inline GLuint _mesa_num_tex_faces(GLenum target) { - return target == GL_TEXTURE_CUBE_MAP ? 6 : 1; + switch (target) { + case GL_TEXTURE_CUBE_MAP: + case GL_PROXY_TEXTURE_CUBE_MAP: + return 6; + default: + return 1; + } } diff --git a/mesalib/src/mesa/main/texstorage.c b/mesalib/src/mesa/main/texstorage.c index f8a939794..ca02ef301 100644 --- a/mesalib/src/mesa/main/texstorage.c +++ b/mesalib/src/mesa/main/texstorage.c @@ -118,42 +118,42 @@ next_mipmap_level_size(GLenum target, } -/** - * Do actual memory allocation for glTexStorage1/2/3D(). - */ -static void -setup_texstorage(struct gl_context *ctx, - struct gl_texture_object *texObj, - GLuint dims, - GLsizei levels, GLenum internalFormat, - GLsizei width, GLsizei height, GLsizei depth) +/** Helper to get a particular texture image in a texture object */ +static struct gl_texture_image * +get_tex_image(struct gl_context *ctx, + struct gl_texture_object *texObj, + GLuint face, GLuint level) +{ + const GLenum faceTarget = + (texObj->Target == GL_TEXTURE_CUBE_MAP || + texObj->Target == GL_PROXY_TEXTURE_CUBE_MAP) + ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + face : texObj->Target; + return _mesa_get_tex_image(ctx, texObj, faceTarget, level); +} + + + +static GLboolean +initialize_texture_fields(struct gl_context *ctx, + struct gl_texture_object *texObj, + GLint levels, + GLsizei width, GLsizei height, GLsizei depth, + GLenum internalFormat, gl_format texFormat) { const GLenum target = texObj->Target; const GLuint numFaces = _mesa_num_tex_faces(target); - gl_format texFormat; GLint level, levelWidth = width, levelHeight = height, levelDepth = depth; GLuint face; - assert(levels > 0); - assert(width > 0); - assert(height > 0); - assert(depth > 0); - - texFormat = _mesa_choose_texture_format(ctx, texObj, target, 0, - internalFormat, GL_NONE, GL_NONE); - /* Set up all the texture object's gl_texture_images */ for (level = 0; level < levels; level++) { for (face = 0; face < numFaces; face++) { - const GLenum faceTarget = - (target == GL_TEXTURE_CUBE_MAP) - ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + face : target; struct gl_texture_image *texImage = - _mesa_get_tex_image(ctx, texObj, faceTarget, level); + get_tex_image(ctx, texObj, face, level); if (!texImage) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); - return; + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage"); + return GL_FALSE; } _mesa_init_teximage_fields(ctx, texImage, @@ -163,49 +163,18 @@ setup_texstorage(struct gl_context *ctx, next_mipmap_level_size(target, &levelWidth, &levelHeight, &levelDepth); } - - assert(levelWidth > 0); - assert(levelHeight > 0); - assert(levelDepth > 0); - - if (!_mesa_is_proxy_texture(texObj->Target)) { - /* Do actual texture memory allocation */ - if (!ctx->Driver.AllocTextureStorage(ctx, texObj, levels, - width, height, depth)) { - /* Reset the texture images' info to zeros. - * Strictly speaking, we probably don't have to do this since - * generating GL_OUT_OF_MEMORY can leave things in an undefined - * state but this puts things in a consistent state. - */ - for (level = 0; level < levels; level++) { - for (face = 0; face < numFaces; face++) { - struct gl_texture_image *texImage = texObj->Image[face][level]; - if (texImage) { - _mesa_init_teximage_fields(ctx, texImage, - 0, 0, 0, 0, - GL_NONE, MESA_FORMAT_NONE); - } - } - } - - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage%uD", dims); - - return; - } - - /* Only set this field for non-proxy texture objects */ - texObj->Immutable = GL_TRUE; - } + return GL_TRUE; } /** * Clear all fields of texture object to zeros. Used for proxy texture tests. + * Used for proxy texture tests (and to clean up when a texture memory + * allocation fails). */ static void -clear_image_fields(struct gl_context *ctx, - GLuint dims, - struct gl_texture_object *texObj) +clear_texture_fields(struct gl_context *ctx, + struct gl_texture_object *texObj) { const GLenum target = texObj->Target; const GLuint numFaces = _mesa_num_tex_faces(target); @@ -214,19 +183,17 @@ clear_image_fields(struct gl_context *ctx, for (level = 0; level < Elements(texObj->Image[0]); level++) { for (face = 0; face < numFaces; face++) { - const GLenum faceTarget = - (target == GL_TEXTURE_CUBE_MAP) - ? GL_TEXTURE_CUBE_MAP_POSITIVE_X + face : target; struct gl_texture_image *texImage = - _mesa_get_tex_image(ctx, texObj, faceTarget, level); + get_tex_image(ctx, texObj, face, level); if (!texImage) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage%uD", dims); + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage"); return; } _mesa_init_teximage_fields(ctx, texImage, - 0, 0, 0, 0, GL_NONE, MESA_FORMAT_NONE); + 0, 0, 0, 0, /* w, h, d, border */ + GL_NONE, MESA_FORMAT_NONE); } } } @@ -301,13 +268,6 @@ tex_storage_error_check(struct gl_context *ctx, GLuint dims, GLenum target, return GL_TRUE; } - /* levels check */ - if (levels < 1 || height < 1 || depth < 1) { - _mesa_error(ctx, GL_INVALID_VALUE, "glTexStorage%uD(levels < 1)", - dims); - return GL_TRUE; - } - /* target check */ if (!legal_texobj_target(ctx, dims, target)) { _mesa_error(ctx, GL_INVALID_ENUM, @@ -316,7 +276,14 @@ tex_storage_error_check(struct gl_context *ctx, GLuint dims, GLenum target, return GL_TRUE; } - /* check levels against maximum */ + /* levels check */ + if (levels < 1) { + _mesa_error(ctx, GL_INVALID_VALUE, "glTexStorage%uD(levels < 1)", + dims); + return GL_TRUE; + } + + /* check levels against maximum (note different error than above) */ if (levels > _mesa_max_texture_levels(ctx, target)) { _mesa_error(ctx, GL_INVALID_OPERATION, "glTexStorage%uD(levels too large)", dims); @@ -359,37 +326,76 @@ texstorage(GLuint dims, GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth) { struct gl_texture_object *texObj; - GLboolean sizeOK; - GLenum proxyTarget = _mesa_get_proxy_target(target); + GLboolean sizeOK, dimensionsOK; + gl_format texFormat; GET_CURRENT_CONTEXT(ctx); - texObj = _mesa_get_current_tex_object(ctx, target); - if (tex_storage_error_check(ctx, dims, target, levels, internalformat, width, height, depth)) { return; /* error was recorded */ } - sizeOK = ctx->Driver.TestProxyTexImage(ctx, proxyTarget, 0, - internalformat, GL_NONE, GL_NONE, + texObj = _mesa_get_current_tex_object(ctx, target); + assert(texObj); + + texFormat = _mesa_choose_texture_format(ctx, texObj, target, 0, + internalformat, GL_NONE, GL_NONE); + assert(texFormat != MESA_FORMAT_NONE); + + /* check that width, height, depth are legal for the mipmap level */ + dimensionsOK = _mesa_legal_texture_dimensions(ctx, target, 0, + width, height, depth, 0); + + sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 0, texFormat, width, height, depth, 0); - if (!sizeOK) { - if (_mesa_is_proxy_texture(texObj->Target)) { - /* clear all image fields for [levels] */ - clear_image_fields(ctx, dims, texObj); + if (_mesa_is_proxy_texture(texObj->Target)) { + if (dimensionsOK && sizeOK) { + initialize_texture_fields(ctx, texObj, levels, width, height, depth, + internalformat, texFormat); } else { - _mesa_error(ctx, GL_INVALID_VALUE, - "glTexStorage%uD(invalid width, height or depth)", - dims); - return; + /* clear all image fields for [levels] */ + clear_texture_fields(ctx, texObj); } } else { - setup_texstorage(ctx, texObj, dims, levels, internalformat, - width, height, depth); + if (!dimensionsOK) { + _mesa_error(ctx, GL_INVALID_VALUE, + "glTexStorage%uD(invalid width, height or depth)", dims); + return; + } + + if (!sizeOK) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, + "glTexStorage%uD(texture too large)", dims); + } + + assert(levels > 0); + assert(width > 0); + assert(height > 0); + assert(depth > 0); + + if (!initialize_texture_fields(ctx, texObj, levels, width, height, depth, + internalformat, texFormat)) { + return; + } + + /* Do actual texture memory allocation */ + if (!ctx->Driver.AllocTextureStorage(ctx, texObj, levels, + width, height, depth)) { + /* Reset the texture images' info to zeros. + * Strictly speaking, we probably don't have to do this since + * generating GL_OUT_OF_MEMORY can leave things in an undefined + * state but this puts things in a consistent state. + */ + clear_texture_fields(ctx, texObj); + _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage%uD", dims); + return; + } + + texObj->Immutable = GL_TRUE; } } diff --git a/mesalib/src/mesa/main/uniforms.h b/mesalib/src/mesa/main/uniforms.h index bb0552476..e84964c6f 100644 --- a/mesalib/src/mesa/main/uniforms.h +++ b/mesalib/src/mesa/main/uniforms.h @@ -244,8 +244,6 @@ struct gl_builtin_uniform_desc { unsigned int num_elements; }; -extern const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[]; - /** * \name GLSL uniform arrays and structs require special handling. * diff --git a/mesalib/src/mesa/main/version.c b/mesalib/src/mesa/main/version.c index 7b67765a2..7ee662714 100644 --- a/mesalib/src/mesa/main/version.c +++ b/mesalib/src/mesa/main/version.c @@ -55,6 +55,27 @@ override_version(struct gl_context *ctx) } /** + * Builds the MESA version string. + */ +static void +create_version_string(struct gl_context *ctx, const char *prefix) +{ + static const int max = 100; + + ctx->VersionString = malloc(max); + if (ctx->VersionString) { + _mesa_snprintf(ctx->VersionString, max, + "%s%u.%u Mesa " MESA_VERSION_STRING +#ifdef MESA_GIT_SHA1 + " (" MESA_GIT_SHA1 ")" +#endif + , + prefix, + ctx->Version / 10, ctx->Version % 10); + } +} + +/** * Override the context's GLSL version if the environment variable * MESA_GLSL_VERSION_OVERRIDE is set. Valid values for * MESA_GLSL_VERSION_OVERRIDE are integers, such as "130". @@ -85,7 +106,6 @@ static void compute_version(struct gl_context *ctx) { GLuint major, minor; - static const int max = 100; const GLboolean ver_1_3 = (ctx->Extensions.ARB_texture_border_clamp && ctx->Extensions.ARB_texture_cube_map && @@ -224,23 +244,12 @@ compute_version(struct gl_context *ctx) override_version(ctx); - ctx->VersionString = malloc(max); - if (ctx->VersionString) { - _mesa_snprintf(ctx->VersionString, max, - "%u.%u Mesa " MESA_VERSION_STRING -#ifdef MESA_GIT_SHA1 - " (" MESA_GIT_SHA1 ")" -#endif - , - ctx->Version / 10, ctx->Version % 10); - } + create_version_string(ctx, ""); } static void compute_version_es1(struct gl_context *ctx) { - static const int max = 100; - /* OpenGL ES 1.0 is derived from OpenGL 1.3 */ const GLboolean ver_1_0 = (ctx->Extensions.ARB_texture_env_combine && ctx->Extensions.ARB_texture_env_dot3); @@ -256,23 +265,12 @@ compute_version_es1(struct gl_context *ctx) _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support."); } - ctx->VersionString = malloc(max); - if (ctx->VersionString) { - _mesa_snprintf(ctx->VersionString, max, - "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING -#ifdef MESA_GIT_SHA1 - " (" MESA_GIT_SHA1 ")" -#endif - , - ctx->Version % 10); - } + create_version_string(ctx, "OpenGL ES-CM "); } static void compute_version_es2(struct gl_context *ctx) { - static const int max = 100; - /* OpenGL ES 2.0 is derived from OpenGL 2.0 */ const GLboolean ver_2_0 = (ctx->Extensions.ARB_texture_cube_map && ctx->Extensions.EXT_blend_color && @@ -289,15 +287,7 @@ compute_version_es2(struct gl_context *ctx) _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support."); } - ctx->VersionString = malloc(max); - if (ctx->VersionString) { - _mesa_snprintf(ctx->VersionString, max, - "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING -#ifdef MESA_GIT_SHA1 - " (" MESA_GIT_SHA1 ")" -#endif - ); - } + create_version_string(ctx, "OpenGL ES "); } /** diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c index 518b680f0..4f4fe77da 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_texture.c +++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c @@ -73,19 +73,32 @@ gl_target_to_pipe(GLenum target) { switch (target) { case GL_TEXTURE_1D: + case GL_PROXY_TEXTURE_1D: return PIPE_TEXTURE_1D; case GL_TEXTURE_2D: + case GL_PROXY_TEXTURE_2D: case GL_TEXTURE_EXTERNAL_OES: return PIPE_TEXTURE_2D; case GL_TEXTURE_RECTANGLE_NV: + case GL_PROXY_TEXTURE_RECTANGLE_NV: return PIPE_TEXTURE_RECT; case GL_TEXTURE_3D: + case GL_PROXY_TEXTURE_3D: return PIPE_TEXTURE_3D; case GL_TEXTURE_CUBE_MAP_ARB: + case GL_PROXY_TEXTURE_CUBE_MAP_ARB: + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return PIPE_TEXTURE_CUBE; case GL_TEXTURE_1D_ARRAY_EXT: + case GL_PROXY_TEXTURE_1D_ARRAY_EXT: return PIPE_TEXTURE_1D_ARRAY; case GL_TEXTURE_2D_ARRAY_EXT: + case GL_PROXY_TEXTURE_2D_ARRAY_EXT: return PIPE_TEXTURE_2D_ARRAY; case GL_TEXTURE_BUFFER: return PIPE_BUFFER; @@ -1357,6 +1370,52 @@ st_AllocTextureStorage(struct gl_context *ctx, } +static GLboolean +st_TestProxyTexImage(struct gl_context *ctx, GLenum target, + GLint level, gl_format format, + GLint width, GLint height, + GLint depth, GLint border) +{ + struct st_context *st = st_context(ctx); + struct pipe_context *pipe = st->pipe; + + if (pipe->screen->can_create_resource) { + /* Ask the gallium driver if the texture is too large */ + struct gl_texture_object *texObj = + _mesa_get_current_tex_object(ctx, target); + struct pipe_resource pt; + + /* Setup the pipe_resource object + */ + memset(&pt, 0, sizeof(pt)); + + pt.target = gl_target_to_pipe(target); + pt.format = st_mesa_format_to_pipe_format(format); + + st_gl_texture_dims_to_pipe_dims(target, + width, height, depth, + &pt.width0, &pt.height0, + &pt.depth0, &pt.array_size); + + if (level == 0 && (texObj->Sampler.MinFilter == GL_LINEAR || + texObj->Sampler.MinFilter == GL_NEAREST)) { + /* assume just one mipmap level */ + pt.last_level = 0; + } + else { + /* assume a full set of mipmaps */ + pt.last_level = _mesa_logbase2(MAX3(width, height, depth)); + } + + return pipe->screen->can_create_resource(pipe->screen, &pt); + } + else { + /* Use core Mesa fallback */ + return _mesa_test_proxy_teximage(ctx, target, level, format, + width, height, depth, border); + } +} + void st_init_texture_functions(struct dd_function_table *functions) @@ -1384,7 +1443,7 @@ st_init_texture_functions(struct dd_function_table *functions) functions->UnmapTextureImage = st_UnmapTextureImage; /* XXX Temporary until we can query pipe's texture sizes */ - functions->TestProxyTexImage = _mesa_test_proxy_teximage; + functions->TestProxyTexImage = st_TestProxyTexImage; functions->AllocTextureStorage = st_AllocTextureStorage; } diff --git a/mesalib/src/mesa/state_tracker/st_texture.c b/mesalib/src/mesa/state_tracker/st_texture.c index 9627a6117..3670683b5 100644 --- a/mesalib/src/mesa/state_tracker/st_texture.c +++ b/mesalib/src/mesa/state_tracker/st_texture.c @@ -117,6 +117,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, { switch (texture) { case GL_TEXTURE_1D: + case GL_PROXY_TEXTURE_1D: assert(heightIn == 1); assert(depthIn == 1); *widthOut = widthIn; @@ -125,6 +126,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 1; break; case GL_TEXTURE_1D_ARRAY: + case GL_PROXY_TEXTURE_1D_ARRAY: assert(depthIn == 1); *widthOut = widthIn; *heightOut = 1; @@ -132,7 +134,9 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = heightIn; break; case GL_TEXTURE_2D: + case GL_PROXY_TEXTURE_2D: case GL_TEXTURE_RECTANGLE: + case GL_PROXY_TEXTURE_RECTANGLE: case GL_TEXTURE_EXTERNAL_OES: assert(depthIn == 1); *widthOut = widthIn; @@ -141,6 +145,13 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 1; break; case GL_TEXTURE_CUBE_MAP: + case GL_PROXY_TEXTURE_CUBE_MAP: + case GL_TEXTURE_CUBE_MAP_POSITIVE_X: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: + case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: + case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: assert(depthIn == 1); *widthOut = widthIn; *heightOut = heightIn; @@ -148,6 +159,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, *layersOut = 6; break; case GL_TEXTURE_2D_ARRAY: + case GL_PROXY_TEXTURE_2D_ARRAY: *widthOut = widthIn; *heightOut = heightIn; *depthOut = 1; @@ -157,6 +169,7 @@ st_gl_texture_dims_to_pipe_dims(GLenum texture, assert(0 && "Unexpected texture in st_gl_texture_dims_to_pipe_dims()"); /* fall-through */ case GL_TEXTURE_3D: + case GL_PROXY_TEXTURE_3D: *widthOut = widthIn; *heightOut = heightIn; *depthOut = depthIn; |