Compare commits
36 Commits
mesa-13.0.
...
mesa_7_2_r
Author | SHA1 | Date | |
---|---|---|---|
|
419353dc2f | ||
|
38d3b2262b | ||
|
4db2a7f36c | ||
|
1145042fd2 | ||
|
772131280a | ||
|
ee913c0fcc | ||
|
cd1804c43a | ||
|
253784d45e | ||
|
463d19d477 | ||
|
6e4fd90ca5 | ||
|
06188c0c5c | ||
|
dec9097647 | ||
|
e234339dba | ||
|
bb09d23e92 | ||
|
1ffbcddb6f | ||
|
33cf8f5c06 | ||
|
7b8d878bed | ||
|
86ae34fbb4 | ||
|
16f3461fd6 | ||
|
0ac8886b51 | ||
|
1729d37223 | ||
|
81edef6f9f | ||
|
e040e18c7b | ||
|
14d186644b | ||
|
e4535e4d5e | ||
|
a008813890 | ||
|
da50dc7bb3 | ||
|
7f628d9cbc | ||
|
b2ffd0be03 | ||
|
912b16c689 | ||
|
6d9b25e522 | ||
|
31bad23f0f | ||
|
29b9b25e72 | ||
|
e794f496c6 | ||
|
68067c66d3 | ||
|
ad5474e995 |
8
Makefile
8
Makefile
@@ -174,10 +174,10 @@ ultrix-gcc:
|
||||
|
||||
# Rules for making release tarballs
|
||||
|
||||
DIRECTORY = Mesa-7.1-rc4
|
||||
LIB_NAME = MesaLib-7.1-rc4
|
||||
DEMO_NAME = MesaDemos-7.1-rc4
|
||||
GLUT_NAME = MesaGLUT-7.1-rc4
|
||||
DIRECTORY = Mesa-7.2-rc1
|
||||
LIB_NAME = MesaLib-7.2-rc1
|
||||
DEMO_NAME = MesaDemos-7.2-rc1
|
||||
GLUT_NAME = MesaGLUT-7.2-rc1
|
||||
|
||||
MAIN_FILES = \
|
||||
$(DIRECTORY)/Makefile* \
|
||||
|
@@ -86,7 +86,6 @@ APP_LIB_DEPS = $(EXTRA_LIB_PATH) @APP_LIB_DEPS@
|
||||
DRI_LIB_DEPS = $(EXTRA_LIB_PATH) @DRI_LIB_DEPS@
|
||||
LIBDRM_CFLAGS = @LIBDRM_CFLAGS@
|
||||
LIBDRM_LIB = @LIBDRM_LIBS@
|
||||
DRI2PROTO_CFLAGS = @DRI2PROTO_CFLAGS@
|
||||
EXPAT_INCLUDES = @EXPAT_INCLUDES@
|
||||
|
||||
# Autoconf directories
|
||||
|
@@ -9,7 +9,7 @@ CONFIG_NAME = default
|
||||
|
||||
# Version info
|
||||
MESA_MAJOR=7
|
||||
MESA_MINOR=1
|
||||
MESA_MINOR=2
|
||||
MESA_TINY=0
|
||||
MESA_VERSION = $(MESA_MAJOR).$(MESA_MINOR).$(MESA_TINY)
|
||||
|
||||
|
@@ -23,7 +23,6 @@ AC_CANONICAL_HOST
|
||||
|
||||
dnl Versions for external dependencies
|
||||
LIBDRM_REQUIRED=2.3.1
|
||||
DRI2PROTO_REQUIRED=1.1
|
||||
|
||||
dnl Check for progs
|
||||
AC_PROG_CPP
|
||||
@@ -531,7 +530,6 @@ dri)
|
||||
|
||||
# Check for libdrm
|
||||
PKG_CHECK_MODULES([LIBDRM], [libdrm >= $LIBDRM_REQUIRED])
|
||||
PKG_CHECK_MODULES([DRI2PROTO], [dri2proto >= $DRI2PROTO_REQUIRED])
|
||||
|
||||
# find the DRI deps for libGL
|
||||
if test "$x11_pkgconfig" = yes; then
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
<BODY>
|
||||
|
||||
<H1>Mesa Cell Driver</H1>
|
||||
<H1>Mesa/Gallium Cell Driver</H1>
|
||||
|
||||
<p>
|
||||
The Mesa
|
||||
@@ -23,18 +23,19 @@ Two phases are planned.
|
||||
First, to implement the framework for parallel rasterization using the Cell
|
||||
SPEs, including texture mapping.
|
||||
Second, to implement a full-featured OpenGL driver with support for GLSL, etc.
|
||||
The second phase is now underway.
|
||||
</p>
|
||||
|
||||
|
||||
<H2>Source Code</H2>
|
||||
|
||||
<p>
|
||||
The Cell driver source code is on the <code>gallium-0.1</code> branch of the
|
||||
git repository.
|
||||
The latest Cell driver source code is on the <code>gallium-0.2</code> branch
|
||||
of the Mesa git repository.
|
||||
After you've cloned the repository, check out the branch with:
|
||||
</p>
|
||||
<pre>
|
||||
git-checkout -b gallium-0.1 origin/gallium-0.1
|
||||
git-checkout -b gallium-0.2 origin/gallium-0.2
|
||||
</pre>
|
||||
<p>
|
||||
To build the driver you'll need the IBM Cell SDK (version 2.1 or 3.0).
|
||||
@@ -43,12 +44,13 @@ or the Cell Simulator (untested, though).
|
||||
</p>
|
||||
|
||||
<p>
|
||||
If using Cell SDK 3.0, first edit configs/linux-cell and add
|
||||
<code>-DSPU_MAIN_PARAM_LONG_LONG</code> to the SPU_CFLAGS.
|
||||
If using Cell SDK 2.1, see the configs/linux-cell file for some
|
||||
special changes.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To compile the code, run <code>make linux-cell</code>.
|
||||
To build in debug mode, run <code>make linux-cell-debug</code>.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
@@ -60,7 +62,7 @@ directory that contains <code>libGL.so</code>.
|
||||
Verify that the Cell driver is being used by running <code>glxinfo</code>
|
||||
and looking for:
|
||||
<pre>
|
||||
OpenGL renderer string: Gallium 0.1, Cell on Xlib
|
||||
OpenGL renderer string: Gallium 0.2, Cell on Xlib
|
||||
</pre>
|
||||
|
||||
|
||||
@@ -77,21 +79,49 @@ SPU local store as needed.
|
||||
Similarly, textures are tiled and brought into local store as needed.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
More recently, vertex transformation has been parallelized across the SPUs
|
||||
as well.
|
||||
</p>
|
||||
|
||||
|
||||
<H2>Status</H2>
|
||||
|
||||
<p>
|
||||
As of February 2008 the driver supports smooth/flat shaded triangle rendering
|
||||
As of September 2008, the driver supports smooth/flat shaded triangle rendering
|
||||
with Z testing and simple texture mapping.
|
||||
Simple demos like gears run successfully.
|
||||
To test texture mapping, try progs/demos/texcyl (press right mouse button for
|
||||
rendering options).
|
||||
</p>
|
||||
<p>
|
||||
Runtime/dynamic code generation is being done for per-fragment
|
||||
operations (Z test, blend, etc) and for fragment programs (though only a
|
||||
few opcodes are implemented now).
|
||||
</p>
|
||||
<p>
|
||||
In general, however, the driver is rather slow because all vertex
|
||||
transformation is being done by an interpreter running on the PPU.
|
||||
Programs with many vertices or complex vertex shaders will run especially
|
||||
slow.
|
||||
This will be addressed in the future.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<H2>Debug Options</H2>
|
||||
|
||||
<p>
|
||||
The CELL_DEBUG env var can be set to a comma-separated list of one or
|
||||
more of the following debug options:
|
||||
</p>
|
||||
<ul>
|
||||
<li><b>checker</b> - use a different background clear color for each SPU.
|
||||
This lets you see which SPU is rendering which screen tiles.
|
||||
<li><b>sync</b> - wait/synchronize after each DMA transfer
|
||||
</ul>
|
||||
|
||||
<p>
|
||||
If the GALLIUM_NOCELL env var is set, the softpipe driver will be used
|
||||
intead of the Cell driver.
|
||||
This is useful for comparison/validation.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<H2>Contributing</H2>
|
||||
|
@@ -48,6 +48,7 @@ a:visited {
|
||||
<li><a href="lists.html" target="MainFrame">Mailing Lists</a>
|
||||
<li><a href="bugs.html" target="MainFrame">Bug Database</a>
|
||||
<li><a href="webmaster.html" target="MainFrame">Webmaster</a>
|
||||
<li><a href="http://dri.freedesktop.org/" target="MainFrame">Wiki</a>
|
||||
</ul>
|
||||
|
||||
<b>User Topics</b>
|
||||
|
@@ -9,7 +9,9 @@
|
||||
<H1>Downloading</H1>
|
||||
|
||||
<p>
|
||||
Last stable release: <b>7.0.4</b>
|
||||
Current stable release: <b>7.2</b>
|
||||
<br>
|
||||
Current development: Mesa git/master
|
||||
</p>
|
||||
|
||||
<p>
|
||||
|
@@ -22,9 +22,10 @@ for modern GPUs.
|
||||
|
||||
<p>
|
||||
Mesa ties into several other open-source projects: the
|
||||
<a href="http://dri.sf.net/" target="_parent">Direct Rendering Infrastructure</a>
|
||||
and <a href="http://x.org" target="_parent">X.org</a> to provide OpenGL
|
||||
support to users of X on Linux, FreeBSD and other operating systems.
|
||||
<a href="http://dri.freedesktop.org/" target="_parent">Direct Rendering
|
||||
Infrastructure</a> and <a href="http://x.org" target="_parent">X.org</a> to
|
||||
provide OpenGL support to users of X on Linux, FreeBSD and other operating
|
||||
systems.
|
||||
</p>
|
||||
|
||||
|
||||
|
@@ -9,7 +9,7 @@
|
||||
<H1>Mailing Lists</H1>
|
||||
|
||||
|
||||
<p>There are four Mesa mailing lists:
|
||||
<p>There are four Mesa 3D / DRI mailing lists:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
@@ -19,14 +19,14 @@ versions are sent to this list.
|
||||
</li>
|
||||
<br>
|
||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-users"
|
||||
target="_parent">mesa3d-users</a> - intended for users of the Mesa library.
|
||||
target="_parent">mesa3d-users</a> - intended for users of the Mesa and DRI.
|
||||
Newbie questions are appropriate, but please try the general OpenGL
|
||||
resources and Mesa documentation first.
|
||||
resources and Mesa/DRI documentation first.
|
||||
</li>
|
||||
<br>
|
||||
<li><a href="https://lists.sourceforge.net/lists/listinfo/mesa3d-dev"
|
||||
target="_parent">mesa3d-dev</a> - for discussion of Mesa development.
|
||||
Not for beginners.
|
||||
target="_parent">mesa3d-dev</a> - for discussion of Mesa and Direct Rendering
|
||||
Infrastructure development. Not for beginners.
|
||||
</li>
|
||||
<br>
|
||||
<li><a href="http://lists.freedesktop.org/mailman/listinfo/mesa-commit"
|
||||
@@ -37,6 +37,9 @@ Note: the old mesa3d-cvs list is no longer in use.
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>For mailing lists about Direct Rendering Modules (drm) in Linux/BSD
|
||||
kernels, see <a href="http://dri.freedesktop.org/wiki/MailingLists">wiki</a>.
|
||||
|
||||
<p>
|
||||
<b>Notice</b>: non-member posts to any of these lists will be automatically
|
||||
rejected.
|
||||
|
@@ -11,6 +11,23 @@
|
||||
<H1>News</H1>
|
||||
|
||||
|
||||
<h2>September 15, 2008</h2>
|
||||
<p>
|
||||
<a href="relnotes-7.2.html">Mesa 7.2</a> is released.
|
||||
This is stable, bug-fix release.
|
||||
</p>
|
||||
|
||||
|
||||
<h2>August 26, 2008</h2>
|
||||
<p>
|
||||
<a href="relnotes-7.1.html">Mesa 7.1</a> is released.
|
||||
This is a new development release.
|
||||
It should be relatively stable, but those especially concerned about
|
||||
stability should wait for the 7.2 release or use Mesa 7.0.4 (the
|
||||
previous stable release).
|
||||
</p>
|
||||
|
||||
|
||||
<h2>August 16, 2008</h2>
|
||||
<p>
|
||||
<a href="relnotes-7.0.4.html">Mesa 7.0.4</a> is released.
|
||||
|
@@ -8,28 +8,46 @@
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.1 Release Notes / May XX, 2008</H1>
|
||||
<H1>Mesa 7.1 Release Notes / August 26, 2008</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.1 is a new development release.
|
||||
There have been many internal code changes since Mesa 7.0.x.
|
||||
It should be relatively stable, but those who are especially concerned about
|
||||
stability should wait for Mesa 7.2.
|
||||
stability should wait for Mesa 7.2 or use Mesa 7.0.4 (the previous stable
|
||||
release).
|
||||
</p>
|
||||
</>
|
||||
Note that this version of Mesa does not use the GEM memory manager.
|
||||
The master branch of git uses GEM.
|
||||
</p>
|
||||
<p>
|
||||
DRM version 2.3.1 should be used with Mesa 7.1
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
TBD
|
||||
971c2fe6e6949dc5ba200a6f97a6dc81 MesaLib-7.1.tar.gz
|
||||
6bff7f532d16f90f944a400c8bd7074d MesaLib-7.1.tar.bz2
|
||||
d48224bf9d54c3da6776adb4869ba024 MesaLib-7.1.zip
|
||||
3de268420efca43e9a19ab506cdfc993 MesaDemos-7.1.tar.gz
|
||||
abfc9775e1462363af8ec160d1feb01f MesaDemos-7.1.tar.bz2
|
||||
f7b3623387c4036e9895cd9ac0dfad99 MesaDemos-7.1.zip
|
||||
fdf348f78cd09304b6ff801ef8acc8eb MesaGLUT-7.1.tar.gz
|
||||
f6d88a4eeb02e98c7e92f1c895d3c76b MesaGLUT-7.1.tar.bz2
|
||||
4dc102a5ca51e1c41dde87d3f8c7b22a MesaGLUT-7.1.zip
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<ul>
|
||||
<li>autoconf-based configuration (and clean-up of Makefiles)
|
||||
<li>Assorted DRI driver enhancements
|
||||
<li>Reduced dependencies between X server and Mesa
|
||||
<li>GL_EXT_texture_from_pixmap extension for Xlib driver
|
||||
<li>Support for the GL shading language with i965 driver (implemented by Intel)
|
||||
<li>ATI R500 series support (Radeon X1300–X1950) in r300 DRI driver
|
||||
</ul>
|
||||
|
||||
|
||||
@@ -37,6 +55,7 @@ TBD
|
||||
<ul>
|
||||
<li>Numerous GLSL fixes
|
||||
<li>Fixed some error code/detection bugs in the GLSL-related API functions
|
||||
<li>Lots of DRI driver fixes.
|
||||
</ul>
|
||||
|
||||
|
||||
|
86
docs/relnotes-7.2.html
Normal file
86
docs/relnotes-7.2.html
Normal file
@@ -0,0 +1,86 @@
|
||||
<HTML>
|
||||
|
||||
<TITLE>Mesa Release Notes</TITLE>
|
||||
|
||||
<head><link rel="stylesheet" type="text/css" href="mesa.css"></head>
|
||||
|
||||
<BODY>
|
||||
|
||||
<body bgcolor="#eeeeee">
|
||||
|
||||
<H1>Mesa 7.2 Release Notes / (date tbd)</H1>
|
||||
|
||||
<p>
|
||||
Mesa 7.2 is a stable release fixing bugs found in 7.1, which was a
|
||||
new development release.
|
||||
</p>
|
||||
<p>
|
||||
Mesa 7.2 implements the OpenGL 2.1 API, but the version reported by
|
||||
glGetString(GL_VERSION) depends on the particular driver being used.
|
||||
Some drivers don't support all the features required in OpenGL 2.1.
|
||||
</p>
|
||||
<p>
|
||||
Note that this version of Mesa does not use the GEM memory manager.
|
||||
The master branch of git uses GEM.
|
||||
The prototype DRI2 code that was in 7.1 has also been removed.
|
||||
</p>
|
||||
<p>
|
||||
DRM version 2.3.1 should be used with Mesa 7.2
|
||||
</p>
|
||||
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
tbd
|
||||
</pre>
|
||||
|
||||
|
||||
<h2>New features</h2>
|
||||
<ul>
|
||||
<li>i965 driver: added support for G41 chipset (Intel)
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Bug fixes</h2>
|
||||
<ul>
|
||||
<li>Assorted bug fixes for Ming build
|
||||
<li>Fixed some vertex/pixel buffer object reference counting bugs
|
||||
<li>Fixed depth/stencil bug in i915/945 driver
|
||||
<li>Fixed some shader flow control bugs in i965 driver
|
||||
<li>Fixed a few tdfx driver bugs which prevented driver from working
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>To Do (someday) items</h2>
|
||||
<ul>
|
||||
<li>Remove the MEMCPY() and _mesa_memcpy() wrappers and just use memcpy().
|
||||
Probably do the same for malloc, calloc, etc.
|
||||
The wrappers were useful in the past for memory debugging but now we
|
||||
have valgrind. Not worried about SunOS 4 support anymore either...
|
||||
<li>Switch to freeglut
|
||||
<li>Fix linux-glide target/driver.
|
||||
<li>Improved lambda and derivative calculation for frag progs.
|
||||
</ul>
|
||||
|
||||
|
||||
<h2>Driver Status</h2>
|
||||
|
||||
<pre>
|
||||
Driver Status
|
||||
---------------------- ----------------------
|
||||
DRI drivers varies with the driver
|
||||
XMesa/GLX (on Xlib) implements OpenGL 2.1
|
||||
OSMesa (off-screen) implements OpenGL 2.1
|
||||
Windows/Win32 implements OpenGL 2.1
|
||||
Glide (3dfx Voodoo1/2) implements OpenGL 1.3
|
||||
SVGA unsupported
|
||||
Wind River UGL unsupported
|
||||
DJGPP unsupported
|
||||
GGI unsupported
|
||||
BeOS unsupported
|
||||
Allegro unsupported
|
||||
D3D unsupported
|
||||
</pre>
|
||||
|
||||
</body>
|
||||
</html>
|
@@ -20,6 +20,7 @@ The release notes summarize what's new or changed in each Mesa release.
|
||||
</p>
|
||||
|
||||
<UL>
|
||||
<LI><A HREF="relnotes-7.2.html">7.2 release notes</A>
|
||||
<LI><A HREF="relnotes-7.1.html">7.1 release notes</A>
|
||||
<LI><A HREF="relnotes-7.0.4.html">7.0.4 release notes</A>
|
||||
<LI><A HREF="relnotes-7.0.3.html">7.0.3 release notes</A>
|
||||
|
@@ -114,7 +114,7 @@ static void calcposobs(void)
|
||||
rainParticle::setRainingArea(obs[0]-7.0f,-0.2f,obs[2]-7.0f,obs[0]+7.0f,8.0f,obs[2]+7.0f);
|
||||
}
|
||||
|
||||
static void printstring(void *font, char *string)
|
||||
static void printstring(void *font, const char *string)
|
||||
{
|
||||
int len,i;
|
||||
|
||||
|
@@ -447,7 +447,6 @@ print_screen_info(Display *dpy, int scrnum, Bool allowDirect, GLboolean limits)
|
||||
if (!ctx) {
|
||||
fprintf(stderr, "Error: glXCreateContext failed\n");
|
||||
XFree(visinfo);
|
||||
XDestroyWindow(dpy, win);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -43,7 +43,7 @@
|
||||
#define __glumystdio_h_
|
||||
|
||||
#ifdef STANDALONE
|
||||
inline void _glu_dprintf( char *, ... ) { }
|
||||
inline void _glu_dprintf( const char *, ... ) { }
|
||||
#endif
|
||||
|
||||
#ifdef LIBRARYBUILD
|
||||
@@ -51,12 +51,12 @@ inline void _glu_dprintf( char *, ... ) { }
|
||||
#include <stdio.h>
|
||||
#define _glu_dprintf printf
|
||||
#else
|
||||
inline void _glu_dprintf( char *, ... ) { }
|
||||
inline void _glu_dprintf( const char *, ... ) { }
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef GLBUILD
|
||||
inline void _glu_dprintf( char *, ... ) { }
|
||||
inline void _glu_dprintf( const char *, ... ) { }
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
|
@@ -246,7 +246,7 @@ Backend::evalVStrip(int n_left, REAL u_left, REAL* left_val,
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
void
|
||||
Backend::bgntmesh( char * )
|
||||
Backend::bgntmesh( const char * )
|
||||
{
|
||||
#ifndef NOWIREFRAME
|
||||
|
||||
|
@@ -65,7 +65,7 @@ public:
|
||||
void surfbbox( long, REAL *, REAL * );
|
||||
void surfgrid( REAL, REAL, long, REAL, REAL, long );
|
||||
void surfmesh( long, long, long, long );
|
||||
void bgntmesh( char * );
|
||||
void bgntmesh( const char * );
|
||||
void endtmesh( void );
|
||||
void swaptmesh( void );
|
||||
void tmeshvert( GridTrimVertex * );
|
||||
|
@@ -48,7 +48,7 @@
|
||||
* Pool - allocate a new pool of buffers
|
||||
*-----------------------------------------------------------------------------
|
||||
*/
|
||||
Pool::Pool( int _buffersize, int initpoolsize, char *n )
|
||||
Pool::Pool( int _buffersize, int initpoolsize, const char *n )
|
||||
{
|
||||
if((unsigned)_buffersize < sizeof(Buffer))
|
||||
buffersize = sizeof(Buffer);
|
||||
|
@@ -55,7 +55,7 @@ class Buffer {
|
||||
|
||||
class Pool {
|
||||
public:
|
||||
Pool( int, int, char * );
|
||||
Pool( int, int, const char * );
|
||||
~Pool( void );
|
||||
inline void* new_buffer( void );
|
||||
inline void free_buffer( void * );
|
||||
@@ -74,7 +74,7 @@ protected:
|
||||
int nextfree; /* byte offset past next free buffer */
|
||||
int initsize;
|
||||
enum Magic { is_allocated = 0xf3a1, is_free = 0xf1a2 };
|
||||
char *name; /* name of the pool */
|
||||
const char *name; /* name of the pool */
|
||||
Magic magic; /* marker for valid pool */
|
||||
};
|
||||
|
||||
|
@@ -126,7 +126,7 @@ int Knotvector::validate( void )
|
||||
return 0;
|
||||
}
|
||||
|
||||
void Knotvector::show( char *msg )
|
||||
void Knotvector::show( const char *msg )
|
||||
{
|
||||
#ifndef NDEBUG
|
||||
_glu_dprintf( "%s\n", msg );
|
||||
|
@@ -49,7 +49,7 @@ struct Knotvector { /* a knot vector */
|
||||
~Knotvector( void );
|
||||
void init( long, long, long, INREAL * );
|
||||
int validate( void );
|
||||
void show( char * );
|
||||
void show( const char * );
|
||||
|
||||
long order; /* order of spline */
|
||||
long knotcount; /* number of knots */
|
||||
|
@@ -677,7 +677,7 @@ NurbsTessellator::do_nurbserror( int msg )
|
||||
}
|
||||
|
||||
int
|
||||
NurbsTessellator::do_check_knots( Knotvector *knots, char *msg )
|
||||
NurbsTessellator::do_check_knots( Knotvector *knots, const char *msg )
|
||||
{
|
||||
int status = knots->validate();
|
||||
if( status ) {
|
||||
|
@@ -112,7 +112,7 @@ protected:
|
||||
private:
|
||||
|
||||
void resetObjects( void );
|
||||
int do_check_knots( Knotvector *, char * );
|
||||
int do_check_knots( Knotvector *, const char * );
|
||||
void do_nurbserror( int );
|
||||
void do_bgncurve( O_curve * );
|
||||
void do_endcurve( void );
|
||||
|
@@ -35,9 +35,7 @@ SOURCES = \
|
||||
dri_common.c \
|
||||
dri_glx.c \
|
||||
XF86dri.c \
|
||||
glxhash.c \
|
||||
dri2_glx.c \
|
||||
dri2.c
|
||||
glxhash.c
|
||||
|
||||
include $(TOP)/src/mesa/sources
|
||||
|
||||
@@ -53,7 +51,6 @@ INCLUDES = -I. \
|
||||
-I$(TOP)/src/mesa/main \
|
||||
-I$(TOP)/src/mesa/glapi \
|
||||
$(LIBDRM_CFLAGS) \
|
||||
$(DRI2PROTO_CFLAGS) \
|
||||
$(X11_INCLUDES)
|
||||
|
||||
|
||||
|
@@ -1,252 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2008 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Soft-
|
||||
* ware"), to deal in the Software without restriction, including without
|
||||
* limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, provided that the above copyright
|
||||
* notice(s) and this permission notice appear in all copies of the Soft-
|
||||
* ware and that both the above copyright notice(s) and this permission
|
||||
* notice appear in supporting documentation.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
* ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
|
||||
* RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
|
||||
* THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
|
||||
* QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
|
||||
* MANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall
|
||||
* not be used in advertising or otherwise to promote the sale, use or
|
||||
* other dealings in this Software without prior written authorization of
|
||||
* the copyright holder.
|
||||
*
|
||||
* Authors:
|
||||
* Kristian Høgsberg (krh@redhat.com)
|
||||
*/
|
||||
|
||||
|
||||
#define NEED_REPLIES
|
||||
#include <X11/Xlibint.h>
|
||||
#include <X11/extensions/Xext.h>
|
||||
#include <X11/extensions/extutil.h>
|
||||
#include <X11/extensions/dri2proto.h>
|
||||
#include "glheader.h"
|
||||
#include "xf86drm.h"
|
||||
#include "dri2.h"
|
||||
|
||||
static char dri2ExtensionName[] = DRI2_NAME;
|
||||
static XExtensionInfo *dri2Info;
|
||||
static XEXT_GENERATE_CLOSE_DISPLAY (DRI2CloseDisplay, dri2Info)
|
||||
static /* const */ XExtensionHooks dri2ExtensionHooks = {
|
||||
NULL, /* create_gc */
|
||||
NULL, /* copy_gc */
|
||||
NULL, /* flush_gc */
|
||||
NULL, /* free_gc */
|
||||
NULL, /* create_font */
|
||||
NULL, /* free_font */
|
||||
DRI2CloseDisplay, /* close_display */
|
||||
NULL, /* wire_to_event */
|
||||
NULL, /* event_to_wire */
|
||||
NULL, /* error */
|
||||
NULL, /* error_string */
|
||||
};
|
||||
|
||||
static XEXT_GENERATE_FIND_DISPLAY (DRI2FindDisplay, dri2Info,
|
||||
dri2ExtensionName,
|
||||
&dri2ExtensionHooks,
|
||||
0, NULL)
|
||||
|
||||
Bool DRI2QueryExtension(Display *dpy, int *eventBase, int *errorBase)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
|
||||
if (XextHasExtension(info)) {
|
||||
*eventBase = info->codes->first_event;
|
||||
*errorBase = info->codes->first_error;
|
||||
return True;
|
||||
}
|
||||
|
||||
return False;
|
||||
}
|
||||
|
||||
Bool DRI2QueryVersion(Display *dpy, int *major, int *minor)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay (dpy);
|
||||
xDRI2QueryVersionReply rep;
|
||||
xDRI2QueryVersionReq *req;
|
||||
|
||||
XextCheckExtension (dpy, info, dri2ExtensionName, False);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2QueryVersion, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2QueryVersion;
|
||||
req->majorVersion = DRI2_MAJOR;
|
||||
req->minorVersion = DRI2_MINOR;
|
||||
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
*major = rep.majorVersion;
|
||||
*minor = rep.minorVersion;
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
Bool DRI2Connect(Display *dpy, int screen,
|
||||
char **driverName, char **busId, unsigned int *sareaHandle)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
xDRI2ConnectReply rep;
|
||||
xDRI2ConnectReq *req;
|
||||
|
||||
XextCheckExtension (dpy, info, dri2ExtensionName, False);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2Connect, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2Connect;
|
||||
req->screen = screen;
|
||||
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
|
||||
*sareaHandle = rep.sareaHandle;
|
||||
|
||||
*driverName = Xmalloc(rep.driverNameLength + 1);
|
||||
if (*driverName == NULL) {
|
||||
_XEatData(dpy,
|
||||
((rep.driverNameLength + 3) & ~3) +
|
||||
((rep.busIdLength + 3) & ~3));
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
_XReadPad(dpy, *driverName, rep.driverNameLength);
|
||||
(*driverName)[rep.driverNameLength] = '\0';
|
||||
|
||||
*busId = Xmalloc(rep.busIdLength + 1);
|
||||
if (*busId == NULL) {
|
||||
Xfree(*driverName);
|
||||
_XEatData(dpy, ((rep.busIdLength + 3) & ~3));
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
_XReadPad(dpy, *busId, rep.busIdLength);
|
||||
(*busId)[rep.busIdLength] = '\0';
|
||||
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
return rep.sareaHandle != 0;
|
||||
}
|
||||
|
||||
Bool DRI2AuthConnection(Display *dpy, int screen, drm_magic_t magic)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
xDRI2AuthConnectionReq *req;
|
||||
xDRI2AuthConnectionReply rep;
|
||||
|
||||
XextCheckExtension (dpy, info, dri2ExtensionName, False);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2AuthConnection, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2AuthConnection;
|
||||
req->screen = screen;
|
||||
req->magic = magic;
|
||||
rep.authenticated = 0;
|
||||
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
return rep.authenticated;
|
||||
}
|
||||
|
||||
Bool DRI2CreateDrawable(Display *dpy, XID drawable,
|
||||
unsigned int *handle, unsigned int *head)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
xDRI2CreateDrawableReply rep;
|
||||
xDRI2CreateDrawableReq *req;
|
||||
|
||||
XextCheckExtension (dpy, info, dri2ExtensionName, False);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2CreateDrawable, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2CreateDrawable;
|
||||
req->drawable = drawable;
|
||||
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
*handle = rep.handle;
|
||||
*head = rep.head;
|
||||
|
||||
return True;
|
||||
}
|
||||
|
||||
void DRI2DestroyDrawable(Display *dpy, XID drawable)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
xDRI2DestroyDrawableReq *req;
|
||||
|
||||
XextSimpleCheckExtension (dpy, info, dri2ExtensionName);
|
||||
|
||||
XSync(dpy, GL_FALSE);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2DestroyDrawable, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2DestroyDrawable;
|
||||
req->drawable = drawable;
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
}
|
||||
|
||||
Bool DRI2ReemitDrawableInfo(Display *dpy, XID drawable, unsigned int *head)
|
||||
{
|
||||
XExtDisplayInfo *info = DRI2FindDisplay(dpy);
|
||||
xDRI2ReemitDrawableInfoReply rep;
|
||||
xDRI2ReemitDrawableInfoReq *req;
|
||||
|
||||
XextCheckExtension (dpy, info, dri2ExtensionName, False);
|
||||
|
||||
LockDisplay(dpy);
|
||||
GetReq(DRI2ReemitDrawableInfo, req);
|
||||
req->reqType = info->codes->major_opcode;
|
||||
req->dri2ReqType = X_DRI2ReemitDrawableInfo;
|
||||
req->drawable = drawable;
|
||||
if (!_XReply(dpy, (xReply *)&rep, 0, xFalse)) {
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
return False;
|
||||
}
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
*head = rep.head;
|
||||
|
||||
return True;
|
||||
}
|
@@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2007,2008 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Soft-
|
||||
* ware"), to deal in the Software without restriction, including without
|
||||
* limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, provided that the above copyright
|
||||
* notice(s) and this permission notice appear in all copies of the Soft-
|
||||
* ware and that both the above copyright notice(s) and this permission
|
||||
* notice appear in supporting documentation.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
* ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
|
||||
* RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
|
||||
* THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
|
||||
* QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
|
||||
* MANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall
|
||||
* not be used in advertising or otherwise to promote the sale, use or
|
||||
* other dealings in this Software without prior written authorization of
|
||||
* the copyright holder.
|
||||
*
|
||||
* Authors:
|
||||
* Kristian Høgsberg (krh@redhat.com)
|
||||
*/
|
||||
|
||||
#ifndef _DRI2_H_
|
||||
#define _DRI2_H_
|
||||
|
||||
extern Bool
|
||||
DRI2QueryExtension(Display *display, int *eventBase, int *errorBase);
|
||||
extern Bool
|
||||
DRI2QueryVersion(Display *display, int *major, int *minor);
|
||||
extern Bool
|
||||
DRI2Connect(Display *display, int screen,
|
||||
char **driverName, char **busId, unsigned int *sareaHandle);
|
||||
extern Bool
|
||||
DRI2AuthConnection(Display *display, int screen, drm_magic_t magic);
|
||||
extern Bool
|
||||
DRI2CreateDrawable(Display *display, XID drawable,
|
||||
unsigned int *handle, unsigned int *head);
|
||||
extern void
|
||||
DRI2DestroyDrawable(Display *display, XID handle);
|
||||
extern Bool
|
||||
DRI2ReemitDrawableInfo(Display *dpy, XID handle, unsigned int *head);
|
||||
|
||||
#endif
|
@@ -1,371 +0,0 @@
|
||||
/*
|
||||
* Copyright © 2008 Red Hat, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Soft-
|
||||
* ware"), to deal in the Software without restriction, including without
|
||||
* limitation the rights to use, copy, modify, merge, publish, distribute,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, provided that the above copyright
|
||||
* notice(s) and this permission notice appear in all copies of the Soft-
|
||||
* ware and that both the above copyright notice(s) and this permission
|
||||
* notice appear in supporting documentation.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL-
|
||||
* ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY
|
||||
* RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN
|
||||
* THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSE-
|
||||
* QUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
|
||||
* DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
||||
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFOR-
|
||||
* MANCE OF THIS SOFTWARE.
|
||||
*
|
||||
* Except as contained in this notice, the name of a copyright holder shall
|
||||
* not be used in advertising or otherwise to promote the sale, use or
|
||||
* other dealings in this Software without prior written authorization of
|
||||
* the copyright holder.
|
||||
*
|
||||
* Authors:
|
||||
* Kristian Høgsberg (krh@redhat.com)
|
||||
*/
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/extensions/Xfixes.h>
|
||||
#include <X11/extensions/Xdamage.h>
|
||||
#include "glheader.h"
|
||||
#include "glxclient.h"
|
||||
#include "glcontextmodes.h"
|
||||
#include "xf86dri.h"
|
||||
#include "sarea.h"
|
||||
#include <dlfcn.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/mman.h>
|
||||
#include "xf86drm.h"
|
||||
#include "dri2.h"
|
||||
#include "dri_common.h"
|
||||
|
||||
typedef struct __GLXDRIdisplayPrivateRec __GLXDRIdisplayPrivate;
|
||||
typedef struct __GLXDRIcontextPrivateRec __GLXDRIcontextPrivate;
|
||||
|
||||
struct __GLXDRIdisplayPrivateRec {
|
||||
__GLXDRIdisplay base;
|
||||
|
||||
/*
|
||||
** XFree86-DRI version information
|
||||
*/
|
||||
int driMajor;
|
||||
int driMinor;
|
||||
int driPatch;
|
||||
};
|
||||
|
||||
struct __GLXDRIcontextPrivateRec {
|
||||
__GLXDRIcontext base;
|
||||
__DRIcontext *driContext;
|
||||
__GLXscreenConfigs *psc;
|
||||
};
|
||||
|
||||
static void dri2DestroyContext(__GLXDRIcontext *context,
|
||||
__GLXscreenConfigs *psc, Display *dpy)
|
||||
{
|
||||
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
|
||||
const __DRIcoreExtension *core = pcp->psc->core;
|
||||
|
||||
(*core->destroyContext)(pcp->driContext);
|
||||
|
||||
Xfree(pcp);
|
||||
}
|
||||
|
||||
static Bool dri2BindContext(__GLXDRIcontext *context,
|
||||
__GLXDRIdrawable *draw, __GLXDRIdrawable *read)
|
||||
{
|
||||
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
|
||||
const __DRIcoreExtension *core = pcp->psc->core;
|
||||
|
||||
return (*core->bindContext)(pcp->driContext,
|
||||
draw->driDrawable,
|
||||
read->driDrawable);
|
||||
}
|
||||
|
||||
static void dri2UnbindContext(__GLXDRIcontext *context)
|
||||
{
|
||||
__GLXDRIcontextPrivate *pcp = (__GLXDRIcontextPrivate *) context;
|
||||
const __DRIcoreExtension *core = pcp->psc->core;
|
||||
|
||||
(*core->unbindContext)(pcp->driContext);
|
||||
}
|
||||
|
||||
static __GLXDRIcontext *dri2CreateContext(__GLXscreenConfigs *psc,
|
||||
const __GLcontextModes *mode,
|
||||
GLXContext gc,
|
||||
GLXContext shareList, int renderType)
|
||||
{
|
||||
__GLXDRIcontextPrivate *pcp, *pcp_shared;
|
||||
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) mode;
|
||||
const __DRIcoreExtension *core = psc->core;
|
||||
__DRIcontext *shared = NULL;
|
||||
|
||||
if (shareList) {
|
||||
pcp_shared = (__GLXDRIcontextPrivate *) shareList->driContext;
|
||||
shared = pcp_shared->driContext;
|
||||
}
|
||||
|
||||
pcp = Xmalloc(sizeof *pcp);
|
||||
if (pcp == NULL)
|
||||
return NULL;
|
||||
|
||||
pcp->psc = psc;
|
||||
pcp->driContext =
|
||||
(*core->createNewContext)(psc->__driScreen,
|
||||
config->driConfig, shared, pcp);
|
||||
gc->__driContext = pcp->driContext;
|
||||
|
||||
if (pcp->driContext == NULL) {
|
||||
Xfree(pcp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pcp->base.destroyContext = dri2DestroyContext;
|
||||
pcp->base.bindContext = dri2BindContext;
|
||||
pcp->base.unbindContext = dri2UnbindContext;
|
||||
|
||||
return &pcp->base;
|
||||
}
|
||||
|
||||
static void dri2DestroyDrawable(__GLXDRIdrawable *pdraw)
|
||||
{
|
||||
const __DRIcoreExtension *core = pdraw->psc->core;
|
||||
|
||||
(*core->destroyDrawable)(pdraw->driDrawable);
|
||||
DRI2DestroyDrawable(pdraw->psc->dpy, pdraw->drawable);
|
||||
Xfree(pdraw);
|
||||
}
|
||||
|
||||
static __GLXDRIdrawable *dri2CreateDrawable(__GLXscreenConfigs *psc,
|
||||
XID xDrawable,
|
||||
GLXDrawable drawable,
|
||||
const __GLcontextModes *modes)
|
||||
{
|
||||
__GLXDRIdrawable *pdraw;
|
||||
__GLXDRIconfigPrivate *config = (__GLXDRIconfigPrivate *) modes;
|
||||
unsigned int handle, head;
|
||||
const __DRIcoreExtension *core = psc->core;
|
||||
|
||||
pdraw = Xmalloc(sizeof(*pdraw));
|
||||
if (!pdraw)
|
||||
return NULL;
|
||||
|
||||
pdraw->destroyDrawable = dri2DestroyDrawable;
|
||||
pdraw->xDrawable = xDrawable;
|
||||
pdraw->drawable = drawable;
|
||||
pdraw->psc = psc;
|
||||
|
||||
fprintf(stderr, "calling DRI2CreateDrawable, XID 0x%lx, GLX ID 0x%lx\n",
|
||||
xDrawable, drawable);
|
||||
|
||||
if (!DRI2CreateDrawable(psc->dpy, xDrawable, &handle, &head)) {
|
||||
Xfree(pdraw);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
fprintf(stderr, "success, head 0x%x, handle 0x%x\n", head, handle);
|
||||
|
||||
/* Create a new drawable */
|
||||
pdraw->driDrawable =
|
||||
(*core->createNewDrawable)(psc->__driScreen,
|
||||
config->driConfig,
|
||||
handle,
|
||||
head,
|
||||
pdraw);
|
||||
|
||||
if (!pdraw->driDrawable) {
|
||||
DRI2DestroyDrawable(psc->dpy, drawable);
|
||||
Xfree(pdraw);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return pdraw;
|
||||
}
|
||||
|
||||
static void dri2DestroyScreen(__GLXscreenConfigs *psc)
|
||||
{
|
||||
/* Free the direct rendering per screen data */
|
||||
(*psc->core->destroyScreen)(psc->__driScreen);
|
||||
drmClose(psc->fd);
|
||||
psc->__driScreen = NULL;
|
||||
}
|
||||
|
||||
|
||||
static void dri2ReemitDrawableInfo(__DRIdrawable *draw, unsigned int *tail,
|
||||
void *loaderPrivate)
|
||||
{
|
||||
__GLXDRIdrawable *pdraw = loaderPrivate;
|
||||
|
||||
DRI2ReemitDrawableInfo(pdraw->psc->dpy, pdraw->drawable, tail);
|
||||
}
|
||||
|
||||
static void dri2PostDamage(__DRIdrawable *draw,
|
||||
struct drm_clip_rect *rects,
|
||||
int numRects, void *loaderPrivate)
|
||||
{
|
||||
XRectangle *xrects;
|
||||
XserverRegion region;
|
||||
__GLXDRIdrawable *glxDraw = loaderPrivate;
|
||||
__GLXscreenConfigs *psc = glxDraw->psc;
|
||||
Display *dpy = psc->dpy;
|
||||
int i;
|
||||
|
||||
xrects = malloc(sizeof(XRectangle) * numRects);
|
||||
if (xrects == NULL)
|
||||
return;
|
||||
|
||||
for (i = 0; i < numRects; i++) {
|
||||
xrects[i].x = rects[i].x1;
|
||||
xrects[i].y = rects[i].y1;
|
||||
xrects[i].width = rects[i].x2 - rects[i].x1;
|
||||
xrects[i].height = rects[i].y2 - rects[i].y1;
|
||||
}
|
||||
region = XFixesCreateRegion(dpy, xrects, numRects);
|
||||
free(xrects);
|
||||
XDamageAdd(dpy, glxDraw->xDrawable, region);
|
||||
XFixesDestroyRegion(dpy, region);
|
||||
}
|
||||
|
||||
static const __DRIloaderExtension dri2LoaderExtension = {
|
||||
{ __DRI_LOADER, __DRI_LOADER_VERSION },
|
||||
dri2ReemitDrawableInfo,
|
||||
dri2PostDamage
|
||||
};
|
||||
|
||||
static const __DRIextension *loader_extensions[] = {
|
||||
&dri2LoaderExtension.base,
|
||||
&systemTimeExtension.base,
|
||||
NULL
|
||||
};
|
||||
|
||||
static __GLXDRIscreen *dri2CreateScreen(__GLXscreenConfigs *psc, int screen,
|
||||
__GLXdisplayPrivate *priv)
|
||||
{
|
||||
const __DRIconfig **driver_configs;
|
||||
const __DRIextension **extensions;
|
||||
__GLXDRIscreen *psp;
|
||||
unsigned int sareaHandle;
|
||||
char *driverName, *busID;
|
||||
drm_magic_t magic;
|
||||
int i;
|
||||
|
||||
psp = Xmalloc(sizeof *psp);
|
||||
if (psp == NULL)
|
||||
return NULL;
|
||||
|
||||
/* Initialize per screen dynamic client GLX extensions */
|
||||
psc->ext_list_first_time = GL_TRUE;
|
||||
|
||||
if (!DRI2Connect(psc->dpy, screen, &driverName, &busID, &sareaHandle))
|
||||
return NULL;
|
||||
|
||||
psc->driver = driOpenDriver(driverName);
|
||||
if (psc->driver == NULL)
|
||||
goto handle_error;
|
||||
|
||||
extensions = dlsym(psc->driver, __DRI_DRIVER_EXTENSIONS);
|
||||
if (extensions == NULL) {
|
||||
ErrorMessageF("driver exports no extensions (%s)\n", dlerror());
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
for (i = 0; extensions[i]; i++) {
|
||||
if (strcmp(extensions[i]->name, __DRI_CORE) == 0)
|
||||
psc->core = (__DRIcoreExtension *) extensions[i];
|
||||
}
|
||||
|
||||
if (psc->core == NULL) {
|
||||
ErrorMessageF("core dri extension not found\n");
|
||||
goto handle_error;
|
||||
}
|
||||
|
||||
psc->fd = drmOpen(NULL, busID);
|
||||
if (psc->fd < 0) {
|
||||
ErrorMessageF("failed to open drm device: %s\n", strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (drmGetMagic(psc->fd, &magic))
|
||||
return NULL;
|
||||
|
||||
if (!DRI2AuthConnection(psc->dpy, screen, magic)) {
|
||||
ErrorMessageF("failed to authenticate drm access\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
psc->__driScreen =
|
||||
psc->core->createNewScreen(screen, psc->fd, sareaHandle,
|
||||
loader_extensions, &driver_configs, psc);
|
||||
if (psc->__driScreen == NULL) {
|
||||
ErrorMessageF("failed to create dri screen\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
driBindExtensions(psc, 1);
|
||||
|
||||
psc->configs = driConvertConfigs(psc->core, psc->configs, driver_configs);
|
||||
psc->visuals = driConvertConfigs(psc->core, psc->visuals, driver_configs);
|
||||
|
||||
psp->destroyScreen = dri2DestroyScreen;
|
||||
psp->createContext = dri2CreateContext;
|
||||
psp->createDrawable = dri2CreateDrawable;
|
||||
|
||||
Xfree(driverName);
|
||||
Xfree(busID);
|
||||
|
||||
return psp;
|
||||
|
||||
handle_error:
|
||||
Xfree(driverName);
|
||||
Xfree(busID);
|
||||
|
||||
/* FIXME: clean up here */
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Called from __glXFreeDisplayPrivate.
|
||||
*/
|
||||
static void dri2DestroyDisplay(__GLXDRIdisplay *dpy)
|
||||
{
|
||||
Xfree(dpy);
|
||||
}
|
||||
|
||||
/*
|
||||
* Allocate, initialize and return a __DRIdisplayPrivate object.
|
||||
* This is called from __glXInitialize() when we are given a new
|
||||
* display pointer.
|
||||
*/
|
||||
_X_HIDDEN __GLXDRIdisplay *dri2CreateDisplay(Display *dpy)
|
||||
{
|
||||
__GLXDRIdisplayPrivate *pdp;
|
||||
int eventBase, errorBase;
|
||||
|
||||
if (!DRI2QueryExtension(dpy, &eventBase, &errorBase))
|
||||
return NULL;
|
||||
|
||||
pdp = Xmalloc(sizeof *pdp);
|
||||
if (pdp == NULL)
|
||||
return NULL;
|
||||
|
||||
if (!DRI2QueryVersion(dpy, &pdp->driMajor, &pdp->driMinor)) {
|
||||
Xfree(pdp);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pdp->driPatch = 0;
|
||||
|
||||
pdp->base.destroyDisplay = dri2DestroyDisplay;
|
||||
pdp->base.createScreen = dri2CreateScreen;
|
||||
|
||||
return &pdp->base;
|
||||
}
|
||||
|
||||
#endif /* GLX_DIRECT_RENDERING */
|
@@ -151,7 +151,6 @@ struct __GLXDRIdrawableRec {
|
||||
*/
|
||||
extern __GLXDRIdisplay *driswCreateDisplay(Display *dpy);
|
||||
extern __GLXDRIdisplay *driCreateDisplay(Display *dpy);
|
||||
extern __GLXDRIdisplay *dri2CreateDisplay(Display *dpy);
|
||||
|
||||
extern void DRI_glXUseXFont( Font font, int first, int count, int listbase );
|
||||
|
||||
@@ -570,7 +569,6 @@ struct __GLXdisplayPrivateRec {
|
||||
*/
|
||||
__GLXDRIdisplay *driswDisplay;
|
||||
__GLXDRIdisplay *driDisplay;
|
||||
__GLXDRIdisplay *dri2Display;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@@ -207,10 +207,6 @@ static int __glXFreeDisplayPrivate(XExtData *extension)
|
||||
if (priv->driDisplay)
|
||||
(*priv->driDisplay->destroyDisplay)(priv->driDisplay);
|
||||
priv->driDisplay = NULL;
|
||||
|
||||
if (priv->dri2Display)
|
||||
(*priv->dri2Display->destroyDisplay)(priv->dri2Display);
|
||||
priv->dri2Display = NULL;
|
||||
#endif
|
||||
|
||||
Xfree((char*) priv);
|
||||
@@ -608,9 +604,6 @@ static Bool AllocAndFetchScreenConfigs(Display *dpy, __GLXdisplayPrivate *priv)
|
||||
if (psc->drawHash == NULL)
|
||||
continue;
|
||||
|
||||
if (priv->dri2Display)
|
||||
psc->driScreen = (*priv->dri2Display->createScreen)(psc, i, priv);
|
||||
|
||||
if (psc->driScreen == NULL && priv->driDisplay)
|
||||
psc->driScreen = (*priv->driDisplay->createScreen)(psc, i, priv);
|
||||
|
||||
@@ -716,7 +709,6 @@ _X_HIDDEN __GLXdisplayPrivate *__glXInitialize(Display* dpy)
|
||||
** (e.g., those called in AllocAndFetchScreenConfigs).
|
||||
*/
|
||||
if (glx_direct && glx_accel) {
|
||||
dpyPriv->dri2Display = dri2CreateDisplay(dpy);
|
||||
dpyPriv->driDisplay = driCreateDisplay(dpy);
|
||||
}
|
||||
if (glx_direct)
|
||||
|
@@ -193,7 +193,13 @@ void __indirect_glGetVertexAttribivARB( GLuint index, GLenum pname,
|
||||
get_vertex_attrib( gc, 1303, index, pname, (xReply *) & reply );
|
||||
|
||||
if ( reply.size != 0 ) {
|
||||
if ( ! get_attrib_array_data( state, index, pname, params ) ) {
|
||||
GLintptr data;
|
||||
|
||||
|
||||
if ( get_attrib_array_data( state, index, pname, & data ) ) {
|
||||
*params = (GLint) data;
|
||||
}
|
||||
else {
|
||||
if (reply.size == 1) {
|
||||
*params = (GLint) reply.pad3;
|
||||
}
|
||||
|
@@ -154,7 +154,7 @@ DRIVER_SOURCES = \
|
||||
endif
|
||||
endif
|
||||
|
||||
SOURCES = $(CORE_SOURCES) $(X86_SOURCES) $(COMMON_DRIVER_SOURCES) $(DRIVER_SOURCES)
|
||||
SOURCES = $(MESA_SOURCES) $(GLAPI_SOURCES) $(X86_SOURCES) $(DRIVER_SOURCES)
|
||||
|
||||
OBJECTS = $(addsuffix .o,$(basename $(SOURCES)))
|
||||
|
||||
|
@@ -177,7 +177,7 @@ static GLboolean debug_variable_length_prim( struct debug_stream *stream )
|
||||
|
||||
#define BITS( dw, hi, lo, ... ) \
|
||||
do { \
|
||||
unsigned himask = ~0UL >> (31 - (hi)); \
|
||||
unsigned himask = 0xffffffffU >> (31 - (hi)); \
|
||||
PRINTF("\t\t "); \
|
||||
PRINTF(__VA_ARGS__); \
|
||||
PRINTF(": 0x%x\n", ((dw) & himask) >> (lo)); \
|
||||
|
@@ -78,7 +78,7 @@ translate_texture_format(GLuint mesa_format, GLenum DepthMode)
|
||||
return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT2_3);
|
||||
case MESA_FORMAT_RGBA_DXT5:
|
||||
return (MAPSURF_COMPRESSED | MT_COMPRESS_DXT4_5);
|
||||
case MESA_FORMAT_Z24_S8:
|
||||
case MESA_FORMAT_S8_Z24:
|
||||
return (MAPSURF_32BIT | MT_32BIT_xI824);
|
||||
default:
|
||||
fprintf(stderr, "%s: bad image format %x\n", __FUNCTION__, mesa_format);
|
||||
|
@@ -513,6 +513,8 @@ struct brw_instruction *brw_IF(struct brw_compile *p, GLuint execute_size)
|
||||
insn->header.compression_control = BRW_COMPRESSION_NONE;
|
||||
insn->header.predicate_control = BRW_PREDICATE_NORMAL;
|
||||
insn->header.mask_control = BRW_MASK_ENABLE;
|
||||
if (!p->single_program_flow)
|
||||
insn->header.thread_control = BRW_THREAD_SWITCH;
|
||||
|
||||
p->current->header.predicate_control = BRW_PREDICATE_NONE;
|
||||
|
||||
@@ -538,6 +540,8 @@ struct brw_instruction *brw_ELSE(struct brw_compile *p,
|
||||
insn->header.compression_control = BRW_COMPRESSION_NONE;
|
||||
insn->header.execution_size = if_insn->header.execution_size;
|
||||
insn->header.mask_control = BRW_MASK_ENABLE;
|
||||
if (!p->single_program_flow)
|
||||
insn->header.thread_control = BRW_THREAD_SWITCH;
|
||||
|
||||
/* Patch the if instruction to point at this instruction.
|
||||
*/
|
||||
@@ -579,6 +583,7 @@ void brw_ENDIF(struct brw_compile *p,
|
||||
insn->header.compression_control = BRW_COMPRESSION_NONE;
|
||||
insn->header.execution_size = patch_insn->header.execution_size;
|
||||
insn->header.mask_control = BRW_MASK_ENABLE;
|
||||
insn->header.thread_control = BRW_THREAD_SWITCH;
|
||||
|
||||
assert(patch_insn->bits3.if_else.jump_count == 0);
|
||||
|
||||
@@ -617,7 +622,7 @@ struct brw_instruction *brw_BREAK(struct brw_compile *p)
|
||||
brw_set_src1(insn, brw_imm_d(0x0));
|
||||
insn->header.compression_control = BRW_COMPRESSION_NONE;
|
||||
insn->header.execution_size = BRW_EXECUTE_8;
|
||||
insn->header.mask_control = BRW_MASK_DISABLE;
|
||||
/* insn->header.mask_control = BRW_MASK_DISABLE; */
|
||||
insn->bits3.if_else.pad0 = 0;
|
||||
return insn;
|
||||
}
|
||||
@@ -631,7 +636,7 @@ struct brw_instruction *brw_CONT(struct brw_compile *p)
|
||||
brw_set_src1(insn, brw_imm_d(0x0));
|
||||
insn->header.compression_control = BRW_COMPRESSION_NONE;
|
||||
insn->header.execution_size = BRW_EXECUTE_8;
|
||||
insn->header.mask_control = BRW_MASK_DISABLE;
|
||||
/* insn->header.mask_control = BRW_MASK_DISABLE; */
|
||||
insn->bits3.if_else.pad0 = 0;
|
||||
return insn;
|
||||
}
|
||||
@@ -655,7 +660,7 @@ struct brw_instruction *brw_DO(struct brw_compile *p, GLuint execute_size)
|
||||
insn->header.execution_size = execute_size;
|
||||
insn->header.predicate_control = BRW_PREDICATE_NONE;
|
||||
/* insn->header.mask_control = BRW_MASK_ENABLE; */
|
||||
insn->header.mask_control = BRW_MASK_DISABLE;
|
||||
/* insn->header.mask_control = BRW_MASK_DISABLE; */
|
||||
|
||||
return insn;
|
||||
}
|
||||
@@ -694,7 +699,7 @@ struct brw_instruction *brw_WHILE(struct brw_compile *p,
|
||||
|
||||
/* insn->header.mask_control = BRW_MASK_ENABLE; */
|
||||
|
||||
insn->header.mask_control = BRW_MASK_DISABLE;
|
||||
/* insn->header.mask_control = BRW_MASK_DISABLE; */
|
||||
p->current->header.predicate_control = BRW_PREDICATE_NONE;
|
||||
return insn;
|
||||
}
|
||||
|
@@ -850,20 +850,20 @@ static void emit_sop(struct brw_wm_compile *c,
|
||||
struct brw_reg dst, src0, src1;
|
||||
int i;
|
||||
|
||||
brw_push_insn_state(p);
|
||||
for (i = 0; i < 4; i++) {
|
||||
if (mask & (1<<i)) {
|
||||
dst = get_dst_reg(c, inst, i, 1);
|
||||
src0 = get_src_reg(c, &inst->SrcReg[0], i, 1);
|
||||
src1 = get_src_reg(c, &inst->SrcReg[1], i, 1);
|
||||
brw_push_insn_state(p);
|
||||
brw_CMP(p, brw_null_reg(), cond, src0, src1);
|
||||
brw_set_predicate_control(p, BRW_PREDICATE_NONE);
|
||||
brw_MOV(p, dst, brw_imm_f(0.0));
|
||||
brw_set_predicate_control(p, BRW_PREDICATE_NORMAL);
|
||||
brw_MOV(p, dst, brw_imm_f(1.0));
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
}
|
||||
brw_pop_insn_state(p);
|
||||
}
|
||||
|
||||
static void emit_slt(struct brw_wm_compile *c,
|
||||
|
@@ -138,7 +138,7 @@ static GLuint translate_tex_format( GLuint mesa_format, GLenum depth_mode )
|
||||
case MESA_FORMAT_SRGB_DXT1:
|
||||
return BRW_SURFACEFORMAT_BC1_UNORM_SRGB;
|
||||
|
||||
case MESA_FORMAT_Z24_S8:
|
||||
case MESA_FORMAT_S8_Z24:
|
||||
return BRW_SURFACEFORMAT_I24X8_UNORM;
|
||||
|
||||
default:
|
||||
|
@@ -58,6 +58,7 @@
|
||||
#define PCI_CHIP_IGD_E_G 0x2E02
|
||||
#define PCI_CHIP_Q45_G 0x2E12
|
||||
#define PCI_CHIP_G45_G 0x2E22
|
||||
#define PCI_CHIP_G41_G 0x2E32
|
||||
|
||||
#define IS_MOBILE(devid) (devid == PCI_CHIP_I855_GM || \
|
||||
devid == PCI_CHIP_I915_GM || \
|
||||
@@ -70,7 +71,8 @@
|
||||
#define IS_GM45_GM(devid) (devid == PCI_CHIP_GM45_GM)
|
||||
#define IS_G4X(devid) (devid == PCI_CHIP_IGD_E_G || \
|
||||
devid == PCI_CHIP_Q45_G || \
|
||||
devid == PCI_CHIP_G45_G)
|
||||
devid == PCI_CHIP_G45_G || \
|
||||
devid == PCI_CHIP_G41_G)
|
||||
|
||||
#define IS_915(devid) (devid == PCI_CHIP_I915_G || \
|
||||
devid == PCI_CHIP_E7221_G || \
|
||||
|
@@ -178,6 +178,9 @@ intelGetString(GLcontext * ctx, GLenum name)
|
||||
case PCI_CHIP_Q45_G:
|
||||
chipset = "Intel(R) Q45/Q43";
|
||||
break;
|
||||
case PCI_CHIP_G41_G:
|
||||
chipset = "Intel(R) G41";
|
||||
break;
|
||||
default:
|
||||
chipset = "Unknown Intel Chipset";
|
||||
break;
|
||||
|
@@ -138,7 +138,7 @@ intelChooseTextureFormat(GLcontext * ctx, GLint internalFormat,
|
||||
|
||||
case GL_DEPTH_STENCIL_EXT:
|
||||
case GL_DEPTH24_STENCIL8_EXT:
|
||||
return &_mesa_texformat_z24_s8;
|
||||
return &_mesa_texformat_s8_z24;
|
||||
|
||||
#ifndef I915
|
||||
case GL_SRGB_EXT:
|
||||
|
@@ -65,6 +65,7 @@ DRI_CONF_END;
|
||||
|
||||
static const __DRIextension *tdfxExtensions[] = {
|
||||
&driReadDrawableExtension,
|
||||
NULL
|
||||
};
|
||||
|
||||
static const GLuint __driNConfigOptions = 1;
|
||||
@@ -350,12 +351,7 @@ tdfxFillInModes(__DRIscreenPrivate *psp,
|
||||
unsigned stencil_bits,
|
||||
GLboolean have_back_buffer)
|
||||
{
|
||||
__DRIconfig **configs, **c;
|
||||
__GLcontextModes *m;
|
||||
unsigned num_modes;
|
||||
unsigned vis[2] = { GLX_TRUE_COLOR, GLX_DIRECT_COLOR };
|
||||
unsigned deep = (depth_bits > 17);
|
||||
unsigned i, db, depth, accum, stencil;
|
||||
|
||||
/* Right now GLX_SWAP_COPY_OML isn't supported, but it would be easy
|
||||
* enough to add support. Basically, if a context is created with an
|
||||
@@ -363,55 +359,32 @@ tdfxFillInModes(__DRIscreenPrivate *psp,
|
||||
* will never be used.
|
||||
*/
|
||||
|
||||
num_modes = (depth_bits == 16) ? 32 : 16;
|
||||
|
||||
configs = _mesa_malloc(num_modes * sizeof *configs);
|
||||
c = configs;
|
||||
|
||||
for (i = 0; i <= 1; i++) {
|
||||
for (db = 0; db <= 1; db++) {
|
||||
for (depth = 0; depth <= 1; depth++) {
|
||||
for (accum = 0; accum <= 1; accum++) {
|
||||
for (stencil = 0; stencil <= !deep; stencil++) {
|
||||
*c = _mesa_malloc(sizeof **c);
|
||||
m = &(*c++)->modes;
|
||||
if (deep) stencil = depth;
|
||||
m->redBits = deep ? 8 : 5;
|
||||
m->greenBits = deep ? 8 : 6;
|
||||
m->blueBits = deep ? 8 : 5;
|
||||
m->alphaBits = deep ? 8 : 0;
|
||||
m->redMask = deep ?0xFF000000 :0x0000F800;
|
||||
m->greenMask = deep ?0x00FF0000 :0x000007E0;
|
||||
m->blueMask = deep ?0x0000FF00 :0x0000001F;
|
||||
m->alphaMask = deep ? 0x000000FF : 0;
|
||||
m->rgbBits = m->redBits + m->greenBits +
|
||||
m->blueBits + m->alphaBits;
|
||||
m->accumRedBits = accum ? 16 : 0;
|
||||
m->accumGreenBits = accum ? 16 : 0;
|
||||
m->accumBlueBits = accum ? 16 : 0;
|
||||
m->accumAlphaBits = (accum && deep) ? 16 : 0;
|
||||
m->stencilBits = stencil ? 8 : 0;
|
||||
m->depthBits = deep
|
||||
? (depth ? 24 : 0)
|
||||
: (depth ? 0 : depth_bits);
|
||||
m->visualType = vis[i];
|
||||
m->renderType = GLX_RGBA_BIT;
|
||||
m->drawableType = GLX_WINDOW_BIT;
|
||||
m->rgbMode = GL_TRUE;
|
||||
m->doubleBufferMode = db ? GL_TRUE : GL_FALSE;
|
||||
if (db)
|
||||
m->swapMethod = GLX_SWAP_UNDEFINED_OML;
|
||||
m->visualRating = ((stencil && !deep) || accum)
|
||||
? GLX_SLOW_CONFIG
|
||||
: GLX_NONE;
|
||||
if (deep) stencil = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
static const GLenum db_modes[2] = { GLX_NONE, GLX_SWAP_UNDEFINED_OML };
|
||||
uint8_t depth_bits_array[4];
|
||||
uint8_t stencil_bits_array[4];
|
||||
if(deep) {
|
||||
depth_bits_array[0] = 0;
|
||||
depth_bits_array[1] = 24;
|
||||
stencil_bits_array[0] = 0;
|
||||
stencil_bits_array[1] = 8;
|
||||
} else {
|
||||
depth_bits_array[0] = depth_bits;
|
||||
depth_bits_array[1] = 0;
|
||||
depth_bits_array[2] = depth_bits;
|
||||
depth_bits_array[3] = 0;
|
||||
stencil_bits_array[0] = 0;
|
||||
stencil_bits_array[1] = 0;
|
||||
stencil_bits_array[2] = 8;
|
||||
stencil_bits_array[3] = 8;
|
||||
}
|
||||
|
||||
return (const __DRIconfig **) configs;
|
||||
return driCreateConfigs(
|
||||
deep ? GL_RGBA : GL_RGB,
|
||||
deep ? GL_UNSIGNED_INT_8_8_8_8 : GL_UNSIGNED_SHORT_5_6_5,
|
||||
depth_bits_array,
|
||||
stencil_bits_array,
|
||||
deep ? 2 : 4,
|
||||
db_modes, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -118,6 +118,7 @@ static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
|
||||
/* Only 16 and 32 bit targets are supported now */
|
||||
assert(pwfb->cColorBits == 0 ||
|
||||
pwfb->cColorBits == 16 ||
|
||||
pwfb->cColorBits == 24 ||
|
||||
pwfb->cColorBits == 32);
|
||||
|
||||
switch(pwfb->cColorBits){
|
||||
@@ -127,6 +128,7 @@ static void wmSetPixelFormat(WMesaFramebuffer pwfb, HDC hDC)
|
||||
case 16:
|
||||
pwfb->pixelformat = PF_5R6G5B;
|
||||
break;
|
||||
case 24:
|
||||
case 32:
|
||||
pwfb->pixelformat = PF_8R8G8B;
|
||||
break;
|
||||
@@ -854,6 +856,195 @@ static void read_rgba_pixels_32(const GLcontext *ctx,
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
|
||||
/* DOUBLE BUFFER 24-bit */
|
||||
|
||||
#define WMSETPIXEL24(pwc, y, x, r, g, b) { \
|
||||
LPBYTE lpb = ((LPBYTE)((pwc)->pbPixels + (pwc)->ScanWidth * (y)) + (3 * x)); \
|
||||
lpb[0] = (b); \
|
||||
lpb[1] = (g); \
|
||||
lpb[2] = (r); }
|
||||
|
||||
/* Write a horizontal span of RGBA color pixels with a boolean mask. */
|
||||
static void write_rgba_span_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLubyte rgba[][4],
|
||||
const GLubyte mask[] )
|
||||
{
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
GLuint i;
|
||||
LPBYTE lpb;
|
||||
|
||||
(void) ctx;
|
||||
|
||||
y=FLIP(y);
|
||||
lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
|
||||
if (mask) {
|
||||
for (i=0; i<n; i++)
|
||||
if (mask[i]) {
|
||||
lpb[3*i] = rgba[i][BCOMP];
|
||||
lpb[3*i+1] = rgba[i][GCOMP];
|
||||
lpb[3*i+2] = rgba[i][RCOMP];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i=0; i<n; i++) {
|
||||
*lpb++ = rgba[i][BCOMP];
|
||||
*lpb++ = rgba[i][GCOMP];
|
||||
*lpb++ = rgba[i][RCOMP];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Write a horizontal span of RGB color pixels with a boolean mask. */
|
||||
static void write_rgb_span_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLubyte rgb[][3],
|
||||
const GLubyte mask[] )
|
||||
{
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
GLuint i;
|
||||
LPBYTE lpb;
|
||||
|
||||
(void) ctx;
|
||||
|
||||
y=FLIP(y);
|
||||
lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
|
||||
if (mask) {
|
||||
for (i=0; i<n; i++)
|
||||
if (mask[i]) {
|
||||
lpb[3*i] = rgb[i][BCOMP];
|
||||
lpb[3*i+1] = rgb[i][GCOMP];
|
||||
lpb[3*i+2] = rgb[i][RCOMP];
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i=0; i<n; i++) {
|
||||
*lpb++ = rgb[i][BCOMP];
|
||||
*lpb++ = rgb[i][GCOMP];
|
||||
*lpb++ = rgb[i][RCOMP];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Write a horizontal span of pixels with a boolean mask. The current color
|
||||
* is used for all pixels.
|
||||
*/
|
||||
static void write_mono_rgba_span_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, GLint x, GLint y,
|
||||
const GLchan color[4],
|
||||
const GLubyte mask[])
|
||||
{
|
||||
LPBYTE lpb;
|
||||
GLuint i;
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
|
||||
y=FLIP(y);
|
||||
if (mask) {
|
||||
for (i=0; i<n; i++)
|
||||
if (mask[i]) {
|
||||
lpb[3*i] = color[BCOMP];
|
||||
lpb[3*i+1] = color[GCOMP];
|
||||
lpb[3*i+2] = color[RCOMP];
|
||||
}
|
||||
}
|
||||
else
|
||||
for (i=0; i<n; i++) {
|
||||
*lpb++ = color[BCOMP];
|
||||
*lpb++ = color[GCOMP];
|
||||
*lpb++ = color[RCOMP];
|
||||
}
|
||||
}
|
||||
|
||||
/* Write an array of RGBA pixels with a boolean mask. */
|
||||
static void write_rgba_pixels_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
const GLubyte rgba[][4],
|
||||
const GLubyte mask[])
|
||||
{
|
||||
GLuint i;
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
for (i=0; i<n; i++)
|
||||
if (mask[i])
|
||||
WMSETPIXEL24(pwfb, FLIP(y[i]), x[i],
|
||||
rgba[i][RCOMP], rgba[i][GCOMP], rgba[i][BCOMP]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Write an array of pixels with a boolean mask. The current color
|
||||
* is used for all pixels.
|
||||
*/
|
||||
static void write_mono_rgba_pixels_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n,
|
||||
const GLint x[], const GLint y[],
|
||||
const GLchan color[4],
|
||||
const GLubyte mask[])
|
||||
{
|
||||
GLuint i;
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
for (i=0; i<n; i++)
|
||||
if (mask[i])
|
||||
WMSETPIXEL24(pwfb, FLIP(y[i]),x[i],color[RCOMP],
|
||||
color[GCOMP], color[BCOMP]);
|
||||
}
|
||||
|
||||
/* Read a horizontal span of color pixels. */
|
||||
static void read_rgba_span_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, GLint x, GLint y,
|
||||
GLubyte rgba[][4] )
|
||||
{
|
||||
GLuint i;
|
||||
LPBYTE lpb;
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
|
||||
y = FLIP(y);
|
||||
lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y)) + (3 * x);
|
||||
for (i=0; i<n; i++) {
|
||||
rgba[i][RCOMP] = lpb[3*i+2];
|
||||
rgba[i][GCOMP] = lpb[3*i+1];
|
||||
rgba[i][BCOMP] = lpb[3*i];
|
||||
rgba[i][ACOMP] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Read an array of color pixels. */
|
||||
static void read_rgba_pixels_24(const GLcontext *ctx,
|
||||
struct gl_renderbuffer *rb,
|
||||
GLuint n, const GLint x[], const GLint y[],
|
||||
GLubyte rgba[][4])
|
||||
{
|
||||
GLuint i;
|
||||
LPBYTE lpb;
|
||||
WMesaContext pwc = wmesa_context(ctx);
|
||||
WMesaFramebuffer pwfb = wmesa_framebuffer(ctx->DrawBuffer);
|
||||
|
||||
for (i=0; i<n; i++) {
|
||||
GLint y2 = FLIP(y[i]);
|
||||
lpb = ((LPBYTE)(pwfb->pbPixels + pwfb->ScanWidth * y2)) + (3 * x[i]);
|
||||
rgba[i][RCOMP] = lpb[3*i+2];
|
||||
rgba[i][GCOMP] = lpb[3*i+1];
|
||||
rgba[i][BCOMP] = lpb[3*i];
|
||||
rgba[i][ACOMP] = 255;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*********************************************************************/
|
||||
|
||||
/* DOUBLE BUFFER 16-bit */
|
||||
@@ -1077,7 +1268,7 @@ wmesa_renderbuffer_storage(GLcontext *ctx,
|
||||
* on if we're drawing to the front or back color buffer.
|
||||
*/
|
||||
void wmesa_set_renderbuffer_funcs(struct gl_renderbuffer *rb, int pixelformat,
|
||||
int double_buffer)
|
||||
BYTE cColorBits, int double_buffer)
|
||||
{
|
||||
if (double_buffer) {
|
||||
/* back buffer */
|
||||
@@ -1097,16 +1288,32 @@ void wmesa_set_renderbuffer_funcs(struct gl_renderbuffer *rb, int pixelformat,
|
||||
rb->BlueBits = 5;
|
||||
break;
|
||||
case PF_8R8G8B:
|
||||
rb->PutRow = write_rgba_span_32;
|
||||
rb->PutRowRGB = write_rgb_span_32;
|
||||
rb->PutMonoRow = write_mono_rgba_span_32;
|
||||
rb->PutValues = write_rgba_pixels_32;
|
||||
rb->PutMonoValues = write_mono_rgba_pixels_32;
|
||||
rb->GetRow = read_rgba_span_32;
|
||||
rb->GetValues = read_rgba_pixels_32;
|
||||
if (cColorBits == 24)
|
||||
{
|
||||
rb->PutRow = write_rgba_span_24;
|
||||
rb->PutRowRGB = write_rgb_span_24;
|
||||
rb->PutMonoRow = write_mono_rgba_span_24;
|
||||
rb->PutValues = write_rgba_pixels_24;
|
||||
rb->PutMonoValues = write_mono_rgba_pixels_24;
|
||||
rb->GetRow = read_rgba_span_24;
|
||||
rb->GetValues = read_rgba_pixels_24;
|
||||
rb->RedBits = 8;
|
||||
rb->GreenBits = 8;
|
||||
rb->BlueBits = 8;
|
||||
}
|
||||
else
|
||||
{
|
||||
rb->PutRow = write_rgba_span_32;
|
||||
rb->PutRowRGB = write_rgb_span_32;
|
||||
rb->PutMonoRow = write_mono_rgba_span_32;
|
||||
rb->PutValues = write_rgba_pixels_32;
|
||||
rb->PutMonoValues = write_mono_rgba_pixels_32;
|
||||
rb->GetRow = read_rgba_span_32;
|
||||
rb->GetValues = read_rgba_pixels_32;
|
||||
rb->RedBits = 8;
|
||||
rb->GreenBits = 8;
|
||||
rb->BlueBits = 8;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
@@ -1413,11 +1620,11 @@ void WMesaMakeCurrent(WMesaContext c, HDC hdc)
|
||||
if (visual->doubleBufferMode == 1) {
|
||||
rb = wmesa_new_renderbuffer();
|
||||
_mesa_add_renderbuffer(&pwfb->Base, BUFFER_BACK_LEFT, rb);
|
||||
wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, 1);
|
||||
wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, pwfb->cColorBits, 1);
|
||||
}
|
||||
rb = wmesa_new_renderbuffer();
|
||||
_mesa_add_renderbuffer(&pwfb->Base, BUFFER_FRONT_LEFT, rb);
|
||||
wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, 0);
|
||||
wmesa_set_renderbuffer_funcs(rb, pwfb->pixelformat, pwfb->cColorBits, 0);
|
||||
|
||||
/* Let Mesa own the Depth, Stencil, and Accum buffers */
|
||||
_mesa_add_soft_renderbuffers(&pwfb->Base,
|
||||
|
@@ -34,6 +34,7 @@
|
||||
#endif
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include "glthread.h"
|
||||
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
* (C) Copyright IBM Corporation 2006
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
@@ -77,7 +77,7 @@ lookup_arrayobj(GLcontext *ctx, GLuint id)
|
||||
struct gl_array_object *
|
||||
_mesa_new_array_object( GLcontext *ctx, GLuint name )
|
||||
{
|
||||
struct gl_array_object *obj = MALLOC_STRUCT(gl_array_object);
|
||||
struct gl_array_object *obj = CALLOC_STRUCT(gl_array_object);
|
||||
if (obj)
|
||||
_mesa_initialize_array_object(ctx, obj, name);
|
||||
return obj;
|
||||
@@ -210,6 +210,15 @@ _mesa_remove_array_object( GLcontext *ctx, struct gl_array_object *obj )
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
|
||||
{
|
||||
if (bufObj != ctx->Array.NullBufferObj) {
|
||||
_mesa_reference_buffer_object(ctx, &bufObj, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* API Functions */
|
||||
/**********************************************************************/
|
||||
@@ -311,18 +320,18 @@ _mesa_DeleteVertexArraysAPPLE(GLsizei n, const GLuint *ids)
|
||||
/* Unbind any buffer objects that might be bound to arrays in
|
||||
* this array object.
|
||||
*/
|
||||
_mesa_unbind_buffer_object( ctx, obj->Vertex.BufferObj );
|
||||
_mesa_unbind_buffer_object( ctx, obj->Normal.BufferObj );
|
||||
_mesa_unbind_buffer_object( ctx, obj->Color.BufferObj );
|
||||
_mesa_unbind_buffer_object( ctx, obj->SecondaryColor.BufferObj );
|
||||
_mesa_unbind_buffer_object( ctx, obj->FogCoord.BufferObj );
|
||||
_mesa_unbind_buffer_object( ctx, obj->Index.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->Vertex.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->Normal.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->Color.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->SecondaryColor.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->FogCoord.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->Index.BufferObj );
|
||||
for (i = 0; i < MAX_TEXTURE_UNITS; i++) {
|
||||
_mesa_unbind_buffer_object( ctx, obj->TexCoord[i].BufferObj );
|
||||
unbind_buffer_object( ctx, obj->TexCoord[i].BufferObj );
|
||||
}
|
||||
_mesa_unbind_buffer_object( ctx, obj->EdgeFlag.BufferObj );
|
||||
unbind_buffer_object( ctx, obj->EdgeFlag.BufferObj );
|
||||
for (i = 0; i < VERT_ATTRIB_MAX; i++) {
|
||||
_mesa_unbind_buffer_object( ctx, obj->VertexAttrib[i].BufferObj );
|
||||
unbind_buffer_object( ctx, obj->VertexAttrib[i].BufferObj );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -1274,6 +1274,29 @@ adjust_buffer_object_ref_counts(struct gl_array_attrib *array, GLint step)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Copy gl_pixelstore_attrib from src to dst, updating buffer
|
||||
* object refcounts.
|
||||
*/
|
||||
static void
|
||||
copy_pixelstore(GLcontext *ctx,
|
||||
struct gl_pixelstore_attrib *dst,
|
||||
const struct gl_pixelstore_attrib *src)
|
||||
{
|
||||
dst->Alignment = src->Alignment;
|
||||
dst->RowLength = src->RowLength;
|
||||
dst->SkipPixels = src->SkipPixels;
|
||||
dst->SkipRows = src->SkipRows;
|
||||
dst->ImageHeight = src->ImageHeight;
|
||||
dst->SkipImages = src->SkipImages;
|
||||
dst->SwapBytes = src->SwapBytes;
|
||||
dst->LsbFirst = src->LsbFirst;
|
||||
dst->ClientStorage = src->ClientStorage;
|
||||
dst->Invert = src->Invert;
|
||||
_mesa_reference_buffer_object(ctx, &dst->BufferObj, src->BufferObj);
|
||||
}
|
||||
|
||||
|
||||
#define GL_CLIENT_PACK_BIT (1<<20)
|
||||
#define GL_CLIENT_UNPACK_BIT (1<<21)
|
||||
|
||||
@@ -1292,31 +1315,29 @@ _mesa_PushClientAttrib(GLbitfield mask)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Build linked list of attribute nodes which save all attribute */
|
||||
/* groups specified by the mask. */
|
||||
/* Build linked list of attribute nodes which save all attribute
|
||||
* groups specified by the mask.
|
||||
*/
|
||||
head = NULL;
|
||||
|
||||
if (mask & GL_CLIENT_PIXEL_STORE_BIT) {
|
||||
struct gl_pixelstore_attrib *attr;
|
||||
#if FEATURE_EXT_pixel_buffer_object
|
||||
ctx->Pack.BufferObj->RefCount++;
|
||||
ctx->Unpack.BufferObj->RefCount++;
|
||||
#endif
|
||||
/* packing attribs */
|
||||
attr = MALLOC_STRUCT( gl_pixelstore_attrib );
|
||||
MEMCPY( attr, &ctx->Pack, sizeof(struct gl_pixelstore_attrib) );
|
||||
attr = CALLOC_STRUCT( gl_pixelstore_attrib );
|
||||
copy_pixelstore(ctx, attr, &ctx->Pack);
|
||||
newnode = new_attrib_node( GL_CLIENT_PACK_BIT );
|
||||
newnode->data = attr;
|
||||
newnode->next = head;
|
||||
head = newnode;
|
||||
/* unpacking attribs */
|
||||
attr = MALLOC_STRUCT( gl_pixelstore_attrib );
|
||||
MEMCPY( attr, &ctx->Unpack, sizeof(struct gl_pixelstore_attrib) );
|
||||
attr = CALLOC_STRUCT( gl_pixelstore_attrib );
|
||||
copy_pixelstore(ctx, attr, &ctx->Unpack);
|
||||
newnode = new_attrib_node( GL_CLIENT_UNPACK_BIT );
|
||||
newnode->data = attr;
|
||||
newnode->next = head;
|
||||
head = newnode;
|
||||
}
|
||||
|
||||
if (mask & GL_CLIENT_VERTEX_ARRAY_BIT) {
|
||||
struct gl_array_attrib *attr;
|
||||
struct gl_array_object *obj;
|
||||
@@ -1353,7 +1374,7 @@ _mesa_PushClientAttrib(GLbitfield mask)
|
||||
void GLAPIENTRY
|
||||
_mesa_PopClientAttrib(void)
|
||||
{
|
||||
struct gl_attrib_node *attr, *next;
|
||||
struct gl_attrib_node *node, *next;
|
||||
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
|
||||
@@ -1364,37 +1385,31 @@ _mesa_PopClientAttrib(void)
|
||||
}
|
||||
|
||||
ctx->ClientAttribStackDepth--;
|
||||
attr = ctx->ClientAttribStack[ctx->ClientAttribStackDepth];
|
||||
node = ctx->ClientAttribStack[ctx->ClientAttribStackDepth];
|
||||
|
||||
while (attr) {
|
||||
switch (attr->kind) {
|
||||
while (node) {
|
||||
switch (node->kind) {
|
||||
case GL_CLIENT_PACK_BIT:
|
||||
#if FEATURE_EXT_pixel_buffer_object
|
||||
ctx->Pack.BufferObj->RefCount--;
|
||||
if (ctx->Pack.BufferObj->RefCount <= 0) {
|
||||
_mesa_remove_buffer_object( ctx, ctx->Pack.BufferObj );
|
||||
(*ctx->Driver.DeleteBuffer)( ctx, ctx->Pack.BufferObj );
|
||||
{
|
||||
struct gl_pixelstore_attrib *store =
|
||||
(struct gl_pixelstore_attrib *) node->data;
|
||||
copy_pixelstore(ctx, &ctx->Pack, store);
|
||||
_mesa_reference_buffer_object(ctx, &store->BufferObj, NULL);
|
||||
}
|
||||
#endif
|
||||
MEMCPY( &ctx->Pack, attr->data,
|
||||
sizeof(struct gl_pixelstore_attrib) );
|
||||
ctx->NewState |= _NEW_PACKUNPACK;
|
||||
break;
|
||||
case GL_CLIENT_UNPACK_BIT:
|
||||
#if FEATURE_EXT_pixel_buffer_object
|
||||
ctx->Unpack.BufferObj->RefCount--;
|
||||
if (ctx->Unpack.BufferObj->RefCount <= 0) {
|
||||
_mesa_remove_buffer_object( ctx, ctx->Unpack.BufferObj );
|
||||
(*ctx->Driver.DeleteBuffer)( ctx, ctx->Unpack.BufferObj );
|
||||
{
|
||||
struct gl_pixelstore_attrib *store =
|
||||
(struct gl_pixelstore_attrib *) node->data;
|
||||
copy_pixelstore(ctx, &ctx->Unpack, store);
|
||||
_mesa_reference_buffer_object(ctx, &store->BufferObj, NULL);
|
||||
}
|
||||
#endif
|
||||
MEMCPY( &ctx->Unpack, attr->data,
|
||||
sizeof(struct gl_pixelstore_attrib) );
|
||||
ctx->NewState |= _NEW_PACKUNPACK;
|
||||
break;
|
||||
case GL_CLIENT_VERTEX_ARRAY_BIT: {
|
||||
struct gl_array_attrib * data =
|
||||
(struct gl_array_attrib *) attr->data;
|
||||
(struct gl_array_attrib *) node->data;
|
||||
|
||||
adjust_buffer_object_ref_counts(&ctx->Array, -1);
|
||||
|
||||
@@ -1431,10 +1446,10 @@ _mesa_PopClientAttrib(void)
|
||||
break;
|
||||
}
|
||||
|
||||
next = attr->next;
|
||||
FREE( attr->data );
|
||||
FREE( attr );
|
||||
attr = next;
|
||||
next = node->next;
|
||||
FREE( node->data );
|
||||
FREE( node );
|
||||
node = next;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -166,22 +166,75 @@ _mesa_delete_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
|
||||
|
||||
if (bufObj->Data)
|
||||
_mesa_free(bufObj->Data);
|
||||
|
||||
/* assign strange values here to help w/ debugging */
|
||||
bufObj->RefCount = -1000;
|
||||
bufObj->Name = ~0;
|
||||
|
||||
_mesa_free(bufObj);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Set ptr to bufObj w/ reference counting.
|
||||
*/
|
||||
void
|
||||
_mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
|
||||
_mesa_reference_buffer_object(GLcontext *ctx,
|
||||
struct gl_buffer_object **ptr,
|
||||
struct gl_buffer_object *bufObj)
|
||||
{
|
||||
if (bufObj != ctx->Array.NullBufferObj) {
|
||||
bufObj->RefCount--;
|
||||
if (bufObj->RefCount <= 0) {
|
||||
if (*ptr == bufObj)
|
||||
return;
|
||||
|
||||
if (*ptr) {
|
||||
/* Unreference the old texture */
|
||||
GLboolean deleteFlag = GL_FALSE;
|
||||
struct gl_buffer_object *oldObj = *ptr;
|
||||
|
||||
/*_glthread_LOCK_MUTEX(oldObj->Mutex);*/
|
||||
ASSERT(oldObj->RefCount > 0);
|
||||
oldObj->RefCount--;
|
||||
#if 0
|
||||
printf("BufferObj %p %d DECR to %d\n",
|
||||
(void *) oldObj, oldObj->Name, oldObj->RefCount);
|
||||
#endif
|
||||
deleteFlag = (oldObj->RefCount == 0);
|
||||
/*_glthread_UNLOCK_MUTEX(oldObj->Mutex);*/
|
||||
|
||||
if (deleteFlag) {
|
||||
|
||||
/* some sanity checking: don't delete a buffer still in use */
|
||||
ASSERT(ctx->Array.ArrayBufferObj != bufObj);
|
||||
ASSERT(ctx->Array.ElementArrayBufferObj != bufObj);
|
||||
ASSERT(ctx->Array.ArrayObj->Vertex.BufferObj != bufObj);
|
||||
ASSERT(ctx->Driver.DeleteBuffer);
|
||||
ctx->Driver.DeleteBuffer(ctx, bufObj);
|
||||
|
||||
ctx->Driver.DeleteBuffer(ctx, oldObj);
|
||||
}
|
||||
|
||||
*ptr = NULL;
|
||||
}
|
||||
ASSERT(!*ptr);
|
||||
|
||||
if (bufObj) {
|
||||
/* reference new texture */
|
||||
/*_glthread_LOCK_MUTEX(tex->Mutex);*/
|
||||
if (bufObj->RefCount == 0) {
|
||||
/* this buffer's being deleted (look just above) */
|
||||
/* Not sure this can every really happen. Warn if it does. */
|
||||
_mesa_problem(NULL, "referencing deleted buffer object");
|
||||
*ptr = NULL;
|
||||
}
|
||||
else {
|
||||
bufObj->RefCount++;
|
||||
#if 0
|
||||
printf("BufferObj %p %d INCR to %d\n",
|
||||
(void *) bufObj, bufObj->Name, bufObj->RefCount);
|
||||
#endif
|
||||
*ptr = bufObj;
|
||||
}
|
||||
/*_glthread_UNLOCK_MUTEX(tex->Mutex);*/
|
||||
}
|
||||
}
|
||||
|
||||
@@ -203,33 +256,6 @@ _mesa_initialize_buffer_object( struct gl_buffer_object *obj,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add the given buffer object to the buffer object pool.
|
||||
*/
|
||||
void
|
||||
_mesa_save_buffer_object( GLcontext *ctx, struct gl_buffer_object *obj )
|
||||
{
|
||||
if (obj->Name > 0) {
|
||||
/* insert into hash table */
|
||||
_mesa_HashInsert(ctx->Shared->BufferObjects, obj->Name, obj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove the given buffer object from the buffer object pool.
|
||||
* Do not deallocate the buffer object though.
|
||||
*/
|
||||
void
|
||||
_mesa_remove_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj )
|
||||
{
|
||||
if (bufObj->Name > 0) {
|
||||
/* remove from hash table */
|
||||
_mesa_HashRemove(ctx->Shared->BufferObjects, bufObj->Name);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Allocate space for and store data in a buffer object. Any data that was
|
||||
* previously stored in the buffer object is lost. If \c data is \c NULL,
|
||||
@@ -400,6 +426,7 @@ _mesa_init_buffer_objects( GLcontext *ctx )
|
||||
{
|
||||
/* Allocate the default buffer object and set refcount so high that
|
||||
* it never gets deleted.
|
||||
* XXX with recent/improved refcounting this may not longer be needed.
|
||||
*/
|
||||
ctx->Array.NullBufferObj = _mesa_new_buffer_object(ctx, 0, 0);
|
||||
if (ctx->Array.NullBufferObj)
|
||||
@@ -462,28 +489,16 @@ bind_buffer_object(GLcontext *ctx, GLenum target, GLuint buffer)
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glBindBufferARB");
|
||||
return;
|
||||
}
|
||||
_mesa_save_buffer_object(ctx, newBufObj);
|
||||
_mesa_HashInsert(ctx->Shared->BufferObjects, buffer, newBufObj);
|
||||
}
|
||||
}
|
||||
|
||||
/* Make new binding */
|
||||
*bindTarget = newBufObj;
|
||||
newBufObj->RefCount++;
|
||||
/* bind new buffer */
|
||||
_mesa_reference_buffer_object(ctx, bindTarget, newBufObj);
|
||||
|
||||
/* Pass BindBuffer call to device driver */
|
||||
if (ctx->Driver.BindBuffer && newBufObj)
|
||||
ctx->Driver.BindBuffer( ctx, target, newBufObj );
|
||||
|
||||
/* decr ref count on old buffer obj, delete if needed */
|
||||
if (oldBufObj) {
|
||||
oldBufObj->RefCount--;
|
||||
assert(oldBufObj->RefCount >= 0);
|
||||
if (oldBufObj->RefCount == 0) {
|
||||
assert(oldBufObj->Name != 0);
|
||||
ASSERT(ctx->Driver.DeleteBuffer);
|
||||
ctx->Driver.DeleteBuffer( ctx, oldBufObj );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -716,6 +731,23 @@ _mesa_lookup_bufferobj(GLcontext *ctx, GLuint buffer)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* If *ptr points to obj, set ptr = the Null/default buffer object.
|
||||
* This is a helper for buffer object deletion.
|
||||
* The GL spec says that deleting a buffer object causes it to get
|
||||
* unbound from all arrays in the current context.
|
||||
*/
|
||||
static void
|
||||
unbind(GLcontext *ctx,
|
||||
struct gl_buffer_object **ptr,
|
||||
struct gl_buffer_object *obj)
|
||||
{
|
||||
if (*ptr == obj) {
|
||||
_mesa_reference_buffer_object(ctx, ptr, ctx->Array.NullBufferObj);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**********************************************************************/
|
||||
/* API Functions */
|
||||
@@ -759,54 +791,18 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
|
||||
|
||||
ASSERT(bufObj->Name == ids[i]);
|
||||
|
||||
if (ctx->Array.ArrayObj->Vertex.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->Vertex.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->Normal.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->Normal.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->Color.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->Color.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->SecondaryColor.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->SecondaryColor.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->FogCoord.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->FogCoord.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->Index.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->Index.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
if (ctx->Array.ArrayObj->EdgeFlag.BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->EdgeFlag.BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
unbind(ctx, &ctx->Array.ArrayObj->Vertex.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->Normal.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->Color.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->SecondaryColor.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->FogCoord.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->Index.BufferObj, bufObj);
|
||||
unbind(ctx, &ctx->Array.ArrayObj->EdgeFlag.BufferObj, bufObj);
|
||||
for (j = 0; j < MAX_TEXTURE_UNITS; j++) {
|
||||
if (ctx->Array.ArrayObj->TexCoord[j].BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->TexCoord[j].BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
unbind(ctx, &ctx->Array.ArrayObj->TexCoord[j].BufferObj, bufObj);
|
||||
}
|
||||
for (j = 0; j < VERT_ATTRIB_MAX; j++) {
|
||||
if (ctx->Array.ArrayObj->VertexAttrib[j].BufferObj == bufObj) {
|
||||
bufObj->RefCount--;
|
||||
ctx->Array.ArrayObj->VertexAttrib[j].BufferObj = ctx->Array.NullBufferObj;
|
||||
ctx->Array.NullBufferObj->RefCount++;
|
||||
}
|
||||
unbind(ctx, &ctx->Array.ArrayObj->VertexAttrib[j].BufferObj, bufObj);
|
||||
}
|
||||
|
||||
if (ctx->Array.ArrayBufferObj == bufObj) {
|
||||
@@ -824,8 +820,8 @@ _mesa_DeleteBuffersARB(GLsizei n, const GLuint *ids)
|
||||
}
|
||||
|
||||
/* The ID is immediately freed for re-use */
|
||||
_mesa_remove_buffer_object(ctx, bufObj);
|
||||
_mesa_unbind_buffer_object(ctx, bufObj);
|
||||
_mesa_HashRemove(ctx->Shared->BufferObjects, bufObj->Name);
|
||||
_mesa_reference_buffer_object(ctx, &bufObj, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -874,7 +870,7 @@ _mesa_GenBuffersARB(GLsizei n, GLuint *buffer)
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenBuffersARB");
|
||||
return;
|
||||
}
|
||||
_mesa_save_buffer_object(ctx, bufObj);
|
||||
_mesa_HashInsert(ctx->Shared->BufferObjects, first + i, bufObj);
|
||||
buffer[i] = first + i;
|
||||
}
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
@@ -55,10 +55,9 @@ _mesa_initialize_buffer_object( struct gl_buffer_object *obj,
|
||||
GLuint name, GLenum target );
|
||||
|
||||
extern void
|
||||
_mesa_save_buffer_object( GLcontext *ctx, struct gl_buffer_object *obj );
|
||||
|
||||
extern void
|
||||
_mesa_remove_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj );
|
||||
_mesa_reference_buffer_object(GLcontext *ctx,
|
||||
struct gl_buffer_object **ptr,
|
||||
struct gl_buffer_object *bufObj);
|
||||
|
||||
extern void
|
||||
_mesa_buffer_data( GLcontext *ctx, GLenum target, GLsizeiptrARB size,
|
||||
@@ -118,8 +117,6 @@ _mesa_unmap_readpix_pbo(GLcontext *ctx,
|
||||
const struct gl_pixelstore_attrib *pack);
|
||||
|
||||
|
||||
extern void
|
||||
_mesa_unbind_buffer_object( GLcontext *ctx, struct gl_buffer_object *bufObj );
|
||||
|
||||
/*
|
||||
* API functions
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.1
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -491,13 +491,13 @@ _mesa_update_framebuffer_visual(struct gl_framebuffer *fb)
|
||||
if (fb->Attachment[BUFFER_ACCUM].Renderbuffer) {
|
||||
fb->Visual.haveAccumBuffer = GL_TRUE;
|
||||
fb->Visual.accumRedBits
|
||||
= fb->Attachment[BUFFER_DEPTH].Renderbuffer->RedBits;
|
||||
= fb->Attachment[BUFFER_ACCUM].Renderbuffer->RedBits;
|
||||
fb->Visual.accumGreenBits
|
||||
= fb->Attachment[BUFFER_DEPTH].Renderbuffer->GreenBits;
|
||||
= fb->Attachment[BUFFER_ACCUM].Renderbuffer->GreenBits;
|
||||
fb->Visual.accumBlueBits
|
||||
= fb->Attachment[BUFFER_DEPTH].Renderbuffer->BlueBits;
|
||||
= fb->Attachment[BUFFER_ACCUM].Renderbuffer->BlueBits;
|
||||
fb->Visual.accumAlphaBits
|
||||
= fb->Attachment[BUFFER_DEPTH].Renderbuffer->AlphaBits;
|
||||
= fb->Attachment[BUFFER_ACCUM].Renderbuffer->AlphaBits;
|
||||
}
|
||||
|
||||
compute_depth_max(fb);
|
||||
|
@@ -85,7 +85,7 @@ compute_version(const GLcontext *ctx)
|
||||
ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
ctx->Extensions.EXT_blend_equation_separate);
|
||||
const GLboolean ver_2_1 = (ver_2_0 &&
|
||||
ctx->Extensions.ARB_shading_language_120 &&
|
||||
/*ctx->Extensions.ARB_shading_language_120 &&*/
|
||||
ctx->Extensions.EXT_pixel_buffer_object &&
|
||||
ctx->Extensions.EXT_texture_sRGB);
|
||||
if (ver_2_1)
|
||||
@@ -121,12 +121,6 @@ _mesa_GetString( GLenum name )
|
||||
static const char *vendor = "Brian Paul";
|
||||
static const char *renderer = "Mesa";
|
||||
|
||||
#if FEATURE_ARB_shading_language_120_foo /* support not complete! */
|
||||
static const char *sl_version = "1.20";
|
||||
#elif FEATURE_ARB_shading_language_100
|
||||
static const char *sl_version = "1.10";
|
||||
#endif
|
||||
|
||||
if (!ctx)
|
||||
return NULL;
|
||||
|
||||
@@ -154,8 +148,10 @@ _mesa_GetString( GLenum name )
|
||||
return (const GLubyte *) ctx->Extensions.String;
|
||||
#if FEATURE_ARB_shading_language_100
|
||||
case GL_SHADING_LANGUAGE_VERSION_ARB:
|
||||
if (ctx->Extensions.ARB_shading_language_100)
|
||||
return (const GLubyte *) sl_version;
|
||||
if (ctx->Extensions.ARB_shading_language_120)
|
||||
return (const GLubyte *) "1.20";
|
||||
else if (ctx->Extensions.ARB_shading_language_100)
|
||||
return (const GLubyte *) "1.10";
|
||||
goto error;
|
||||
#endif
|
||||
#if FEATURE_NV_fragment_program || FEATURE_ARB_fragment_program || \
|
||||
|
@@ -559,7 +559,7 @@ _mesa_pow(double x, double y)
|
||||
int
|
||||
_mesa_ffs(int i)
|
||||
{
|
||||
#if (defined(_WIN32) && !defined(__MINGW32__) ) || defined(__IBMC__) || defined(__IBMCPP__)
|
||||
#if (defined(_WIN32) ) || defined(__IBMC__) || defined(__IBMCPP__)
|
||||
register int bit = 0;
|
||||
if (i != 0) {
|
||||
if ((i & 0xffff) == 0) {
|
||||
|
@@ -184,6 +184,7 @@ _mesa_Lightfv( GLenum light, GLenum pname, const GLfloat *params )
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLint i = (GLint) (light - GL_LIGHT0);
|
||||
GLfloat temp[4];
|
||||
ASSERT_OUTSIDE_BEGIN_END(ctx);
|
||||
|
||||
if (i < 0 || i >= (GLint) ctx->Const.MaxLights) {
|
||||
_mesa_error( ctx, GL_INVALID_ENUM, "glLight(light=0x%x)", light );
|
||||
|
@@ -1207,6 +1207,30 @@ const struct gl_texture_format _mesa_texformat_z24_s8 = {
|
||||
store_texel_z24_s8 /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_s8_z24 = {
|
||||
MESA_FORMAT_S8_Z24, /* MesaFormat */
|
||||
GL_DEPTH_STENCIL_EXT, /* BaseFormat */
|
||||
GL_UNSIGNED_NORMALIZED_ARB, /* DataType */
|
||||
0, /* RedBits */
|
||||
0, /* GreenBits */
|
||||
0, /* BlueBits */
|
||||
0, /* AlphaBits */
|
||||
0, /* LuminanceBits */
|
||||
0, /* IntensityBits */
|
||||
0, /* IndexBits */
|
||||
24, /* DepthBits */
|
||||
8, /* StencilBits */
|
||||
4, /* TexelBytes */
|
||||
_mesa_texstore_s8_z24, /* StoreTexImageFunc */
|
||||
NULL, /* FetchTexel1D */
|
||||
NULL, /* FetchTexel2D */
|
||||
NULL, /* FetchTexel3D */
|
||||
fetch_texel_1d_f_s8_z24, /* FetchTexel1Df */
|
||||
fetch_texel_2d_f_s8_z24, /* FetchTexel2Df */
|
||||
fetch_texel_3d_f_s8_z24, /* FetchTexel3Df */
|
||||
store_texel_s8_z24 /* StoreTexel */
|
||||
};
|
||||
|
||||
const struct gl_texture_format _mesa_texformat_z16 = {
|
||||
MESA_FORMAT_Z16, /* MesaFormat */
|
||||
GL_DEPTH_COMPONENT, /* BaseFormat */
|
||||
|
@@ -84,6 +84,7 @@ enum _format {
|
||||
MESA_FORMAT_YCBCR, /* YYYY YYYY UorV UorV */
|
||||
MESA_FORMAT_YCBCR_REV, /* UorV UorV YYYY YYYY */
|
||||
MESA_FORMAT_Z24_S8, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ SSSS SSSS */
|
||||
MESA_FORMAT_S8_Z24, /* SSSS SSSS ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
|
||||
MESA_FORMAT_Z16, /* ZZZZ ZZZZ ZZZZ ZZZZ */
|
||||
MESA_FORMAT_Z32, /* ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ ZZZZ */
|
||||
/*@}*/
|
||||
@@ -211,6 +212,7 @@ extern const struct gl_texture_format _mesa_texformat_l8;
|
||||
extern const struct gl_texture_format _mesa_texformat_i8;
|
||||
extern const struct gl_texture_format _mesa_texformat_ci8;
|
||||
extern const struct gl_texture_format _mesa_texformat_z24_s8;
|
||||
extern const struct gl_texture_format _mesa_texformat_s8_z24;
|
||||
extern const struct gl_texture_format _mesa_texformat_z16;
|
||||
extern const struct gl_texture_format _mesa_texformat_z32;
|
||||
/*@}*/
|
||||
|
@@ -1117,6 +1117,7 @@ static void FETCH(ci8)( const struct gl_texture_image *texImage,
|
||||
break;;
|
||||
default:
|
||||
_mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
|
||||
return;
|
||||
}
|
||||
#if CHAN_TYPE == GL_UNSIGNED_BYTE
|
||||
COPY_4UBV(texel, texelUB);
|
||||
@@ -1363,6 +1364,32 @@ static void store_texel_z24_s8(struct gl_texture_image *texImage,
|
||||
#endif
|
||||
|
||||
|
||||
/* MESA_TEXFORMAT_S8_Z24 ***************************************************/
|
||||
|
||||
static void FETCH(f_s8_z24)( const struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, GLfloat *texel )
|
||||
{
|
||||
/* only return Z, not stencil data */
|
||||
const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
|
||||
const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
|
||||
texel[0] = ((*src) & 0x00ffffff) * scale;
|
||||
ASSERT(texImage->TexFormat->MesaFormat == MESA_FORMAT_S8_Z24);
|
||||
ASSERT(texel[0] >= 0.0F);
|
||||
ASSERT(texel[0] <= 1.0F);
|
||||
}
|
||||
|
||||
#if DIM == 3
|
||||
static void store_texel_s8_z24(struct gl_texture_image *texImage,
|
||||
GLint i, GLint j, GLint k, const void *texel)
|
||||
{
|
||||
/* only store Z, not stencil */
|
||||
GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
|
||||
GLfloat depth = *((GLfloat *) texel);
|
||||
GLuint zi = (GLuint) (depth * 0xffffff);
|
||||
*dst = zi | (*dst & 0xff000000);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#undef TEXEL_ADDR
|
||||
#undef DIM
|
||||
|
@@ -2445,6 +2445,87 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Store a combined depth/stencil texture image.
|
||||
*/
|
||||
GLboolean
|
||||
_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
|
||||
{
|
||||
const GLuint depthScale = 0xffffff;
|
||||
const GLint srcRowStride
|
||||
= _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
|
||||
/ sizeof(GLuint);
|
||||
GLint img, row;
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_s8_z24);
|
||||
ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
|
||||
ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
|
||||
|
||||
/* Incase we only upload depth we need to preserve the stencil */
|
||||
if (srcFormat == GL_DEPTH_COMPONENT) {
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLuint *dstRow = (GLuint *) dstAddr
|
||||
+ dstImageOffsets[dstZoffset + img]
|
||||
+ dstYoffset * dstRowStride / sizeof(GLuint)
|
||||
+ dstXoffset;
|
||||
const GLuint *src
|
||||
= (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
|
||||
srcWidth, srcHeight,
|
||||
srcFormat, srcType,
|
||||
img, 0, 0);
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLuint depth[MAX_WIDTH];
|
||||
GLint i;
|
||||
_mesa_unpack_depth_span(ctx, srcWidth,
|
||||
GL_UNSIGNED_INT, /* dst type */
|
||||
depth, /* dst addr */
|
||||
depthScale,
|
||||
srcType, src, srcPacking);
|
||||
|
||||
for (i = 0; i < srcWidth; i++)
|
||||
dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
|
||||
|
||||
src += srcRowStride;
|
||||
dstRow += dstRowStride / sizeof(GLuint);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
for (img = 0; img < srcDepth; img++) {
|
||||
GLuint *dstRow = (GLuint *) dstAddr
|
||||
+ dstImageOffsets[dstZoffset + img]
|
||||
+ dstYoffset * dstRowStride / sizeof(GLuint)
|
||||
+ dstXoffset;
|
||||
const GLuint *src
|
||||
= (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
|
||||
srcWidth, srcHeight,
|
||||
srcFormat, srcType,
|
||||
img, 0, 0);
|
||||
for (row = 0; row < srcHeight; row++) {
|
||||
GLubyte stencil[MAX_WIDTH];
|
||||
GLint i;
|
||||
/* the 24 depth bits will be in the low position: */
|
||||
_mesa_unpack_depth_span(ctx, srcWidth,
|
||||
GL_UNSIGNED_INT, /* dst type */
|
||||
dstRow, /* dst addr */
|
||||
depthScale,
|
||||
srcType, src, srcPacking);
|
||||
/* get the 8-bit stencil values */
|
||||
_mesa_unpack_stencil_span(ctx, srcWidth,
|
||||
GL_UNSIGNED_BYTE, /* dst type */
|
||||
stencil, /* dst addr */
|
||||
srcType, src, srcPacking,
|
||||
ctx->_ImageTransferState);
|
||||
/* merge stencil values into depth values */
|
||||
for (i = 0; i < srcWidth; i++)
|
||||
dstRow[i] |= stencil[i] << 24;
|
||||
|
||||
src += srcRowStride;
|
||||
dstRow += dstRowStride / sizeof(GLuint);
|
||||
}
|
||||
}
|
||||
}
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Store an image in any of the formats:
|
||||
|
@@ -57,6 +57,7 @@ extern GLboolean _mesa_texstore_a8(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_ci8(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_ycbcr(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_z24_s8(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_s8_z24(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_z16(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_z32(TEXSTORE_PARAMS);
|
||||
extern GLboolean _mesa_texstore_rgba_float32(TEXSTORE_PARAMS);
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -62,14 +62,9 @@ update_array(GLcontext *ctx, struct gl_client_array *array,
|
||||
array->Normalized = normalized;
|
||||
array->Ptr = (const GLubyte *) ptr;
|
||||
#if FEATURE_ARB_vertex_buffer_object
|
||||
array->BufferObj->RefCount--;
|
||||
if (array->BufferObj->RefCount <= 0) {
|
||||
ASSERT(array->BufferObj->Name);
|
||||
_mesa_remove_buffer_object( ctx, array->BufferObj );
|
||||
(*ctx->Driver.DeleteBuffer)( ctx, array->BufferObj );
|
||||
}
|
||||
array->BufferObj = ctx->Array.ArrayBufferObj;
|
||||
array->BufferObj->RefCount++;
|
||||
_mesa_reference_buffer_object(ctx, &array->BufferObj,
|
||||
ctx->Array.ArrayBufferObj);
|
||||
|
||||
/* Compute the index of the last array element that's inside the buffer.
|
||||
* Later in glDrawArrays we'll check if start + count > _MaxElement to
|
||||
* be sure we won't go out of bounds.
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 7.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -29,9 +29,9 @@
|
||||
|
||||
/* Mesa version */
|
||||
#define MESA_MAJOR 7
|
||||
#define MESA_MINOR 1
|
||||
#define MESA_MINOR 2
|
||||
#define MESA_PATCH 0
|
||||
#define MESA_VERSION_STRING "7.1 rc4"
|
||||
#define MESA_VERSION_STRING "7.2"
|
||||
|
||||
/* To make version comparison easy */
|
||||
#define MESA_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
|
||||
|
@@ -29,9 +29,9 @@
|
||||
*/
|
||||
|
||||
|
||||
#include "glheader.h"
|
||||
#include "imports.h"
|
||||
#include "macros.h"
|
||||
#include "main/glheader.h"
|
||||
#include "main/imports.h"
|
||||
#include "main/macros.h"
|
||||
#include "prog_instruction.h"
|
||||
#include "prog_parameter.h"
|
||||
#include "prog_statevars.h"
|
||||
@@ -277,6 +277,26 @@ _mesa_add_uniform(struct gl_program_parameter_list *paramList,
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Mark the named uniform as 'used'.
|
||||
*/
|
||||
void
|
||||
_mesa_use_uniform(struct gl_program_parameter_list *paramList,
|
||||
const char *name)
|
||||
{
|
||||
GLuint i;
|
||||
for (i = 0; i < paramList->NumParameters; i++) {
|
||||
struct gl_program_parameter *p = paramList->Parameters + i;
|
||||
if (p->Type == PROGRAM_UNIFORM && _mesa_strcmp(p->Name, name) == 0) {
|
||||
p->Used = GL_TRUE;
|
||||
/* Note that large uniforms may occupy several slots so we're
|
||||
* not done searching yet.
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Add a sampler to the parameter list.
|
||||
* \param name uniform's name
|
||||
@@ -591,21 +611,24 @@ _mesa_clone_parameter_list(const struct gl_program_parameter_list *list)
|
||||
/** Not too efficient, but correct */
|
||||
for (i = 0; i < list->NumParameters; i++) {
|
||||
struct gl_program_parameter *p = list->Parameters + i;
|
||||
struct gl_program_parameter *pCopy;
|
||||
GLuint size = MIN2(p->Size, 4);
|
||||
GLint j = _mesa_add_parameter(clone, p->Type, p->Name, size, p->DataType,
|
||||
list->ParameterValues[i], NULL);
|
||||
ASSERT(j >= 0);
|
||||
pCopy = clone->Parameters + j;
|
||||
pCopy->Used = p->Used;
|
||||
/* copy state indexes */
|
||||
if (p->Type == PROGRAM_STATE_VAR) {
|
||||
GLint k;
|
||||
struct gl_program_parameter *q = clone->Parameters + j;
|
||||
for (k = 0; k < STATE_LENGTH; k++) {
|
||||
q->StateIndexes[k] = p->StateIndexes[k];
|
||||
pCopy->StateIndexes[k] = p->StateIndexes[k];
|
||||
}
|
||||
}
|
||||
else {
|
||||
clone->Parameters[j].Size = p->Size;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
clone->StateFlags = list->StateFlags;
|
||||
|
@@ -31,7 +31,7 @@
|
||||
#ifndef PROG_PARAMETER_H
|
||||
#define PROG_PARAMETER_H
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "main/mtypes.h"
|
||||
#include "prog_statevars.h"
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ struct gl_program_parameter
|
||||
enum register_file Type; /**< PROGRAM_NAMED_PARAM, CONSTANT or STATE_VAR */
|
||||
GLenum DataType; /**< GL_FLOAT, GL_FLOAT_VEC2, etc */
|
||||
GLuint Size; /**< Number of components (1..4) */
|
||||
GLboolean Used; /**< Helper flag for GLSL uniform tracking */
|
||||
/**
|
||||
* A sequence of STATE_* tokens and integers to identify GL state.
|
||||
*/
|
||||
@@ -112,6 +113,10 @@ extern GLint
|
||||
_mesa_add_uniform(struct gl_program_parameter_list *paramList,
|
||||
const char *name, GLuint size, GLenum datatype);
|
||||
|
||||
extern void
|
||||
_mesa_use_uniform(struct gl_program_parameter_list *paramList,
|
||||
const char *name);
|
||||
|
||||
extern GLint
|
||||
_mesa_add_sampler(struct gl_program_parameter_list *paramList,
|
||||
const char *name, GLenum datatype);
|
||||
|
@@ -473,32 +473,33 @@ vec4 pow(const vec4 a, const vec4 b)
|
||||
|
||||
float exp(const float a)
|
||||
{
|
||||
const float e = 2.71828;
|
||||
__asm float_power __retVal, e, a;
|
||||
// NOTE: log2(e) = 1.44269502
|
||||
float t = a * 1.44269502;
|
||||
__asm float_exp2 __retVal, t;
|
||||
}
|
||||
|
||||
vec2 exp(const vec2 a)
|
||||
{
|
||||
const float e = 2.71828;
|
||||
__asm float_power __retVal.x, e, a.x;
|
||||
__asm float_power __retVal.y, e, a.y;
|
||||
vec2 t = a * 1.44269502;
|
||||
__asm float_exp2 __retVal.x, t.x;
|
||||
__asm float_exp2 __retVal.y, t.y;
|
||||
}
|
||||
|
||||
vec3 exp(const vec3 a)
|
||||
{
|
||||
const float e = 2.71828;
|
||||
__asm float_power __retVal.x, e, a.x;
|
||||
__asm float_power __retVal.y, e, a.y;
|
||||
__asm float_power __retVal.z, e, a.z;
|
||||
vec3 t = a * 1.44269502;
|
||||
__asm float_exp2 __retVal.x, t.x;
|
||||
__asm float_exp2 __retVal.y, t.y;
|
||||
__asm float_exp2 __retVal.z, t.z;
|
||||
}
|
||||
|
||||
vec4 exp(const vec4 a)
|
||||
{
|
||||
const float e = 2.71828;
|
||||
__asm float_power __retVal.x, e, a.x;
|
||||
__asm float_power __retVal.y, e, a.y;
|
||||
__asm float_power __retVal.z, e, a.z;
|
||||
__asm float_power __retVal.w, e, a.w;
|
||||
vec4 t = a * 1.44269502;
|
||||
__asm float_exp2 __retVal.x, t.x;
|
||||
__asm float_exp2 __retVal.y, t.y;
|
||||
__asm float_exp2 __retVal.z, t.z;
|
||||
__asm float_exp2 __retVal.w, t.w;
|
||||
}
|
||||
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1481,7 +1481,7 @@ _slang_simple_writemask(GLuint writemask, GLuint swizzle)
|
||||
* \return GL_FALSE for simple writemasks, GL_TRUE for non-simple
|
||||
*/
|
||||
static GLboolean
|
||||
swizzle_to_writemask(GLuint swizzle,
|
||||
swizzle_to_writemask(slang_assemble_ctx *A, GLuint swizzle,
|
||||
GLuint *writemaskOut, GLuint *swizzleOut)
|
||||
{
|
||||
GLuint mask = 0x0, newSwizzle[4];
|
||||
@@ -1495,6 +1495,18 @@ swizzle_to_writemask(GLuint swizzle,
|
||||
break;
|
||||
}
|
||||
assert(swz >= 0 && swz <= 3);
|
||||
|
||||
if (swizzle != SWIZZLE_XXXX &&
|
||||
swizzle != SWIZZLE_YYYY &&
|
||||
swizzle != SWIZZLE_ZZZZ &&
|
||||
swizzle != SWIZZLE_WWWW &&
|
||||
(mask & (1 << swz))) {
|
||||
/* a channel can't be specified twice (ex: ".xyyz") */
|
||||
slang_info_log_error(A->log, "Invalid writemask '%s'",
|
||||
_mesa_swizzle_string(swizzle, 0, 0));
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
mask |= (1 << swz);
|
||||
}
|
||||
assert(mask <= 0xf);
|
||||
@@ -1590,11 +1602,11 @@ resolve_swizzle(const slang_operation *oper)
|
||||
* As above, but produce a writemask.
|
||||
*/
|
||||
static GLuint
|
||||
resolve_writemask(const slang_operation *oper)
|
||||
resolve_writemask(slang_assemble_ctx *A, const slang_operation *oper)
|
||||
{
|
||||
GLuint swizzle = resolve_swizzle(oper);
|
||||
GLuint writemask, swizzleOut;
|
||||
swizzle_to_writemask(swizzle, &writemask, &swizzleOut);
|
||||
swizzle_to_writemask(A, swizzle, &writemask, &swizzleOut);
|
||||
return writemask;
|
||||
}
|
||||
|
||||
@@ -1668,7 +1680,7 @@ _slang_gen_asm(slang_assemble_ctx *A, slang_operation *oper,
|
||||
|
||||
dest_oper = &oper->children[0];
|
||||
|
||||
writemask = resolve_writemask(dest_oper);
|
||||
writemask = resolve_writemask(A, dest_oper);
|
||||
|
||||
n0 = _slang_gen_operation(A, dest_oper);
|
||||
if (!n0)
|
||||
@@ -1980,6 +1992,12 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
|
||||
fun = _slang_locate_struct_constructor(A, name);
|
||||
}
|
||||
|
||||
/*
|
||||
* At this point, some heuristics are used to try to find a function
|
||||
* that matches the calling signature by means of casting or "unrolling"
|
||||
* of constructors.
|
||||
*/
|
||||
|
||||
if (!fun && _slang_is_vec_mat_type(name)) {
|
||||
/* Next, if this call looks like a vec() or mat() constructor call,
|
||||
* try "unwinding" the args to satisfy a constructor.
|
||||
@@ -1995,7 +2013,7 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
|
||||
}
|
||||
}
|
||||
|
||||
if (!fun) {
|
||||
if (!fun && _slang_is_vec_mat_type(name)) {
|
||||
/* Next, try casting args to the types of the formal parameters */
|
||||
int numArgs = oper->num_children;
|
||||
fun = _slang_find_function_by_argc(A->space.funcs, name, numArgs);
|
||||
@@ -2008,6 +2026,13 @@ _slang_gen_function_call_name(slang_assemble_ctx *A, const char *name,
|
||||
assert(fun);
|
||||
}
|
||||
|
||||
if (!fun) {
|
||||
slang_info_log_error(A->log,
|
||||
"Function '%s' not found (check argument types)",
|
||||
name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
n = _slang_gen_function_call(A, fun, oper, dest);
|
||||
|
||||
if (n && !n->Store && !dest
|
||||
@@ -2716,7 +2741,11 @@ _slang_assignment_compatible(slang_assemble_ctx *A,
|
||||
slang_typeinfo t0, t1;
|
||||
GLuint sz0, sz1;
|
||||
|
||||
|
||||
if (op0->type == SLANG_OPER_POSTINCREMENT ||
|
||||
op0->type == SLANG_OPER_POSTDECREMENT) {
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
slang_typeinfo_construct(&t0);
|
||||
_slang_typeof_operation(A, op0, &t0);
|
||||
|
||||
@@ -3020,7 +3049,7 @@ _slang_gen_assignment(slang_assemble_ctx * A, slang_operation *oper)
|
||||
if (lhs && rhs) {
|
||||
/* convert lhs swizzle into writemask */
|
||||
GLuint writemask, newSwizzle;
|
||||
if (!swizzle_to_writemask(lhs->Store->Swizzle,
|
||||
if (!swizzle_to_writemask(A, lhs->Store->Swizzle,
|
||||
&writemask, &newSwizzle)) {
|
||||
/* Non-simple writemask, need to swizzle right hand side in
|
||||
* order to put components into the right place.
|
||||
|
@@ -108,7 +108,9 @@ writemask_to_swizzle(GLuint writemask)
|
||||
|
||||
|
||||
/**
|
||||
* Swizzle a swizzle. That is, return swz2(swz1)
|
||||
* Swizzle a swizzle (function composition).
|
||||
* That is, return swz2(swz1), or said another way: swz1.szw2
|
||||
* Example: swizzle_swizzle(".zwxx", ".xxyw") yields ".zzwx"
|
||||
*/
|
||||
GLuint
|
||||
_slang_swizzle_swizzle(GLuint swz1, GLuint swz2)
|
||||
@@ -279,7 +281,7 @@ storage_to_src_reg(struct prog_src_register *src, const slang_ir_storage *st)
|
||||
while (st->Parent) {
|
||||
st = st->Parent;
|
||||
index += st->Index;
|
||||
swizzle = _slang_swizzle_swizzle(st->Swizzle, swizzle);
|
||||
swizzle = _slang_swizzle_swizzle(fix_swizzle(st->Swizzle), swizzle);
|
||||
}
|
||||
|
||||
assert(st->File >= 0);
|
||||
@@ -1636,6 +1638,88 @@ emit_struct_field(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Emit code for a variable declaration.
|
||||
* This usually doesn't result in any code generation, but just
|
||||
* memory allocation.
|
||||
*/
|
||||
static struct prog_instruction *
|
||||
emit_var_decl(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
{
|
||||
struct prog_instruction *inst;
|
||||
|
||||
assert(n->Store);
|
||||
assert(n->Store->File != PROGRAM_UNDEFINED);
|
||||
assert(n->Store->Size > 0);
|
||||
/*assert(n->Store->Index < 0);*/
|
||||
|
||||
if (!n->Var || n->Var->isTemp) {
|
||||
/* a nameless/temporary variable, will be freed after first use */
|
||||
/*NEW*/
|
||||
if (n->Store->Index < 0 && !_slang_alloc_temp(emitInfo->vt, n->Store)) {
|
||||
slang_info_log_error(emitInfo->log,
|
||||
"Ran out of registers, too many temporaries");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* a regular variable */
|
||||
_slang_add_variable(emitInfo->vt, n->Var);
|
||||
if (!_slang_alloc_var(emitInfo->vt, n->Store)) {
|
||||
slang_info_log_error(emitInfo->log,
|
||||
"Ran out of registers, too many variables");
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
printf("IR_VAR_DECL %s %d store %p\n",
|
||||
(char*) n->Var->a_name, n->Store->Index, (void*) n->Store);
|
||||
*/
|
||||
assert(n->Var->aux == n->Store);
|
||||
}
|
||||
if (emitInfo->EmitComments) {
|
||||
/* emit NOP with comment describing the variable's storage location */
|
||||
char s[1000];
|
||||
sprintf(s, "TEMP[%d]%s = variable %s (size %d)",
|
||||
n->Store->Index,
|
||||
_mesa_swizzle_string(n->Store->Swizzle, 0, GL_FALSE),
|
||||
(n->Var ? (char *) n->Var->a_name : "anonymous"),
|
||||
n->Store->Size);
|
||||
inst = emit_comment(emitInfo, s);
|
||||
return inst;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Emit code for a reference to a variable.
|
||||
* Actually, no code is generated but we may do some memory alloation.
|
||||
* In particular, state vars (uniforms) are allocated on an as-needed basis.
|
||||
*/
|
||||
static struct prog_instruction *
|
||||
emit_var_ref(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
{
|
||||
assert(n->Store);
|
||||
assert(n->Store->File != PROGRAM_UNDEFINED);
|
||||
|
||||
if (n->Store->File == PROGRAM_STATE_VAR && n->Store->Index < 0) {
|
||||
n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters);
|
||||
}
|
||||
else if (n->Store->File == PROGRAM_UNIFORM) {
|
||||
/* mark var as used */
|
||||
_mesa_use_uniform(emitInfo->prog->Parameters, (char *) n->Var->a_name);
|
||||
}
|
||||
|
||||
if (n->Store->Index < 0) {
|
||||
/* probably ran out of registers */
|
||||
return NULL;
|
||||
}
|
||||
assert(n->Store->Size > 0);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static struct prog_instruction *
|
||||
emit(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
{
|
||||
@@ -1671,64 +1755,14 @@ emit(slang_emit_info *emitInfo, slang_ir_node *n)
|
||||
|
||||
case IR_VAR_DECL:
|
||||
/* Variable declaration - allocate a register for it */
|
||||
assert(n->Store);
|
||||
assert(n->Store->File != PROGRAM_UNDEFINED);
|
||||
assert(n->Store->Size > 0);
|
||||
/*assert(n->Store->Index < 0);*/
|
||||
if (!n->Var || n->Var->isTemp) {
|
||||
/* a nameless/temporary variable, will be freed after first use */
|
||||
/*NEW*/
|
||||
if (n->Store->Index < 0 && !_slang_alloc_temp(emitInfo->vt, n->Store)) {
|
||||
slang_info_log_error(emitInfo->log,
|
||||
"Ran out of registers, too many temporaries");
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* a regular variable */
|
||||
_slang_add_variable(emitInfo->vt, n->Var);
|
||||
if (!_slang_alloc_var(emitInfo->vt, n->Store)) {
|
||||
slang_info_log_error(emitInfo->log,
|
||||
"Ran out of registers, too many variables");
|
||||
return NULL;
|
||||
}
|
||||
/*
|
||||
printf("IR_VAR_DECL %s %d store %p\n",
|
||||
(char*) n->Var->a_name, n->Store->Index, (void*) n->Store);
|
||||
*/
|
||||
assert(n->Var->aux == n->Store);
|
||||
}
|
||||
if (emitInfo->EmitComments) {
|
||||
/* emit NOP with comment describing the variable's storage location */
|
||||
char s[1000];
|
||||
sprintf(s, "TEMP[%d]%s = variable %s (size %d)",
|
||||
n->Store->Index,
|
||||
_mesa_swizzle_string(n->Store->Swizzle, 0, GL_FALSE),
|
||||
(n->Var ? (char *) n->Var->a_name : "anonymous"),
|
||||
n->Store->Size);
|
||||
inst = emit_comment(emitInfo, s);
|
||||
return inst;
|
||||
}
|
||||
return NULL;
|
||||
inst = emit_var_decl(emitInfo, n);
|
||||
return inst;
|
||||
|
||||
case IR_VAR:
|
||||
/* Reference to a variable
|
||||
* Storage should have already been resolved/allocated.
|
||||
*/
|
||||
assert(n->Store);
|
||||
assert(n->Store->File != PROGRAM_UNDEFINED);
|
||||
|
||||
if (n->Store->File == PROGRAM_STATE_VAR &&
|
||||
n->Store->Index < 0) {
|
||||
n->Store->Index = _slang_alloc_statevar(n, emitInfo->prog->Parameters);
|
||||
}
|
||||
|
||||
if (n->Store->Index < 0) {
|
||||
/* probably ran out of registers */
|
||||
return NULL;
|
||||
}
|
||||
assert(n->Store->Size > 0);
|
||||
break;
|
||||
return emit_var_ref(emitInfo, n);
|
||||
|
||||
case IR_ELEMENT:
|
||||
return emit_array_element(emitInfo, n);
|
||||
@@ -1939,6 +1973,7 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
GLboolean success;
|
||||
slang_emit_info emitInfo;
|
||||
GLuint maxUniforms;
|
||||
|
||||
emitInfo.log = log;
|
||||
emitInfo.vt = vt;
|
||||
@@ -1955,6 +1990,19 @@ _slang_emit_code(slang_ir_node *n, slang_var_table *vt,
|
||||
emitInfo.EmitHighLevelInstructions = GL_TRUE;
|
||||
}
|
||||
|
||||
/* Check uniform/constant limits */
|
||||
if (prog->Target == GL_FRAGMENT_PROGRAM_ARB) {
|
||||
maxUniforms = ctx->Const.FragmentProgram.MaxUniformComponents / 4;
|
||||
}
|
||||
else {
|
||||
assert(prog->Target == GL_VERTEX_PROGRAM_ARB);
|
||||
maxUniforms = ctx->Const.VertexProgram.MaxUniformComponents / 4;
|
||||
}
|
||||
if (prog->Parameters->NumParameters > maxUniforms) {
|
||||
slang_info_log_error(log, "Constant/uniform register limit exceeded");
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
(void) emit(&emitInfo, n);
|
||||
|
||||
/* finish up by adding the END opcode to program */
|
||||
|
@@ -173,7 +173,7 @@ link_uniform_vars(struct gl_shader_program *shProg,
|
||||
* Furthermore, we'll need to fix the state-var's size/datatype info.
|
||||
*/
|
||||
|
||||
if (p->Type == PROGRAM_UNIFORM ||
|
||||
if ((p->Type == PROGRAM_UNIFORM && p->Used) ||
|
||||
p->Type == PROGRAM_SAMPLER) {
|
||||
_mesa_append_uniform(shProg->Uniforms, p->Name, prog->Target, i);
|
||||
}
|
||||
|
@@ -342,6 +342,7 @@ lerp_rgba_3d(GLchan result[4], GLfloat a, GLfloat b, GLfloat c,
|
||||
break; \
|
||||
default: \
|
||||
_mesa_problem(ctx, "Bad wrap mode"); \
|
||||
return; \
|
||||
} \
|
||||
}
|
||||
|
||||
@@ -462,6 +463,7 @@ lerp_rgba_3d(GLchan result[4], GLfloat a, GLfloat b, GLfloat c,
|
||||
break; \
|
||||
default: \
|
||||
_mesa_problem(ctx, "Bad wrap mode"); \
|
||||
return; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
@@ -235,7 +235,7 @@ static struct state_key *make_state_key( GLcontext *ctx )
|
||||
*/
|
||||
#define PREFER_DP4 0
|
||||
|
||||
#define MAX_INSN 256
|
||||
#define MAX_INSN 350
|
||||
|
||||
/* Use uregs to represent registers internally, translate to Mesa's
|
||||
* expected formats on emit.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/**************************************************************************
|
||||
|
||||
Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
|
||||
Copyright 2002-2008 Tungsten Graphics Inc., Cedar Park, Texas.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
@@ -31,6 +31,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include "main/glheader.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/context.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/vtxfmt.h"
|
||||
@@ -655,7 +656,10 @@ void vbo_exec_vtx_init( struct vbo_exec_context *exec )
|
||||
/* Allocate a buffer object. Will just reuse this object
|
||||
* continuously.
|
||||
*/
|
||||
exec->vtx.bufferobj = ctx->Array.NullBufferObj;
|
||||
_mesa_reference_buffer_object(ctx,
|
||||
&exec->vtx.bufferobj,
|
||||
ctx->Array.NullBufferObj);
|
||||
|
||||
exec->vtx.buffer_map = ALIGN_MALLOC(VBO_VERT_BUFFER_SIZE * sizeof(GLfloat), 64);
|
||||
|
||||
vbo_exec_vtxfmt_init( exec );
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 5.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -26,6 +26,7 @@
|
||||
*/
|
||||
|
||||
#include "main/glheader.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/context.h"
|
||||
#include "main/enums.h"
|
||||
#include "main/state.h"
|
||||
@@ -155,8 +156,12 @@ static void vbo_exec_bind_arrays( GLcontext *ctx )
|
||||
*/
|
||||
switch (get_program_mode(exec->ctx)) {
|
||||
case VP_NONE:
|
||||
memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0]));
|
||||
memcpy(arrays + 16, vbo->mat_currval, MAT_ATTRIB_MAX * sizeof(arrays[0]));
|
||||
for (attr = 0; attr < 16; attr++) {
|
||||
exec->vtx.inputs[attr] = &vbo->legacy_currval[attr];
|
||||
}
|
||||
for (attr = 0; attr < MAT_ATTRIB_MAX; attr++) {
|
||||
exec->vtx.inputs[attr + 16] = &vbo->mat_currval[attr];
|
||||
}
|
||||
map = vbo->map_vp_none;
|
||||
break;
|
||||
case VP_NV:
|
||||
@@ -165,8 +170,10 @@ static void vbo_exec_bind_arrays( GLcontext *ctx )
|
||||
* occurred. NV vertex programs cannot access material values,
|
||||
* nor attributes greater than VERT_ATTRIB_TEX7.
|
||||
*/
|
||||
memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0]));
|
||||
memcpy(arrays + 16, vbo->generic_currval, 16 * sizeof(arrays[0]));
|
||||
for (attr = 0; attr < 16; attr++) {
|
||||
exec->vtx.inputs[attr] = &vbo->legacy_currval[attr];
|
||||
exec->vtx.inputs[attr + 16] = &vbo->generic_currval[attr];
|
||||
}
|
||||
map = vbo->map_vp_arb;
|
||||
break;
|
||||
}
|
||||
@@ -178,13 +185,18 @@ static void vbo_exec_bind_arrays( GLcontext *ctx )
|
||||
GLuint src = map[attr];
|
||||
|
||||
if (exec->vtx.attrsz[src]) {
|
||||
/* override the default array set above */
|
||||
exec->vtx.inputs[attr] = &arrays[attr];
|
||||
|
||||
arrays[attr].Ptr = (void *)data;
|
||||
arrays[attr].Size = exec->vtx.attrsz[src];
|
||||
arrays[attr].StrideB = exec->vtx.vertex_size * sizeof(GLfloat);
|
||||
arrays[attr].Stride = exec->vtx.vertex_size * sizeof(GLfloat);
|
||||
arrays[attr].Type = GL_FLOAT;
|
||||
arrays[attr].Enabled = 1;
|
||||
arrays[attr].BufferObj = exec->vtx.bufferobj; /* NullBufferObj */
|
||||
_mesa_reference_buffer_object(ctx,
|
||||
&arrays[attr].BufferObj,
|
||||
exec->vtx.bufferobj);
|
||||
arrays[attr]._MaxElement = count; /* ??? */
|
||||
|
||||
data += exec->vtx.attrsz[src] * sizeof(GLfloat);
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.3
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
|
||||
#include "main/mtypes.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/dlist.h"
|
||||
#include "main/vtxfmt.h"
|
||||
#include "main/imports.h"
|
||||
@@ -71,19 +72,24 @@ void vbo_save_destroy( GLcontext *ctx )
|
||||
{
|
||||
struct vbo_context *vbo = vbo_context(ctx);
|
||||
struct vbo_save_context *save = &vbo->save;
|
||||
GLuint i;
|
||||
|
||||
if (save->prim_store) {
|
||||
if ( --save->prim_store->refcount == 0 ) {
|
||||
FREE( save->prim_store );
|
||||
save->prim_store = NULL;
|
||||
}
|
||||
if ( --save->vertex_store->refcount == 0 ) {
|
||||
if (save->vertex_store->bufferobj)
|
||||
ctx->Driver.DeleteBuffer( ctx, save->vertex_store->bufferobj );
|
||||
|
||||
_mesa_reference_buffer_object(ctx,
|
||||
&save->vertex_store->bufferobj, NULL);
|
||||
FREE( save->vertex_store );
|
||||
save->vertex_store = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < VBO_ATTRIB_MAX; i++) {
|
||||
_mesa_reference_buffer_object(ctx, &save->arrays[i].BufferObj, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/**************************************************************************
|
||||
|
||||
Copyright 2002 Tungsten Graphics Inc., Cedar Park, Texas.
|
||||
Copyright 2002-2008 Tungsten Graphics Inc., Cedar Park, Texas.
|
||||
|
||||
All Rights Reserved.
|
||||
|
||||
@@ -68,6 +68,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
#include "main/glheader.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/context.h"
|
||||
#include "main/dlist.h"
|
||||
#include "main/enums.h"
|
||||
@@ -85,6 +86,10 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
#endif
|
||||
|
||||
|
||||
/* An interesting VBO number/name to help with debugging */
|
||||
#define VBO_BUF_ID 12345
|
||||
|
||||
|
||||
/*
|
||||
* NOTE: Old 'parity' issue is gone, but copying can still be
|
||||
* wrong-footed on replay.
|
||||
@@ -170,7 +175,9 @@ static struct vbo_save_vertex_store *alloc_vertex_store( GLcontext *ctx )
|
||||
* user. Perhaps there could be a special number for internal
|
||||
* buffers:
|
||||
*/
|
||||
vertex_store->bufferobj = ctx->Driver.NewBufferObject(ctx, 1, GL_ARRAY_BUFFER_ARB);
|
||||
vertex_store->bufferobj = ctx->Driver.NewBufferObject(ctx,
|
||||
VBO_BUF_ID,
|
||||
GL_ARRAY_BUFFER_ARB);
|
||||
|
||||
ctx->Driver.BufferData( ctx,
|
||||
GL_ARRAY_BUFFER_ARB,
|
||||
@@ -190,8 +197,9 @@ static void free_vertex_store( GLcontext *ctx, struct vbo_save_vertex_store *ver
|
||||
{
|
||||
assert(!vertex_store->buffer);
|
||||
|
||||
if (vertex_store->bufferobj)
|
||||
ctx->Driver.DeleteBuffer( ctx, vertex_store->bufferobj );
|
||||
if (vertex_store->bufferobj) {
|
||||
_mesa_reference_buffer_object(ctx, &vertex_store->bufferobj, NULL);
|
||||
}
|
||||
|
||||
FREE( vertex_store );
|
||||
}
|
||||
@@ -1139,6 +1147,7 @@ void vbo_save_api_init( struct vbo_save_context *save )
|
||||
_save_vtxfmt_init( ctx );
|
||||
_save_current_init( ctx );
|
||||
|
||||
/* These will actually get set again when binding/drawing */
|
||||
for (i = 0; i < VBO_ATTRIB_MAX; i++)
|
||||
save->inputs[i] = &save->arrays[i];
|
||||
|
||||
|
@@ -1,8 +1,8 @@
|
||||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.1
|
||||
* Version: 7.2
|
||||
*
|
||||
* Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -27,6 +27,7 @@
|
||||
*/
|
||||
|
||||
#include "main/glheader.h"
|
||||
#include "main/bufferobj.h"
|
||||
#include "main/context.h"
|
||||
#include "main/imports.h"
|
||||
#include "main/mtypes.h"
|
||||
@@ -115,8 +116,12 @@ static void vbo_bind_vertex_list( GLcontext *ctx,
|
||||
*/
|
||||
switch (get_program_mode(ctx)) {
|
||||
case VP_NONE:
|
||||
memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0]));
|
||||
memcpy(arrays + 16, vbo->mat_currval, MAT_ATTRIB_MAX * sizeof(arrays[0]));
|
||||
for (attr = 0; attr < 16; attr++) {
|
||||
save->inputs[attr] = &vbo->legacy_currval[attr];
|
||||
}
|
||||
for (attr = 0; attr < MAT_ATTRIB_MAX; attr++) {
|
||||
save->inputs[attr + 16] = &vbo->mat_currval[attr];
|
||||
}
|
||||
map = vbo->map_vp_none;
|
||||
break;
|
||||
case VP_NV:
|
||||
@@ -125,8 +130,10 @@ static void vbo_bind_vertex_list( GLcontext *ctx,
|
||||
* occurred. NV vertex programs cannot access material values,
|
||||
* nor attributes greater than VERT_ATTRIB_TEX7.
|
||||
*/
|
||||
memcpy(arrays, vbo->legacy_currval, 16 * sizeof(arrays[0]));
|
||||
memcpy(arrays + 16, vbo->generic_currval, 16 * sizeof(arrays[0]));
|
||||
for (attr = 0; attr < 16; attr++) {
|
||||
save->inputs[attr] = &vbo->legacy_currval[attr];
|
||||
save->inputs[attr + 16] = &vbo->generic_currval[attr];
|
||||
}
|
||||
map = vbo->map_vp_arb;
|
||||
break;
|
||||
}
|
||||
@@ -135,13 +142,18 @@ static void vbo_bind_vertex_list( GLcontext *ctx,
|
||||
GLuint src = map[attr];
|
||||
|
||||
if (node->attrsz[src]) {
|
||||
arrays[attr].Ptr = (const GLubyte *)data;
|
||||
/* override the default array set above */
|
||||
save->inputs[attr] = &arrays[attr];
|
||||
|
||||
arrays[attr].Ptr = (const GLubyte *) data;
|
||||
arrays[attr].Size = node->attrsz[src];
|
||||
arrays[attr].StrideB = node->vertex_size * sizeof(GLfloat);
|
||||
arrays[attr].Stride = node->vertex_size * sizeof(GLfloat);
|
||||
arrays[attr].Type = GL_FLOAT;
|
||||
arrays[attr].Enabled = 1;
|
||||
arrays[attr].BufferObj = node->vertex_store->bufferobj;
|
||||
_mesa_reference_buffer_object(ctx,
|
||||
&arrays[attr].BufferObj,
|
||||
node->vertex_store->bufferobj);
|
||||
arrays[attr]._MaxElement = node->count; /* ??? */
|
||||
|
||||
assert(arrays[attr].BufferObj->Name);
|
||||
|
Reference in New Issue
Block a user