Merge branch 'mesa_7_5_branch'
Conflicts: src/mesa/drivers/dri/i915/i915_tex_layout.c src/mesa/drivers/dri/i965/brw_wm_glsl.c src/mesa/drivers/dri/intel/intel_buffer_objects.c src/mesa/drivers/dri/intel/intel_pixel_bitmap.c src/mesa/drivers/dri/intel/intel_pixel_draw.c src/mesa/main/enums.c src/mesa/main/texstate.c src/mesa/vbo/vbo_exec_array.c
This commit is contained in:
@@ -21,6 +21,7 @@
|
||||
<li><a href="#pkg-config">Building OpenGL programs with pkg-config
|
||||
</ul>
|
||||
<li><a href="#windows">Windows</a>
|
||||
<li><a href="#scons">SCons</a>
|
||||
<li><a href="#other">Other</a>
|
||||
</ol>
|
||||
<br>
|
||||
@@ -328,13 +329,60 @@ For example, compiling and linking a GLUT application can be done with:
|
||||
<H2>2. Windows Compilation and Installation</H1>
|
||||
|
||||
<p>
|
||||
Please see the <a href="README.WIN32">README.WIN32</a> file.
|
||||
Please see the <a href="#scons">instructions on building with SCons</a>.
|
||||
Alternatively see <a href="README.WIN32">README.WIN32</a> file.
|
||||
</p>
|
||||
|
||||
|
||||
|
||||
<a name="scons">
|
||||
<H2>3. Building with SCons</H1>
|
||||
|
||||
<p>
|
||||
To build Mesa with SCons on Linux or Windows do
|
||||
</p>
|
||||
<pre>
|
||||
scons
|
||||
</pre>
|
||||
<p>
|
||||
The build output will be placed in
|
||||
build/<i>platform</i>-<i>machine</i>-<i>debug</i>/..., where <i>platform</i> is for
|
||||
example linux or windows, <i>machine</i> is x86 or x86_64, optionally followed
|
||||
by -debug for debug builds.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
The sample programs are built seperately. To build them do
|
||||
<pre>
|
||||
scons -C progs
|
||||
</pre>
|
||||
And the build output will be placed in progs/build/...
|
||||
</p>
|
||||
|
||||
<p>
|
||||
To build Mesa with SCons for Windows on Linux using the MinGW crosscompiler toolchain do
|
||||
</p>
|
||||
<pre>
|
||||
scons platform=windows toolchain=crossmingw machine=x86 statetrackers=mesa drivers=softpipe,trace winsys=gdi
|
||||
scons -C progs platform=windows toolchain=crossmingw machine=x86 -k
|
||||
</pre>
|
||||
<p>
|
||||
This will create:
|
||||
</p>
|
||||
<ul>
|
||||
<li>build/windows-x86-debug/gallium/winsys/gdi/opengl32.dll — Mesa + Gallium + softpipe, binary compatible with Windows's opengl32.dll
|
||||
<li>build/windows-x86-debug/glut/glx/glut32.dll
|
||||
<li>progs/build/windows-x86-debug/wgl/wglinfo.exe
|
||||
<li>progs/build/windows-x86-debug/trivial/tri.exe
|
||||
<li>and many other samples in progs/build/windows-x86-debug/...
|
||||
</ul>
|
||||
<p>
|
||||
Put them all in the same directory to test them.
|
||||
</p>
|
||||
|
||||
|
||||
<a name="other">
|
||||
<H2>3. Other systems</H1>
|
||||
<H2>4. Other systems</H1>
|
||||
|
||||
<p>
|
||||
Documentation for other environments (some may be very out of date):
|
||||
|
@@ -2702,7 +2702,7 @@ typedef GLenum (GLAPIENTRY * PFNGLCHECKFRAMEBUFFERSTATUSPROC) (GLenum target);
|
||||
typedef void (GLAPIENTRY * PFNGLDELETEFRAMEBUFFERSPROC) (GLsizei n, const GLuint* framebuffers);
|
||||
typedef void (GLAPIENTRY * PFNGLDELETERENDERBUFFERSPROC) (GLsizei n, const GLuint* renderbuffers);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERRENDERBUFFERPROC) (GLenum target, GLenum attachment, GLenum renderbuffertarget, GLuint renderbuffer);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURLAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURELAYERPROC) (GLenum target,GLenum attachment, GLuint texture,GLint level,GLint layer);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE1DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE2DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level);
|
||||
typedef void (GLAPIENTRY * PFNGLFRAMEBUFFERTEXTURE3DPROC) (GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint layer);
|
||||
@@ -2723,7 +2723,7 @@ typedef void (GLAPIENTRY * PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC) (GLenum targ
|
||||
#define glDeleteFramebuffers GLEW_GET_FUN(__glewDeleteFramebuffers)
|
||||
#define glDeleteRenderbuffers GLEW_GET_FUN(__glewDeleteRenderbuffers)
|
||||
#define glFramebufferRenderbuffer GLEW_GET_FUN(__glewFramebufferRenderbuffer)
|
||||
#define glFramebufferTexturLayer GLEW_GET_FUN(__glewFramebufferTexturLayer)
|
||||
#define glFramebufferTextureLayer GLEW_GET_FUN(__glewFramebufferTextureLayer)
|
||||
#define glFramebufferTexture1D GLEW_GET_FUN(__glewFramebufferTexture1D)
|
||||
#define glFramebufferTexture2D GLEW_GET_FUN(__glewFramebufferTexture2D)
|
||||
#define glFramebufferTexture3D GLEW_GET_FUN(__glewFramebufferTexture3D)
|
||||
@@ -10563,7 +10563,7 @@ GLEW_FUN_EXPORT PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus;
|
||||
GLEW_FUN_EXPORT PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers;
|
||||
GLEW_FUN_EXPORT PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURLAYERPROC __glewFramebufferTexturLayer;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D;
|
||||
GLEW_FUN_EXPORT PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D;
|
||||
|
@@ -50,6 +50,7 @@ struct window {
|
||||
float Angle;
|
||||
int Id;
|
||||
HGLRC sharedContext;
|
||||
HANDLE hEventInitialised;
|
||||
};
|
||||
|
||||
|
||||
@@ -414,6 +415,10 @@ threadRunner (void *arg)
|
||||
Error("Couldn't obtain HDC");
|
||||
}
|
||||
|
||||
/* Wait for the previous thread */
|
||||
if(tia->id > 0)
|
||||
WaitForSingleObject(Windows[tia->id - 1].hEventInitialised, INFINITE);
|
||||
|
||||
pfd.cColorBits = 24;
|
||||
pfd.cDepthBits = 24;
|
||||
pfd.dwFlags = PFD_DOUBLEBUFFER | PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL;
|
||||
@@ -434,9 +439,16 @@ threadRunner (void *arg)
|
||||
}
|
||||
|
||||
if (win->sharedContext) {
|
||||
wglShareLists(win->sharedContext, win->Context);
|
||||
if(!wglShareLists(win->sharedContext, win->Context))
|
||||
Error("Couldn't share WGL context lists");
|
||||
}
|
||||
|
||||
SetEvent(win->hEventInitialised);
|
||||
|
||||
/* Wait for all threads to initialize otherwise wglShareLists will fail */
|
||||
if(tia->id < NumWindows - 1)
|
||||
WaitForSingleObject(Windows[NumWindows - 1].hEventInitialised, INFINITE);
|
||||
|
||||
SendMessage(win->Win, WM_SIZE, 0, 0);
|
||||
|
||||
while (1) {
|
||||
@@ -511,20 +523,26 @@ main(int argc, char *argv[])
|
||||
h[2] = AddWindow( 10, 350, gCtx);
|
||||
h[3] = AddWindow(330, 350, gCtx);
|
||||
|
||||
if (!wglMakeCurrent(gHDC, gCtx)) {
|
||||
Error("wglMakeCurrent failed for init thread.");
|
||||
return -1;
|
||||
for (i = 0; i < NumWindows; i++) {
|
||||
Windows[i].hEventInitialised = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
}
|
||||
|
||||
InitGLstuff();
|
||||
|
||||
for (i = 0; i < NumWindows; i++) {
|
||||
DWORD id;
|
||||
|
||||
tia[i].id = i;
|
||||
threads[i] = CreateThread(NULL, 0, threadRunner, &tia[i], 0, &id);
|
||||
|
||||
WaitForSingleObject(Windows[i].hEventInitialised, INFINITE);
|
||||
}
|
||||
|
||||
if (!wglMakeCurrent(gHDC, gCtx)) {
|
||||
Error("wglMakeCurrent failed for init thread.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
InitGLstuff();
|
||||
|
||||
while (1) {
|
||||
MSG msg;
|
||||
|
||||
|
@@ -331,7 +331,9 @@ draw_loop(struct winthread *wt)
|
||||
|
||||
if (Locking)
|
||||
EnterCriticalSection(&Mutex);
|
||||
|
||||
SwapBuffers(wt->hDC);
|
||||
|
||||
if (Locking)
|
||||
LeaveCriticalSection(&Mutex);
|
||||
|
||||
@@ -443,7 +445,7 @@ create_window(struct winthread *wt, HGLRC shareCtx)
|
||||
win = CreateWindowEx(0,
|
||||
wc.lpszClassName,
|
||||
"wglthreads",
|
||||
WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
|
||||
WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_TILEDWINDOW,
|
||||
xpos,
|
||||
ypos,
|
||||
width,
|
||||
@@ -481,7 +483,8 @@ create_window(struct winthread *wt, HGLRC shareCtx)
|
||||
}
|
||||
|
||||
if (shareCtx) {
|
||||
wglShareLists(shareCtx, ctx);
|
||||
if(!wglShareLists(shareCtx, ctx))
|
||||
Error("Couldn't share WGL context lists");
|
||||
}
|
||||
|
||||
/* save the info for this window/context */
|
||||
@@ -504,10 +507,22 @@ ThreadProc(void *p)
|
||||
struct winthread *wt = (struct winthread *) p;
|
||||
HGLRC share;
|
||||
|
||||
/* Wait for the previous thread */
|
||||
if(Texture && wt->Index > 0) {
|
||||
WaitForSingleObject(WinThreads[wt->Index - 1].hEventInitialised, INFINITE);
|
||||
share = WinThreads[0].Context;
|
||||
}
|
||||
else
|
||||
share = 0;
|
||||
|
||||
share = (Texture && wt->Index > 0) ? WinThreads[0].Context : 0;
|
||||
create_window(wt, share);
|
||||
SetEvent(wt->hEventInitialised);
|
||||
|
||||
/* Wait for all threads to initialize otherwise wglShareLists will fail */
|
||||
if(wt->Index < NumWinThreads - 1)
|
||||
WaitForSingleObject(WinThreads[NumWinThreads - 1].hEventInitialised, INFINITE);
|
||||
|
||||
draw_loop(wt);
|
||||
return 0;
|
||||
}
|
||||
@@ -591,13 +606,17 @@ main(int argc, char *argv[])
|
||||
|
||||
printf("wglthreads: creating threads\n");
|
||||
|
||||
/* Create the events */
|
||||
for (i = 0; i < NumWinThreads; i++) {
|
||||
WinThreads[i].Index = i;
|
||||
WinThreads[i].hEventInitialised = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
WinThreads[i].hEventRedraw = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
}
|
||||
|
||||
/* Create the threads */
|
||||
for (i = 0; i < NumWinThreads; i++) {
|
||||
DWORD id;
|
||||
|
||||
WinThreads[i].Index = i;
|
||||
WinThreads[i].hEventInitialised = CreateEvent(NULL, TRUE, FALSE, NULL);
|
||||
WinThreads[i].hEventRedraw = CreateEvent(NULL, FALSE, FALSE, NULL);
|
||||
WinThreads[i].Thread = CreateThread(NULL,
|
||||
0,
|
||||
ThreadProc,
|
||||
@@ -606,8 +625,6 @@ main(int argc, char *argv[])
|
||||
&id);
|
||||
printf("wglthreads: Created thread %p\n", (void *) WinThreads[i].Thread);
|
||||
|
||||
WaitForSingleObject(WinThreads[i].hEventInitialised, INFINITE);
|
||||
|
||||
threads[i] = WinThreads[i].Thread;
|
||||
}
|
||||
|
||||
|
@@ -20,16 +20,17 @@
|
||||
*/
|
||||
|
||||
/*
|
||||
* This is a port of the infamous "gears" demo to straight GLX (i.e. no GLUT)
|
||||
* Port by Brian Paul 23 March 2001
|
||||
* Version of glxgears that creates/destroys the rendering context for each
|
||||
* frame. Also periodically destroy/recreate the window.
|
||||
* Good for finding memory leaks, etc.
|
||||
*
|
||||
* Command line options:
|
||||
* -info print GL implementation information
|
||||
* -stereo use stereo enabled GLX visual
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
@@ -92,13 +93,8 @@ static GLfloat view_rotx = 20.0, view_roty = 30.0, view_rotz = 0.0;
|
||||
static GLint gear1, gear2, gear3;
|
||||
static GLfloat angle = 0.0;
|
||||
|
||||
static GLboolean fullscreen = GL_FALSE; /* Create a single fullscreen window */
|
||||
static GLboolean stereo = GL_FALSE; /* Enable stereo. */
|
||||
static GLfloat eyesep = 5.0; /* Eye separation. */
|
||||
static GLfloat fix_point = 40.0; /* Fixation point distance. */
|
||||
static GLfloat left, right, asp; /* Stereo frustum params. */
|
||||
|
||||
XVisualInfo *visinfo;
|
||||
static XVisualInfo *visinfo = NULL;
|
||||
static int WinWidth = 300, WinHeight = 300;
|
||||
|
||||
|
||||
/*
|
||||
@@ -272,22 +268,13 @@ do_draw(void)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* new window size or exposure */
|
||||
static void
|
||||
reshape(int width, int height)
|
||||
{
|
||||
glViewport(0, 0, (GLint) width, (GLint) height);
|
||||
|
||||
if (stereo) {
|
||||
GLfloat w;
|
||||
|
||||
asp = (GLfloat) height / (GLfloat) width;
|
||||
w = fix_point * (1.0 / 5.0);
|
||||
|
||||
left = -5.0 * ((w - 0.5 * eyesep) / fix_point);
|
||||
right = 5.0 * ((w + 0.5 * eyesep) / fix_point);
|
||||
} else {
|
||||
{
|
||||
GLfloat h = (GLfloat) height / (GLfloat) width;
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
@@ -299,7 +286,6 @@ reshape(int width, int height)
|
||||
glLoadIdentity();
|
||||
glTranslatef(0.0, 0.0, -40.0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
@@ -337,7 +323,7 @@ init(void)
|
||||
|
||||
glEnable(GL_NORMALIZE);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
draw( Display *dpy, Window win )
|
||||
@@ -354,36 +340,9 @@ draw( Display *dpy, Window win )
|
||||
|
||||
init();
|
||||
|
||||
if (stereo) {
|
||||
/* First left eye. */
|
||||
glDrawBuffer(GL_BACK_LEFT);
|
||||
reshape(WinWidth, WinHeight);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(left, right, -asp, asp, 5.0, 60.0);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslated(+0.5 * eyesep, 0.0, 0.0);
|
||||
do_draw();
|
||||
glPopMatrix();
|
||||
|
||||
/* Then right eye. */
|
||||
glDrawBuffer(GL_BACK_RIGHT);
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glFrustum(-right, -left, -asp, asp, 5.0, 60.0);
|
||||
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslated(-0.5 * eyesep, 0.0, 0.0);
|
||||
do_draw();
|
||||
glPopMatrix();
|
||||
} else
|
||||
do_draw();
|
||||
do_draw();
|
||||
|
||||
glDeleteLists(gear1, 1);
|
||||
glDeleteLists(gear2, 1);
|
||||
@@ -410,14 +369,6 @@ make_window( Display *dpy, const char *name,
|
||||
GLX_DOUBLEBUFFER,
|
||||
GLX_DEPTH_SIZE, 1,
|
||||
None };
|
||||
int stereoAttribs[] = { GLX_RGBA,
|
||||
GLX_RED_SIZE, 1,
|
||||
GLX_GREEN_SIZE, 1,
|
||||
GLX_BLUE_SIZE, 1,
|
||||
GLX_DOUBLEBUFFER,
|
||||
GLX_DEPTH_SIZE, 1,
|
||||
GLX_STEREO,
|
||||
None };
|
||||
int scrnum;
|
||||
XSetWindowAttributes attr;
|
||||
unsigned long mask;
|
||||
@@ -427,22 +378,9 @@ make_window( Display *dpy, const char *name,
|
||||
scrnum = DefaultScreen( dpy );
|
||||
root = RootWindow( dpy, scrnum );
|
||||
|
||||
if (fullscreen) {
|
||||
x = 0; y = 0;
|
||||
width = DisplayWidth( dpy, scrnum );
|
||||
height = DisplayHeight( dpy, scrnum );
|
||||
}
|
||||
|
||||
if (stereo)
|
||||
visinfo = glXChooseVisual( dpy, scrnum, stereoAttribs );
|
||||
else
|
||||
visinfo = glXChooseVisual( dpy, scrnum, attribs );
|
||||
visinfo = glXChooseVisual( dpy, scrnum, attribs );
|
||||
if (!visinfo) {
|
||||
if (stereo) {
|
||||
printf("Error: couldn't get an RGB, "
|
||||
"Double-buffered, Stereo visual\n");
|
||||
} else
|
||||
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||
printf("Error: couldn't get an RGB, Double-buffered visual\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -451,7 +389,7 @@ make_window( Display *dpy, const char *name,
|
||||
attr.border_pixel = 0;
|
||||
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
|
||||
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
|
||||
attr.override_redirect = fullscreen;
|
||||
attr.override_redirect = 0;
|
||||
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect;
|
||||
|
||||
win = XCreateWindow( dpy, root, x, y, width, height,
|
||||
@@ -479,10 +417,9 @@ static void
|
||||
event_loop(Display *dpy)
|
||||
{
|
||||
Window win;
|
||||
make_window(dpy, "glxgears", 0, 0, 300, 300, &win);
|
||||
make_window(dpy, "glxgears", 0, 0, WinWidth, WinHeight, &win);
|
||||
XMapWindow(dpy, win);
|
||||
|
||||
|
||||
while (1) {
|
||||
while (XPending(dpy) > 0) {
|
||||
XEvent event;
|
||||
@@ -492,34 +429,35 @@ event_loop(Display *dpy)
|
||||
/* we'll redraw below */
|
||||
break;
|
||||
case ConfigureNotify:
|
||||
reshape(event.xconfigure.width, event.xconfigure.height);
|
||||
WinWidth = event.xconfigure.width;
|
||||
WinHeight = event.xconfigure.height;
|
||||
break;
|
||||
case KeyPress:
|
||||
{
|
||||
char buffer[10];
|
||||
int r, code;
|
||||
code = XLookupKeysym(&event.xkey, 0);
|
||||
if (code == XK_Left) {
|
||||
view_roty += 5.0;
|
||||
}
|
||||
else if (code == XK_Right) {
|
||||
view_roty -= 5.0;
|
||||
}
|
||||
else if (code == XK_Up) {
|
||||
view_rotx += 5.0;
|
||||
}
|
||||
else if (code == XK_Down) {
|
||||
view_rotx -= 5.0;
|
||||
}
|
||||
else {
|
||||
r = XLookupString(&event.xkey, buffer, sizeof(buffer),
|
||||
NULL, NULL);
|
||||
if (buffer[0] == 27) {
|
||||
/* escape */
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
{
|
||||
char buffer[10];
|
||||
int r, code;
|
||||
code = XLookupKeysym(&event.xkey, 0);
|
||||
if (code == XK_Left) {
|
||||
view_roty += 5.0;
|
||||
}
|
||||
else if (code == XK_Right) {
|
||||
view_roty -= 5.0;
|
||||
}
|
||||
else if (code == XK_Up) {
|
||||
view_rotx += 5.0;
|
||||
}
|
||||
else if (code == XK_Down) {
|
||||
view_rotx -= 5.0;
|
||||
}
|
||||
else {
|
||||
r = XLookupString(&event.xkey, buffer, sizeof(buffer),
|
||||
NULL, NULL);
|
||||
if (buffer[0] == 27) {
|
||||
/* escape */
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -550,9 +488,12 @@ event_loop(Display *dpy)
|
||||
printf("%d frames in %3.1f seconds = %6.3f FPS\n", frames, seconds,
|
||||
fps);
|
||||
tRate0 = t;
|
||||
|
||||
|
||||
/* Destroy window and create new one */
|
||||
XDestroyWindow(dpy, win);
|
||||
make_window(dpy, "glxgears", (int)(fps * 100) % 100, (int)(fps * 100) % 100, 300, 300, &win);
|
||||
make_window(dpy, "glxgears",
|
||||
(int)(fps * 100) % 100, (int)(fps * 100) % 100, /* x,y */
|
||||
WinWidth, WinHeight, &win);
|
||||
XMapWindow(dpy, win);
|
||||
|
||||
frames = 0;
|
||||
@@ -562,7 +503,6 @@ event_loop(Display *dpy)
|
||||
}
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
@@ -579,12 +519,6 @@ main(int argc, char *argv[])
|
||||
else if (strcmp(argv[i], "-info") == 0) {
|
||||
printInfo = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-stereo") == 0) {
|
||||
stereo = GL_TRUE;
|
||||
}
|
||||
else if (strcmp(argv[i], "-fullscreen") == 0) {
|
||||
fullscreen = GL_TRUE;
|
||||
}
|
||||
else
|
||||
printf("Warrning: unknown parameter: %s\n", argv[i]);
|
||||
}
|
||||
@@ -596,7 +530,6 @@ main(int argc, char *argv[])
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
if (printInfo) {
|
||||
printf("GL_RENDERER = %s\n", (char *) glGetString(GL_RENDERER));
|
||||
printf("GL_VERSION = %s\n", (char *) glGetString(GL_VERSION));
|
||||
@@ -604,7 +537,6 @@ main(int argc, char *argv[])
|
||||
printf("GL_EXTENSIONS = %s\n", (char *) glGetString(GL_EXTENSIONS));
|
||||
}
|
||||
|
||||
|
||||
event_loop(dpy);
|
||||
|
||||
XCloseDisplay(dpy);
|
||||
|
@@ -108,7 +108,7 @@ def shlib_emitter(target, source, env):
|
||||
return (target, source)
|
||||
|
||||
|
||||
shlib_action = SCons.Action.Action(shlib_generator, generator=1)
|
||||
shlib_action = SCons.Action.Action(shlib_generator, '$SHLINKCOMSTR', generator=1)
|
||||
|
||||
res_action = SCons.Action.Action('$RCCOM', '$RCCOMSTR')
|
||||
|
||||
|
@@ -54,7 +54,8 @@ static unsigned elt_ubyte( const void *elts, unsigned idx )
|
||||
|
||||
static unsigned elt_vert( const void *elts, unsigned idx )
|
||||
{
|
||||
return (const ubyte *)elts - (const ubyte *)NULL + idx;
|
||||
/* unsigned index is packed in the pointer */
|
||||
return (unsigned)(uintptr_t)elts + idx;
|
||||
}
|
||||
|
||||
pt_elt_func draw_pt_elt_func( struct draw_context *draw )
|
||||
|
@@ -71,6 +71,12 @@ struct pb_desc
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Size. Regular (32bit) unsigned for now.
|
||||
*/
|
||||
typedef unsigned pb_size;
|
||||
|
||||
|
||||
/**
|
||||
* Base class for all pb_* buffers.
|
||||
*/
|
||||
@@ -126,7 +132,7 @@ struct pb_vtbl
|
||||
*/
|
||||
void (*get_base_buffer)( struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset );
|
||||
pb_size *offset );
|
||||
|
||||
};
|
||||
|
||||
@@ -177,7 +183,7 @@ pb_unmap(struct pb_buffer *buf)
|
||||
static INLINE void
|
||||
pb_get_base_buffer( struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset )
|
||||
pb_size *offset )
|
||||
{
|
||||
assert(buf);
|
||||
if(!buf) {
|
||||
@@ -241,7 +247,7 @@ pb_reference(struct pb_buffer **dst,
|
||||
* the requested or not.
|
||||
*/
|
||||
static INLINE boolean
|
||||
pb_check_alignment(size_t requested, size_t provided)
|
||||
pb_check_alignment(pb_size requested, pb_size provided)
|
||||
{
|
||||
if(!requested)
|
||||
return TRUE;
|
||||
@@ -269,7 +275,7 @@ pb_check_usage(unsigned requested, unsigned provided)
|
||||
* hardware.
|
||||
*/
|
||||
struct pb_buffer *
|
||||
pb_malloc_buffer_create(size_t size,
|
||||
pb_malloc_buffer_create(pb_size size,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
|
||||
|
@@ -65,11 +65,11 @@ struct fenced_buffer_list
|
||||
|
||||
struct pb_fence_ops *ops;
|
||||
|
||||
size_t numDelayed;
|
||||
pb_size numDelayed;
|
||||
struct list_head delayed;
|
||||
|
||||
#ifdef DEBUG
|
||||
size_t numUnfenced;
|
||||
pb_size numUnfenced;
|
||||
struct list_head unfenced;
|
||||
#endif
|
||||
};
|
||||
@@ -433,7 +433,7 @@ fenced_buffer_fence(struct pb_buffer *buf,
|
||||
static void
|
||||
fenced_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct fenced_buffer *fenced_buf = fenced_buffer(buf);
|
||||
pb_get_base_buffer(fenced_buf->buffer, base_buf, offset);
|
||||
|
@@ -102,7 +102,7 @@ malloc_buffer_fence(struct pb_buffer *buf,
|
||||
static void
|
||||
malloc_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
*base_buf = buf;
|
||||
*offset = 0;
|
||||
@@ -121,7 +121,7 @@ malloc_buffer_vtbl = {
|
||||
|
||||
|
||||
struct pb_buffer *
|
||||
pb_malloc_buffer_create(size_t size,
|
||||
pb_malloc_buffer_create(pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct malloc_buffer *buf;
|
||||
@@ -150,7 +150,7 @@ pb_malloc_buffer_create(size_t size,
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_malloc_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
return pb_malloc_buffer_create(size, desc);
|
||||
|
@@ -73,7 +73,7 @@ struct pb_manager
|
||||
|
||||
struct pb_buffer *
|
||||
(*create_buffer)( struct pb_manager *mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
/**
|
||||
@@ -106,7 +106,7 @@ pb_malloc_bufmgr_create(void);
|
||||
*/
|
||||
struct pb_manager *
|
||||
pool_bufmgr_create(struct pb_manager *provider,
|
||||
size_t n, size_t size,
|
||||
pb_size n, pb_size size,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
|
||||
@@ -119,7 +119,7 @@ pool_bufmgr_create(struct pb_manager *provider,
|
||||
*/
|
||||
struct pb_manager *
|
||||
mm_bufmgr_create(struct pb_manager *provider,
|
||||
size_t size, size_t align2);
|
||||
pb_size size, pb_size align2);
|
||||
|
||||
/**
|
||||
* Same as mm_bufmgr_create.
|
||||
@@ -128,7 +128,7 @@ mm_bufmgr_create(struct pb_manager *provider,
|
||||
*/
|
||||
struct pb_manager *
|
||||
mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
|
||||
size_t size, size_t align2);
|
||||
pb_size size, pb_size align2);
|
||||
|
||||
|
||||
/**
|
||||
@@ -136,8 +136,8 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
|
||||
*/
|
||||
struct pb_manager *
|
||||
pb_slab_manager_create(struct pb_manager *provider,
|
||||
size_t bufSize,
|
||||
size_t slabSize,
|
||||
pb_size bufSize,
|
||||
pb_size slabSize,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
/**
|
||||
@@ -146,9 +146,9 @@ pb_slab_manager_create(struct pb_manager *provider,
|
||||
*/
|
||||
struct pb_manager *
|
||||
pb_slab_range_manager_create(struct pb_manager *provider,
|
||||
size_t minBufSize,
|
||||
size_t maxBufSize,
|
||||
size_t slabSize,
|
||||
pb_size minBufSize,
|
||||
pb_size maxBufSize,
|
||||
pb_size slabSize,
|
||||
const struct pb_desc *desc);
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ pb_ondemand_manager_create(struct pb_manager *provider);
|
||||
*/
|
||||
struct pb_manager *
|
||||
pb_debug_manager_create(struct pb_manager *provider,
|
||||
size_t underflow_size, size_t overflow_size);
|
||||
pb_size underflow_size, pb_size overflow_size);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
@@ -60,7 +60,7 @@ pb_alt_manager(struct pb_manager *mgr)
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_alt_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_alt_manager *mgr = pb_alt_manager(_mgr);
|
||||
|
@@ -81,7 +81,7 @@ struct pb_cache_manager
|
||||
pipe_mutex mutex;
|
||||
|
||||
struct list_head delayed;
|
||||
size_t numDelayed;
|
||||
pb_size numDelayed;
|
||||
};
|
||||
|
||||
|
||||
@@ -204,7 +204,7 @@ pb_cache_buffer_fence(struct pb_buffer *_buf,
|
||||
static void
|
||||
pb_cache_buffer_get_base_buffer(struct pb_buffer *_buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct pb_cache_buffer *buf = pb_cache_buffer(_buf);
|
||||
pb_get_base_buffer(buf->buffer, base_buf, offset);
|
||||
@@ -224,7 +224,7 @@ pb_cache_buffer_vtbl = {
|
||||
|
||||
static INLINE boolean
|
||||
pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
if(buf->base.base.size < size)
|
||||
@@ -246,7 +246,7 @@ pb_cache_is_buffer_compat(struct pb_cache_buffer *buf,
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_cache_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_cache_manager *mgr = pb_cache_manager(_mgr);
|
||||
|
@@ -72,8 +72,8 @@ struct pb_debug_buffer
|
||||
struct pb_buffer *buffer;
|
||||
struct pb_debug_manager *mgr;
|
||||
|
||||
size_t underflow_size;
|
||||
size_t overflow_size;
|
||||
pb_size underflow_size;
|
||||
pb_size overflow_size;
|
||||
|
||||
struct debug_stack_frame create_backtrace[PB_DEBUG_CREATE_BACKTRACE];
|
||||
|
||||
@@ -91,8 +91,8 @@ struct pb_debug_manager
|
||||
|
||||
struct pb_manager *provider;
|
||||
|
||||
size_t underflow_size;
|
||||
size_t overflow_size;
|
||||
pb_size underflow_size;
|
||||
pb_size overflow_size;
|
||||
|
||||
pipe_mutex mutex;
|
||||
struct list_head list;
|
||||
@@ -124,9 +124,9 @@ static const uint8_t random_pattern[32] = {
|
||||
|
||||
|
||||
static INLINE void
|
||||
fill_random_pattern(uint8_t *dst, size_t size)
|
||||
fill_random_pattern(uint8_t *dst, pb_size size)
|
||||
{
|
||||
size_t i = 0;
|
||||
pb_size i = 0;
|
||||
while(size--) {
|
||||
*dst++ = random_pattern[i++];
|
||||
i &= sizeof(random_pattern) - 1;
|
||||
@@ -135,11 +135,11 @@ fill_random_pattern(uint8_t *dst, size_t size)
|
||||
|
||||
|
||||
static INLINE boolean
|
||||
check_random_pattern(const uint8_t *dst, size_t size,
|
||||
size_t *min_ofs, size_t *max_ofs)
|
||||
check_random_pattern(const uint8_t *dst, pb_size size,
|
||||
pb_size *min_ofs, pb_size *max_ofs)
|
||||
{
|
||||
boolean result = TRUE;
|
||||
size_t i;
|
||||
pb_size i;
|
||||
*min_ofs = size;
|
||||
*max_ofs = 0;
|
||||
for(i = 0; i < size; ++i) {
|
||||
@@ -183,7 +183,7 @@ pb_debug_buffer_check(struct pb_debug_buffer *buf)
|
||||
assert(map);
|
||||
if(map) {
|
||||
boolean underflow, overflow;
|
||||
size_t min_ofs, max_ofs;
|
||||
pb_size min_ofs, max_ofs;
|
||||
|
||||
underflow = !check_random_pattern(map, buf->underflow_size,
|
||||
&min_ofs, &max_ofs);
|
||||
@@ -287,7 +287,7 @@ pb_debug_buffer_unmap(struct pb_buffer *_buf)
|
||||
static void
|
||||
pb_debug_buffer_get_base_buffer(struct pb_buffer *_buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct pb_debug_buffer *buf = pb_debug_buffer(_buf);
|
||||
pb_get_base_buffer(buf->buffer, base_buf, offset);
|
||||
@@ -363,13 +363,13 @@ pb_debug_manager_dump(struct pb_debug_manager *mgr)
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_debug_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_debug_manager *mgr = pb_debug_manager(_mgr);
|
||||
struct pb_debug_buffer *buf;
|
||||
struct pb_desc real_desc;
|
||||
size_t real_size;
|
||||
pb_size real_size;
|
||||
|
||||
buf = CALLOC_STRUCT(pb_debug_buffer);
|
||||
if(!buf)
|
||||
@@ -455,7 +455,7 @@ pb_debug_manager_destroy(struct pb_manager *_mgr)
|
||||
|
||||
struct pb_manager *
|
||||
pb_debug_manager_create(struct pb_manager *provider,
|
||||
size_t underflow_size, size_t overflow_size)
|
||||
pb_size underflow_size, pb_size overflow_size)
|
||||
{
|
||||
struct pb_debug_manager *mgr;
|
||||
|
||||
@@ -485,7 +485,7 @@ pb_debug_manager_create(struct pb_manager *provider,
|
||||
|
||||
struct pb_manager *
|
||||
pb_debug_manager_create(struct pb_manager *provider,
|
||||
size_t underflow_size, size_t overflow_size)
|
||||
pb_size underflow_size, pb_size overflow_size)
|
||||
{
|
||||
return provider;
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ fenced_pb_manager(struct pb_manager *mgr)
|
||||
|
||||
static struct pb_buffer *
|
||||
fenced_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct fenced_pb_manager *fenced_mgr = fenced_pb_manager(mgr);
|
||||
|
@@ -55,10 +55,10 @@ struct mm_pb_manager
|
||||
|
||||
pipe_mutex mutex;
|
||||
|
||||
size_t size;
|
||||
pb_size size;
|
||||
struct mem_block *heap;
|
||||
|
||||
size_t align2;
|
||||
pb_size align2;
|
||||
|
||||
struct pb_buffer *buffer;
|
||||
void *map;
|
||||
@@ -148,7 +148,7 @@ mm_buffer_fence(struct pb_buffer *buf,
|
||||
static void
|
||||
mm_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct mm_buffer *mm_buf = mm_buffer(buf);
|
||||
struct mm_pb_manager *mm = mm_buf->mgr;
|
||||
@@ -170,15 +170,15 @@ mm_buffer_vtbl = {
|
||||
|
||||
static struct pb_buffer *
|
||||
mm_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct mm_pb_manager *mm = mm_pb_manager(mgr);
|
||||
struct mm_buffer *mm_buf;
|
||||
|
||||
/* We don't handle alignments larger then the one initially setup */
|
||||
assert(pb_check_alignment(desc->alignment, 1 << mm->align2));
|
||||
if(!pb_check_alignment(desc->alignment, 1 << mm->align2))
|
||||
assert(pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2));
|
||||
if(!pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2))
|
||||
return NULL;
|
||||
|
||||
pipe_mutex_lock(mm->mutex);
|
||||
@@ -198,7 +198,7 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
|
||||
mm_buf->mgr = mm;
|
||||
|
||||
mm_buf->block = u_mmAllocMem(mm->heap, size, mm->align2, 0);
|
||||
mm_buf->block = u_mmAllocMem(mm->heap, (int)size, (int)mm->align2, 0);
|
||||
if(!mm_buf->block) {
|
||||
#if 0
|
||||
debug_printf("warning: heap full\n");
|
||||
@@ -210,8 +210,8 @@ mm_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
}
|
||||
|
||||
/* Some sanity checks */
|
||||
assert(0 <= (unsigned)mm_buf->block->ofs && (unsigned)mm_buf->block->ofs < mm->size);
|
||||
assert(size <= (unsigned)mm_buf->block->size && (unsigned)mm_buf->block->ofs + (unsigned)mm_buf->block->size <= mm->size);
|
||||
assert(0 <= (pb_size)mm_buf->block->ofs && (pb_size)mm_buf->block->ofs < mm->size);
|
||||
assert(size <= (pb_size)mm_buf->block->size && (pb_size)mm_buf->block->ofs + (pb_size)mm_buf->block->size <= mm->size);
|
||||
|
||||
pipe_mutex_unlock(mm->mutex);
|
||||
return SUPER(mm_buf);
|
||||
@@ -245,7 +245,7 @@ mm_bufmgr_destroy(struct pb_manager *mgr)
|
||||
|
||||
struct pb_manager *
|
||||
mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
|
||||
size_t size, size_t align2)
|
||||
pb_size size, pb_size align2)
|
||||
{
|
||||
struct mm_pb_manager *mm;
|
||||
|
||||
@@ -273,7 +273,7 @@ mm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
|
||||
if(!mm->map)
|
||||
goto failure;
|
||||
|
||||
mm->heap = u_mmInit(0, size);
|
||||
mm->heap = u_mmInit(0, (int)size);
|
||||
if (!mm->heap)
|
||||
goto failure;
|
||||
|
||||
@@ -292,7 +292,7 @@ if(mm->heap)
|
||||
|
||||
struct pb_manager *
|
||||
mm_bufmgr_create(struct pb_manager *provider,
|
||||
size_t size, size_t align2)
|
||||
pb_size size, pb_size align2)
|
||||
{
|
||||
struct pb_buffer *buffer;
|
||||
struct pb_manager *mgr;
|
||||
|
@@ -55,7 +55,7 @@ struct pb_ondemand_buffer
|
||||
|
||||
/** Real buffer */
|
||||
struct pb_buffer *buffer;
|
||||
size_t size;
|
||||
pb_size size;
|
||||
struct pb_desc desc;
|
||||
};
|
||||
|
||||
@@ -204,7 +204,7 @@ pb_ondemand_buffer_fence(struct pb_buffer *_buf,
|
||||
static void
|
||||
pb_ondemand_buffer_get_base_buffer(struct pb_buffer *_buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
|
||||
|
||||
@@ -232,7 +232,7 @@ pb_ondemand_buffer_vtbl = {
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_ondemand_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_ondemand_manager *mgr = pb_ondemand_manager(_mgr);
|
||||
|
@@ -58,11 +58,11 @@ struct pool_pb_manager
|
||||
|
||||
pipe_mutex mutex;
|
||||
|
||||
size_t bufSize;
|
||||
size_t bufAlign;
|
||||
pb_size bufSize;
|
||||
pb_size bufAlign;
|
||||
|
||||
size_t numFree;
|
||||
size_t numTot;
|
||||
pb_size numFree;
|
||||
pb_size numTot;
|
||||
|
||||
struct list_head free;
|
||||
|
||||
@@ -89,7 +89,7 @@ struct pool_buffer
|
||||
|
||||
struct list_head head;
|
||||
|
||||
size_t start;
|
||||
pb_size start;
|
||||
};
|
||||
|
||||
|
||||
@@ -162,7 +162,7 @@ pool_buffer_fence(struct pb_buffer *buf,
|
||||
static void
|
||||
pool_buffer_get_base_buffer(struct pb_buffer *buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct pool_buffer *pool_buf = pool_buffer(buf);
|
||||
struct pool_pb_manager *pool = pool_buf->mgr;
|
||||
@@ -184,7 +184,7 @@ pool_buffer_vtbl = {
|
||||
|
||||
static struct pb_buffer *
|
||||
pool_bufmgr_create_buffer(struct pb_manager *mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pool_pb_manager *pool = pool_pb_manager(mgr);
|
||||
@@ -251,13 +251,13 @@ pool_bufmgr_destroy(struct pb_manager *mgr)
|
||||
|
||||
struct pb_manager *
|
||||
pool_bufmgr_create(struct pb_manager *provider,
|
||||
size_t numBufs,
|
||||
size_t bufSize,
|
||||
pb_size numBufs,
|
||||
pb_size bufSize,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pool_pb_manager *pool;
|
||||
struct pool_buffer *pool_buf;
|
||||
size_t i;
|
||||
pb_size i;
|
||||
|
||||
if(!provider)
|
||||
return NULL;
|
||||
|
@@ -68,7 +68,7 @@ struct pb_slab_buffer
|
||||
unsigned mapCount;
|
||||
|
||||
/** Offset relative to the start of the slab buffer. */
|
||||
size_t start;
|
||||
pb_size start;
|
||||
|
||||
/** Use when validating, to signal that all mappings are finished */
|
||||
/* TODO: Actually validation does not reach this stage yet */
|
||||
@@ -83,8 +83,8 @@ struct pb_slab
|
||||
{
|
||||
struct list_head head;
|
||||
struct list_head freeBuffers;
|
||||
size_t numBuffers;
|
||||
size_t numFree;
|
||||
pb_size numBuffers;
|
||||
pb_size numFree;
|
||||
|
||||
struct pb_slab_buffer *buffers;
|
||||
struct pb_slab_manager *mgr;
|
||||
@@ -108,10 +108,10 @@ struct pb_slab_manager
|
||||
struct pb_manager *provider;
|
||||
|
||||
/** Size of the buffers we hand on downstream */
|
||||
size_t bufSize;
|
||||
pb_size bufSize;
|
||||
|
||||
/** Size of the buffers we request upstream */
|
||||
size_t slabSize;
|
||||
pb_size slabSize;
|
||||
|
||||
/**
|
||||
* Alignment, usage to be used to allocate the slab buffers.
|
||||
@@ -150,14 +150,14 @@ struct pb_slab_range_manager
|
||||
|
||||
struct pb_manager *provider;
|
||||
|
||||
size_t minBufSize;
|
||||
size_t maxBufSize;
|
||||
pb_size minBufSize;
|
||||
pb_size maxBufSize;
|
||||
|
||||
/** @sa pb_slab_manager::desc */
|
||||
struct pb_desc desc;
|
||||
|
||||
unsigned numBuckets;
|
||||
size_t *bucketSizes;
|
||||
pb_size *bucketSizes;
|
||||
|
||||
/** Array of pb_slab_manager, one for each bucket size */
|
||||
struct pb_manager **buckets;
|
||||
@@ -270,7 +270,7 @@ pb_slab_buffer_fence(struct pb_buffer *_buf,
|
||||
static void
|
||||
pb_slab_buffer_get_base_buffer(struct pb_buffer *_buf,
|
||||
struct pb_buffer **base_buf,
|
||||
unsigned *offset)
|
||||
pb_size *offset)
|
||||
{
|
||||
struct pb_slab_buffer *buf = pb_slab_buffer(_buf);
|
||||
pb_get_base_buffer(buf->slab->bo, base_buf, offset);
|
||||
@@ -369,7 +369,7 @@ out_err0:
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_slab_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_slab_manager *mgr = pb_slab_manager(_mgr);
|
||||
@@ -450,8 +450,8 @@ pb_slab_manager_destroy(struct pb_manager *_mgr)
|
||||
|
||||
struct pb_manager *
|
||||
pb_slab_manager_create(struct pb_manager *provider,
|
||||
size_t bufSize,
|
||||
size_t slabSize,
|
||||
pb_size bufSize,
|
||||
pb_size slabSize,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_slab_manager *mgr;
|
||||
@@ -479,11 +479,11 @@ pb_slab_manager_create(struct pb_manager *provider,
|
||||
|
||||
static struct pb_buffer *
|
||||
pb_slab_range_manager_create_buffer(struct pb_manager *_mgr,
|
||||
size_t size,
|
||||
pb_size size,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_slab_range_manager *mgr = pb_slab_range_manager(_mgr);
|
||||
size_t bufSize;
|
||||
pb_size bufSize;
|
||||
unsigned i;
|
||||
|
||||
bufSize = mgr->minBufSize;
|
||||
@@ -527,13 +527,13 @@ pb_slab_range_manager_destroy(struct pb_manager *_mgr)
|
||||
|
||||
struct pb_manager *
|
||||
pb_slab_range_manager_create(struct pb_manager *provider,
|
||||
size_t minBufSize,
|
||||
size_t maxBufSize,
|
||||
size_t slabSize,
|
||||
pb_size minBufSize,
|
||||
pb_size maxBufSize,
|
||||
pb_size slabSize,
|
||||
const struct pb_desc *desc)
|
||||
{
|
||||
struct pb_slab_range_manager *mgr;
|
||||
size_t bufSize;
|
||||
pb_size bufSize;
|
||||
unsigned i;
|
||||
|
||||
if(!provider)
|
||||
|
@@ -829,7 +829,7 @@ util_vsnprintf(char *str, size_t size, const char *format, va_list args)
|
||||
break;
|
||||
default:
|
||||
intptr = va_arg(args, int *);
|
||||
*intptr = len;
|
||||
*intptr = (int)len;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
@@ -744,7 +744,9 @@ shadow_compare(uint compare_func,
|
||||
break;
|
||||
}
|
||||
|
||||
/* XXX returning result for default GL_DEPTH_TEXTURE_MODE = GL_LUMINANCE */
|
||||
rgba[0][j] = rgba[1][j] = rgba[2][j] = (float) k;
|
||||
rgba[3][j] = 1.0F;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -451,11 +451,11 @@ void trace_dump_float(double value)
|
||||
}
|
||||
|
||||
void trace_dump_bytes(const void *data,
|
||||
long unsigned size)
|
||||
size_t size)
|
||||
{
|
||||
static const char hex_table[16] = "0123456789ABCDEF";
|
||||
const uint8_t *p = data;
|
||||
long unsigned i;
|
||||
size_t i;
|
||||
|
||||
if (!dumping)
|
||||
return;
|
||||
|
@@ -91,7 +91,7 @@ void trace_dump_bool(int value);
|
||||
void trace_dump_int(long long int value);
|
||||
void trace_dump_uint(long long unsigned value);
|
||||
void trace_dump_float(double value);
|
||||
void trace_dump_bytes(const void *data, long unsigned size);
|
||||
void trace_dump_bytes(const void *data, size_t size);
|
||||
void trace_dump_string(const char *str);
|
||||
void trace_dump_enum(const char *value);
|
||||
void trace_dump_array_begin(void);
|
||||
@@ -130,7 +130,7 @@ void trace_dump_transfer_ptr(struct pipe_transfer *_transfer);
|
||||
|
||||
#define trace_dump_array(_type, _obj, _size) \
|
||||
do { \
|
||||
unsigned long idx; \
|
||||
size_t idx; \
|
||||
trace_dump_array_begin(); \
|
||||
for(idx = 0; idx < (_size); ++idx) { \
|
||||
trace_dump_elem_begin(); \
|
||||
@@ -142,7 +142,7 @@ void trace_dump_transfer_ptr(struct pipe_transfer *_transfer);
|
||||
|
||||
#define trace_dump_struct_array(_type, _obj, _size) \
|
||||
do { \
|
||||
unsigned long idx; \
|
||||
size_t idx; \
|
||||
trace_dump_array_begin(); \
|
||||
for(idx = 0; idx < (_size); ++idx) { \
|
||||
trace_dump_elem_begin(); \
|
||||
|
@@ -1820,7 +1820,7 @@ Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
|
||||
if (!dpy || !config || !pixmap)
|
||||
return 0;
|
||||
|
||||
for (attr = attribList; *attr; attr++) {
|
||||
for (attr = attribList; attr && *attr; attr++) {
|
||||
switch (*attr) {
|
||||
case GLX_TEXTURE_FORMAT_EXT:
|
||||
attr++;
|
||||
|
@@ -47,6 +47,23 @@
|
||||
#include "stw_context.h"
|
||||
#include "stw_tls.h"
|
||||
|
||||
|
||||
static INLINE struct stw_context *
|
||||
stw_context(GLcontext *glctx)
|
||||
{
|
||||
if(!glctx)
|
||||
return NULL;
|
||||
assert(glctx->DriverCtx);
|
||||
return (struct stw_context *)glctx->DriverCtx;
|
||||
}
|
||||
|
||||
static INLINE struct stw_context *
|
||||
stw_current_context(void)
|
||||
{
|
||||
GET_CURRENT_CONTEXT( glctx );
|
||||
return stw_context(glctx);
|
||||
}
|
||||
|
||||
BOOL
|
||||
stw_copy_context(
|
||||
UINT_PTR hglrcSrc,
|
||||
@@ -99,6 +116,18 @@ stw_share_lists(
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void
|
||||
stw_viewport(GLcontext * glctx, GLint x, GLint y,
|
||||
GLsizei width, GLsizei height)
|
||||
{
|
||||
struct stw_context *ctx = (struct stw_context *)glctx->DriverCtx;
|
||||
struct stw_framebuffer *fb;
|
||||
|
||||
fb = stw_framebuffer_from_hdc( ctx->hdc );
|
||||
if(fb)
|
||||
stw_framebuffer_update(fb);
|
||||
}
|
||||
|
||||
UINT_PTR
|
||||
stw_create_layer_context(
|
||||
HDC hdc,
|
||||
@@ -158,6 +187,7 @@ stw_create_layer_context(
|
||||
goto no_st_ctx;
|
||||
|
||||
ctx->st->ctx->DriverCtx = ctx;
|
||||
ctx->st->ctx->Driver.Viewport = stw_viewport;
|
||||
|
||||
pipe_mutex_lock( stw_dev->mutex );
|
||||
ctx->hglrc = handle_table_add(stw_dev->ctx_table, ctx);
|
||||
@@ -194,11 +224,10 @@ stw_delete_context(
|
||||
pipe_mutex_unlock( stw_dev->mutex );
|
||||
|
||||
if (ctx) {
|
||||
GLcontext *glctx = ctx->st->ctx;
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
|
||||
struct stw_context *curctx = stw_current_context();
|
||||
|
||||
/* Unbind current if deleting current context. */
|
||||
if (glcurctx == glctx)
|
||||
if (curctx == ctx)
|
||||
st_make_current( NULL, NULL, NULL );
|
||||
|
||||
st_destroy_context(ctx->st);
|
||||
@@ -230,13 +259,8 @@ stw_release_context(
|
||||
* current for this thread. We should check that and return False
|
||||
* if not the case.
|
||||
*/
|
||||
{
|
||||
GLcontext *glctx = ctx->st->ctx;
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
|
||||
if (glcurctx != glctx)
|
||||
return FALSE;
|
||||
}
|
||||
if (ctx != stw_current_context())
|
||||
return FALSE;
|
||||
|
||||
if (stw_make_current( NULL, 0 ) == FALSE)
|
||||
return FALSE;
|
||||
@@ -248,14 +272,9 @@ stw_release_context(
|
||||
UINT_PTR
|
||||
stw_get_current_context( void )
|
||||
{
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
struct stw_context *ctx;
|
||||
|
||||
if(!glcurctx)
|
||||
return 0;
|
||||
|
||||
ctx = (struct stw_context *)glcurctx->DriverCtx;
|
||||
assert(ctx);
|
||||
ctx = stw_current_context();
|
||||
if(!ctx)
|
||||
return 0;
|
||||
|
||||
@@ -265,14 +284,9 @@ stw_get_current_context( void )
|
||||
HDC
|
||||
stw_get_current_dc( void )
|
||||
{
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
struct stw_context *ctx;
|
||||
|
||||
if(!glcurctx)
|
||||
return NULL;
|
||||
|
||||
ctx = (struct stw_context *)glcurctx->DriverCtx;
|
||||
assert(ctx);
|
||||
ctx = stw_current_context();
|
||||
if(!ctx)
|
||||
return NULL;
|
||||
|
||||
@@ -284,23 +298,24 @@ stw_make_current(
|
||||
HDC hdc,
|
||||
UINT_PTR hglrc )
|
||||
{
|
||||
struct stw_context *curctx;
|
||||
struct stw_context *ctx;
|
||||
GET_CURRENT_CONTEXT( glcurctx );
|
||||
struct stw_framebuffer *fb;
|
||||
|
||||
if (!stw_dev)
|
||||
goto fail;
|
||||
|
||||
if (glcurctx != NULL) {
|
||||
struct stw_context *curctx;
|
||||
curctx = (struct stw_context *) glcurctx->DriverCtx;
|
||||
|
||||
curctx = stw_current_context();
|
||||
if (curctx != NULL) {
|
||||
if (curctx->hglrc != hglrc)
|
||||
st_flush(glcurctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
|
||||
st_flush(curctx->st, PIPE_FLUSH_RENDER_CACHE, NULL);
|
||||
|
||||
/* Return if already current. */
|
||||
if (curctx->hglrc == hglrc && curctx->hdc == hdc)
|
||||
return TRUE;
|
||||
if (curctx->hglrc == hglrc && curctx->hdc == hdc) {
|
||||
ctx = curctx;
|
||||
fb = stw_framebuffer_from_hdc( hdc );
|
||||
goto success;
|
||||
}
|
||||
}
|
||||
|
||||
if (hdc == NULL || hglrc == 0) {
|
||||
@@ -344,7 +359,10 @@ stw_make_current(
|
||||
if(!st_make_current( ctx->st, fb->stfb, fb->stfb ))
|
||||
goto fail;
|
||||
|
||||
stw_framebuffer_resize(fb);
|
||||
success:
|
||||
assert(fb);
|
||||
if(fb)
|
||||
stw_framebuffer_update(fb);
|
||||
|
||||
return TRUE;
|
||||
|
||||
|
@@ -30,6 +30,7 @@
|
||||
#include "glapi/glthread.h"
|
||||
#include "util/u_debug.h"
|
||||
#include "pipe/p_screen.h"
|
||||
#include "state_tracker/st_public.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#include "trace/tr_screen.h"
|
||||
@@ -63,15 +64,39 @@ stw_flush_frontbuffer(struct pipe_screen *screen,
|
||||
{
|
||||
const struct stw_winsys *stw_winsys = stw_dev->stw_winsys;
|
||||
HDC hdc = (HDC)context_private;
|
||||
struct stw_framebuffer *fb;
|
||||
|
||||
#ifdef DEBUG
|
||||
if(stw_dev->trace_running) {
|
||||
screen = trace_screen(screen)->screen;
|
||||
surface = trace_surface(surface)->surface;
|
||||
}
|
||||
fb = stw_framebuffer_from_hdc( hdc );
|
||||
/* fb can be NULL if window was destroyed already */
|
||||
if (fb) {
|
||||
pipe_mutex_lock( fb->mutex );
|
||||
|
||||
#if DEBUG
|
||||
{
|
||||
struct pipe_surface *surface2;
|
||||
|
||||
if(!st_get_framebuffer_surface( fb->stfb, ST_SURFACE_FRONT_LEFT, &surface2 ))
|
||||
assert(0);
|
||||
else
|
||||
assert(surface2 == surface);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG
|
||||
if(stw_dev->trace_running) {
|
||||
screen = trace_screen(screen)->screen;
|
||||
surface = trace_surface(surface)->surface;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
stw_winsys->flush_frontbuffer(screen, surface, hdc);
|
||||
|
||||
if(fb) {
|
||||
stw_framebuffer_update(fb);
|
||||
|
||||
pipe_mutex_unlock( fb->mutex );
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -133,20 +158,13 @@ error1:
|
||||
boolean
|
||||
stw_init_thread(void)
|
||||
{
|
||||
if (!stw_tls_init_thread())
|
||||
return FALSE;
|
||||
|
||||
if (!stw_framebuffer_init_thread())
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
return stw_tls_init_thread();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
stw_cleanup_thread(void)
|
||||
{
|
||||
stw_framebuffer_cleanup_thread();
|
||||
stw_tls_cleanup_thread();
|
||||
}
|
||||
|
||||
|
@@ -84,7 +84,7 @@ stw_framebuffer_destroy_locked(
|
||||
* @sa http://msdn.microsoft.com/en-us/library/ms644975(VS.85).aspx
|
||||
* @sa http://msdn.microsoft.com/en-us/library/ms644960(VS.85).aspx
|
||||
*/
|
||||
static LRESULT CALLBACK
|
||||
LRESULT CALLBACK
|
||||
stw_call_window_proc(
|
||||
int nCode,
|
||||
WPARAM wParam,
|
||||
@@ -111,15 +111,10 @@ stw_call_window_proc(
|
||||
unsigned width = LOWORD( pParams->lParam );
|
||||
unsigned height = HIWORD( pParams->lParam );
|
||||
|
||||
/* FIXME: The mesa statetracker makes the assumptions that only
|
||||
* one context is using the framebuffer, and that that context is the
|
||||
* current one. However neither holds true, as WGL allows more than
|
||||
* one context to be bound to the same drawable, and this function can
|
||||
* be called from any thread.
|
||||
*/
|
||||
pipe_mutex_lock( fb->mutex );
|
||||
if (fb->stfb)
|
||||
st_resize_framebuffer( fb->stfb, width, height );
|
||||
fb->must_resize = TRUE;
|
||||
fb->width = width;
|
||||
fb->height = height;
|
||||
pipe_mutex_unlock( fb->mutex );
|
||||
}
|
||||
}
|
||||
@@ -140,6 +135,31 @@ stw_call_window_proc(
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
stw_framebuffer_get_size( struct stw_framebuffer *fb )
|
||||
{
|
||||
unsigned width, height;
|
||||
RECT rect;
|
||||
|
||||
assert(fb->hWnd);
|
||||
|
||||
GetClientRect( fb->hWnd, &rect );
|
||||
width = rect.right - rect.left;
|
||||
height = rect.bottom - rect.top;
|
||||
|
||||
if(width < 1)
|
||||
width = 1;
|
||||
if(height < 1)
|
||||
height = 1;
|
||||
|
||||
if(width != fb->width || height != fb->height) {
|
||||
fb->must_resize = TRUE;
|
||||
fb->width = width;
|
||||
fb->height = height;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create a new framebuffer object which will correspond to the given HDC.
|
||||
*/
|
||||
@@ -169,6 +189,8 @@ stw_framebuffer_create_locked(
|
||||
|
||||
stw_pixelformat_visual(&fb->visual, pfi);
|
||||
|
||||
stw_framebuffer_get_size(fb);
|
||||
|
||||
pipe_mutex_init( fb->mutex );
|
||||
|
||||
fb->next = stw_dev->fb_head;
|
||||
@@ -178,32 +200,6 @@ stw_framebuffer_create_locked(
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
stw_framebuffer_get_size( struct stw_framebuffer *fb, GLuint *pwidth, GLuint *pheight )
|
||||
{
|
||||
GLuint width, height;
|
||||
|
||||
if (fb->hWnd) {
|
||||
RECT rect;
|
||||
GetClientRect( fb->hWnd, &rect );
|
||||
width = rect.right - rect.left;
|
||||
height = rect.bottom - rect.top;
|
||||
}
|
||||
else {
|
||||
width = GetDeviceCaps( fb->hDC, HORZRES );
|
||||
height = GetDeviceCaps( fb->hDC, VERTRES );
|
||||
}
|
||||
|
||||
if(width < 1)
|
||||
width = 1;
|
||||
if(height < 1)
|
||||
height = 1;
|
||||
|
||||
*pwidth = width;
|
||||
*pheight = height;
|
||||
}
|
||||
|
||||
|
||||
BOOL
|
||||
stw_framebuffer_allocate(
|
||||
struct stw_framebuffer *fb)
|
||||
@@ -213,7 +209,6 @@ stw_framebuffer_allocate(
|
||||
if(!fb->stfb) {
|
||||
const struct stw_pixelformat_info *pfi = fb->pfi;
|
||||
enum pipe_format colorFormat, depthFormat, stencilFormat;
|
||||
GLuint width, height;
|
||||
|
||||
colorFormat = pfi->color_format;
|
||||
|
||||
@@ -229,16 +224,21 @@ stw_framebuffer_allocate(
|
||||
else
|
||||
stencilFormat = PIPE_FORMAT_NONE;
|
||||
|
||||
stw_framebuffer_get_size(fb, &width, &height);
|
||||
|
||||
assert(fb->must_resize);
|
||||
assert(fb->width);
|
||||
assert(fb->height);
|
||||
|
||||
fb->stfb = st_create_framebuffer(
|
||||
&fb->visual,
|
||||
colorFormat,
|
||||
depthFormat,
|
||||
stencilFormat,
|
||||
width,
|
||||
height,
|
||||
fb->width,
|
||||
fb->height,
|
||||
(void *) fb );
|
||||
|
||||
// to notify the context
|
||||
fb->must_resize = TRUE;
|
||||
}
|
||||
|
||||
pipe_mutex_unlock( fb->mutex );
|
||||
@@ -247,14 +247,29 @@ stw_framebuffer_allocate(
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Update the framebuffer's size if necessary.
|
||||
*/
|
||||
void
|
||||
stw_framebuffer_resize(
|
||||
stw_framebuffer_update(
|
||||
struct stw_framebuffer *fb)
|
||||
{
|
||||
GLuint width, height;
|
||||
assert(fb->stfb);
|
||||
stw_framebuffer_get_size(fb, &width, &height);
|
||||
st_resize_framebuffer(fb->stfb, width, height);
|
||||
assert(fb->height);
|
||||
assert(fb->width);
|
||||
|
||||
/* XXX: It would be nice to avoid checking the size again -- in theory
|
||||
* stw_call_window_proc would have cought the resize and stored the right
|
||||
* size already, but unfortunately threads created before the DllMain is
|
||||
* called don't get a DLL_THREAD_ATTACH notification, and there is no way
|
||||
* to know of their existing without using the not very portable PSAPI.
|
||||
*/
|
||||
stw_framebuffer_get_size(fb);
|
||||
|
||||
if(fb->must_resize) {
|
||||
st_resize_framebuffer(fb->stfb, fb->width, fb->height);
|
||||
fb->must_resize = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -407,6 +422,8 @@ stw_swap_buffers(
|
||||
|
||||
stw_dev->stw_winsys->flush_frontbuffer( screen, surface, hdc );
|
||||
|
||||
stw_framebuffer_update(fb);
|
||||
|
||||
pipe_mutex_unlock( fb->mutex );
|
||||
|
||||
return TRUE;
|
||||
@@ -423,38 +440,3 @@ stw_swap_layer_buffers(
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
boolean
|
||||
stw_framebuffer_init_thread(void)
|
||||
{
|
||||
struct stw_tls_data *tls_data;
|
||||
|
||||
tls_data = stw_tls_get_data();
|
||||
if(!tls_data)
|
||||
return FALSE;
|
||||
|
||||
tls_data->hCallWndProcHook = SetWindowsHookEx(WH_CALLWNDPROC,
|
||||
stw_call_window_proc,
|
||||
NULL,
|
||||
GetCurrentThreadId());
|
||||
if(tls_data->hCallWndProcHook == NULL)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
void
|
||||
stw_framebuffer_cleanup_thread(void)
|
||||
{
|
||||
struct stw_tls_data *tls_data;
|
||||
|
||||
tls_data = stw_tls_get_data();
|
||||
if(!tls_data)
|
||||
return;
|
||||
|
||||
if(tls_data->hCallWndProcHook) {
|
||||
UnhookWindowsHookEx(tls_data->hCallWndProcHook);
|
||||
tls_data->hCallWndProcHook = NULL;
|
||||
}
|
||||
}
|
||||
|
@@ -51,6 +51,11 @@ struct stw_framebuffer
|
||||
pipe_mutex mutex;
|
||||
struct st_framebuffer *stfb;
|
||||
|
||||
/* FIXME: Make this work for multiple contexts bound to the same framebuffer */
|
||||
boolean must_resize;
|
||||
unsigned width;
|
||||
unsigned height;
|
||||
|
||||
/** This is protected by stw_device::mutex, not the mutex above */
|
||||
struct stw_framebuffer *next;
|
||||
};
|
||||
@@ -65,7 +70,7 @@ stw_framebuffer_allocate(
|
||||
struct stw_framebuffer *fb );
|
||||
|
||||
void
|
||||
stw_framebuffer_resize(
|
||||
stw_framebuffer_update(
|
||||
struct stw_framebuffer *fb);
|
||||
|
||||
void
|
||||
@@ -79,10 +84,4 @@ struct stw_framebuffer *
|
||||
stw_framebuffer_from_hdc(
|
||||
HDC hdc );
|
||||
|
||||
boolean
|
||||
stw_framebuffer_init_thread(void);
|
||||
|
||||
void
|
||||
stw_framebuffer_cleanup_thread(void);
|
||||
|
||||
#endif /* STW_FRAMEBUFFER_H */
|
||||
|
@@ -51,9 +51,23 @@ stw_tls_data_create()
|
||||
|
||||
data = CALLOC_STRUCT(stw_tls_data);
|
||||
if (!data)
|
||||
return NULL;
|
||||
goto no_data;
|
||||
|
||||
data->hCallWndProcHook = SetWindowsHookEx(WH_CALLWNDPROC,
|
||||
stw_call_window_proc,
|
||||
NULL,
|
||||
GetCurrentThreadId());
|
||||
if(data->hCallWndProcHook == NULL)
|
||||
goto no_hook;
|
||||
|
||||
TlsSetValue(tlsIndex, data);
|
||||
|
||||
return data;
|
||||
|
||||
no_hook:
|
||||
FREE(data);
|
||||
no_data:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
boolean
|
||||
@@ -69,8 +83,6 @@ stw_tls_init_thread(void)
|
||||
if(!data)
|
||||
return FALSE;
|
||||
|
||||
TlsSetValue(tlsIndex, data);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -84,8 +96,16 @@ stw_tls_cleanup_thread(void)
|
||||
}
|
||||
|
||||
data = (struct stw_tls_data *) TlsGetValue(tlsIndex);
|
||||
TlsSetValue(tlsIndex, NULL);
|
||||
FREE(data);
|
||||
if(data) {
|
||||
TlsSetValue(tlsIndex, NULL);
|
||||
|
||||
if(data->hCallWndProcHook) {
|
||||
UnhookWindowsHookEx(data->hCallWndProcHook);
|
||||
data->hCallWndProcHook = NULL;
|
||||
}
|
||||
|
||||
FREE(data);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
@@ -110,12 +130,9 @@ stw_tls_get_data(void)
|
||||
if(!data) {
|
||||
/* DllMain is called with DLL_THREAD_ATTACH only by threads created after
|
||||
* the DLL is loaded by the process */
|
||||
|
||||
data = stw_tls_data_create();
|
||||
if(!data)
|
||||
return NULL;
|
||||
|
||||
TlsSetValue(tlsIndex, data);
|
||||
}
|
||||
|
||||
return data;
|
||||
|
@@ -50,4 +50,10 @@ stw_tls_cleanup(void);
|
||||
struct stw_tls_data *
|
||||
stw_tls_get_data(void);
|
||||
|
||||
LRESULT CALLBACK
|
||||
stw_call_window_proc(
|
||||
int nCode,
|
||||
WPARAM wParam,
|
||||
LPARAM lParam );
|
||||
|
||||
#endif /* STW_TLS_H */
|
||||
|
@@ -547,7 +547,7 @@ PFNGLCHECKFRAMEBUFFERSTATUSPROC __glewCheckFramebufferStatus = NULL;
|
||||
PFNGLDELETEFRAMEBUFFERSPROC __glewDeleteFramebuffers = NULL;
|
||||
PFNGLDELETERENDERBUFFERSPROC __glewDeleteRenderbuffers = NULL;
|
||||
PFNGLFRAMEBUFFERRENDERBUFFERPROC __glewFramebufferRenderbuffer = NULL;
|
||||
PFNGLFRAMEBUFFERTEXTURLAYERPROC __glewFramebufferTexturLayer = NULL;
|
||||
PFNGLFRAMEBUFFERTEXTURELAYERPROC __glewFramebufferTextureLayer = NULL;
|
||||
PFNGLFRAMEBUFFERTEXTURE1DPROC __glewFramebufferTexture1D = NULL;
|
||||
PFNGLFRAMEBUFFERTEXTURE2DPROC __glewFramebufferTexture2D = NULL;
|
||||
PFNGLFRAMEBUFFERTEXTURE3DPROC __glewFramebufferTexture3D = NULL;
|
||||
@@ -2739,7 +2739,7 @@ static GLboolean _glewInit_GL_ARB_framebuffer_object (GLEW_CONTEXT_ARG_DEF_INIT)
|
||||
r = ((glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteFramebuffers")) == NULL) || r;
|
||||
r = ((glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)glewGetProcAddress((const GLubyte*)"glDeleteRenderbuffers")) == NULL) || r;
|
||||
r = ((glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferRenderbuffer")) == NULL) || r;
|
||||
r = ((glFramebufferTexturLayer = (PFNGLFRAMEBUFFERTEXTURLAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexturLayer")) == NULL) || r;
|
||||
r = ((glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTextureLayer")) == NULL) || r;
|
||||
r = ((glFramebufferTexture1D = (PFNGLFRAMEBUFFERTEXTURE1DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture1D")) == NULL) || r;
|
||||
r = ((glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture2D")) == NULL) || r;
|
||||
r = ((glFramebufferTexture3D = (PFNGLFRAMEBUFFERTEXTURE3DPROC)glewGetProcAddress((const GLubyte*)"glFramebufferTexture3D")) == NULL) || r;
|
||||
|
@@ -708,7 +708,7 @@ static void _glewInfo_GL_ARB_framebuffer_object (void)
|
||||
glewInfoFunc("glDeleteFramebuffers", glDeleteFramebuffers == NULL);
|
||||
glewInfoFunc("glDeleteRenderbuffers", glDeleteRenderbuffers == NULL);
|
||||
glewInfoFunc("glFramebufferRenderbuffer", glFramebufferRenderbuffer == NULL);
|
||||
glewInfoFunc("glFramebufferTexturLayer", glFramebufferTexturLayer == NULL);
|
||||
glewInfoFunc("glFramebufferTextureLayer", glFramebufferTextureLayer == NULL);
|
||||
glewInfoFunc("glFramebufferTexture1D", glFramebufferTexture1D == NULL);
|
||||
glewInfoFunc("glFramebufferTexture2D", glFramebufferTexture2D == NULL);
|
||||
glewInfoFunc("glFramebufferTexture3D", glFramebufferTexture3D == NULL);
|
||||
|
@@ -869,6 +869,20 @@ PUBLIC void glXDestroyGLXPixmap(Display *dpy, GLXPixmap glxpixmap)
|
||||
req->glxpixmap = glxpixmap;
|
||||
UnlockDisplay(dpy);
|
||||
SyncHandle();
|
||||
|
||||
#ifdef GLX_DIRECT_RENDERING
|
||||
{
|
||||
int screen;
|
||||
__GLXdisplayPrivate *const priv = __glXInitialize(dpy);
|
||||
__GLXDRIdrawable *pdraw = GetGLXDRIDrawable(dpy, glxpixmap, &screen);
|
||||
__GLXscreenConfigs *psc = &priv->screenConfigs[screen];
|
||||
|
||||
if (pdraw != NULL) {
|
||||
(*pdraw->destroyDrawable) (pdraw);
|
||||
__glxHashDelete(psc->drawHash, glxpixmap);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
PUBLIC void glXSwapBuffers(Display *dpy, GLXDrawable drawable)
|
||||
|
@@ -300,19 +300,34 @@ intel_bufferobj_buffer(struct intel_context *intel,
|
||||
}
|
||||
|
||||
if (intel_obj->buffer == NULL) {
|
||||
<<<<<<< HEAD:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
void *sys_buffer = intel_obj->sys_buffer;
|
||||
|
||||
/* only one of buffer and sys_buffer could be non-NULL */
|
||||
=======
|
||||
>>>>>>> mesa_7_5_branch:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
intel_bufferobj_alloc_buffer(intel, intel_obj);
|
||||
<<<<<<< HEAD:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
intel_obj->sys_buffer = NULL;
|
||||
|
||||
=======
|
||||
>>>>>>> mesa_7_5_branch:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
intel_bufferobj_subdata(&intel->ctx,
|
||||
GL_ARRAY_BUFFER_ARB,
|
||||
0,
|
||||
intel_obj->Base.Size,
|
||||
<<<<<<< HEAD:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
sys_buffer,
|
||||
=======
|
||||
intel_obj->sys_buffer,
|
||||
>>>>>>> mesa_7_5_branch:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
&intel_obj->Base);
|
||||
<<<<<<< HEAD:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
_mesa_free(sys_buffer);
|
||||
=======
|
||||
_mesa_free(intel_obj->sys_buffer);
|
||||
intel_obj->sys_buffer = NULL;
|
||||
>>>>>>> mesa_7_5_branch:src/mesa/drivers/dri/intel/intel_buffer_objects.c
|
||||
}
|
||||
|
||||
return intel_obj->buffer;
|
||||
|
@@ -359,8 +359,12 @@ intel_stencil_drawpixels(GLcontext * ctx,
|
||||
|
||||
_mesa_VertexPointer(2, GL_FLOAT, 2 * sizeof(GLfloat), &vertices);
|
||||
_mesa_Enable(GL_VERTEX_ARRAY);
|
||||
<<<<<<< HEAD:src/mesa/drivers/dri/intel/intel_pixel_draw.c
|
||||
intel_meta_set_default_texrect(intel);
|
||||
|
||||
=======
|
||||
_mesa_Enable(GL_TEXTURE_COORD_ARRAY);
|
||||
>>>>>>> mesa_7_5_branch:src/mesa/drivers/dri/intel/intel_pixel_draw.c
|
||||
_mesa_DrawArrays(GL_TRIANGLE_FAN, 0, 4);
|
||||
|
||||
intel_meta_restore_texcoords(intel);
|
||||
|
@@ -412,6 +412,8 @@ GLboolean r300CreateContext(const __GLcontextModes * glVisual,
|
||||
|
||||
_mesa_set_mvp_with_dp4( ctx, GL_TRUE );
|
||||
|
||||
_mesa_set_mvp_with_dp4( ctx, GL_TRUE );
|
||||
|
||||
/* Initialize the software rasterizer and helper modules.
|
||||
*/
|
||||
_swrast_CreateContext(ctx);
|
||||
|
@@ -2218,7 +2218,7 @@ Fake_glXCreatePixmap( Display *dpy, GLXFBConfig config, Pixmap pixmap,
|
||||
if (!dpy || !config || !pixmap)
|
||||
return 0;
|
||||
|
||||
for (attr = attribList; *attr; attr++) {
|
||||
for (attr = attribList; attr && *attr; attr++) {
|
||||
switch (*attr) {
|
||||
case GLX_TEXTURE_FORMAT_EXT:
|
||||
attr++;
|
||||
|
@@ -468,9 +468,9 @@ do { \
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
#ifndef Elements
|
||||
#define Elements(x) (sizeof(x)/sizeof(*(x)))
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
@@ -1258,6 +1258,24 @@ initialize_framebuffer_size(GLcontext *ctx, GLframebuffer *fb)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check if the viewport/scissor size has not yet been initialized.
|
||||
* Initialize the size if the given width and height are non-zero.
|
||||
*/
|
||||
void
|
||||
_mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height)
|
||||
{
|
||||
if (!ctx->ViewportInitialized && width > 0 && height > 0) {
|
||||
/* Note: set flag here, before calling _mesa_set_viewport(), to prevent
|
||||
* potential infinite recursion.
|
||||
*/
|
||||
ctx->ViewportInitialized = GL_TRUE;
|
||||
_mesa_set_viewport(ctx, 0, 0, width, height);
|
||||
_mesa_set_scissor(ctx, 0, 0, width, height);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Bind the given context to the given drawBuffer and readBuffer and
|
||||
* make it the current context for the calling thread.
|
||||
@@ -1375,25 +1393,24 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
|
||||
ASSERT(drawBuffer->Height > 0);
|
||||
#endif
|
||||
|
||||
if (newCtx->FirstTimeCurrent) {
|
||||
/* set initial viewport and scissor size now */
|
||||
_mesa_set_viewport(newCtx, 0, 0,
|
||||
drawBuffer->Width, drawBuffer->Height);
|
||||
_mesa_set_scissor(newCtx, 0, 0,
|
||||
drawBuffer->Width, drawBuffer->Height );
|
||||
check_context_limits(newCtx);
|
||||
if (drawBuffer) {
|
||||
_mesa_check_init_viewport(newCtx,
|
||||
drawBuffer->Width, drawBuffer->Height);
|
||||
}
|
||||
}
|
||||
|
||||
/* We can use this to help debug user's problems. Tell them to set
|
||||
* the MESA_INFO env variable before running their app. Then the
|
||||
* first time each context is made current we'll print some useful
|
||||
* information.
|
||||
*/
|
||||
if (newCtx->FirstTimeCurrent) {
|
||||
check_context_limits(newCtx);
|
||||
|
||||
/* We can use this to help debug user's problems. Tell them to set
|
||||
* the MESA_INFO env variable before running their app. Then the
|
||||
* first time each context is made current we'll print some useful
|
||||
* information.
|
||||
*/
|
||||
if (_mesa_getenv("MESA_INFO")) {
|
||||
_mesa_print_info();
|
||||
}
|
||||
|
||||
newCtx->FirstTimeCurrent = GL_FALSE;
|
||||
}
|
||||
}
|
||||
|
@@ -130,6 +130,9 @@ extern void
|
||||
_mesa_copy_context(const GLcontext *src, GLcontext *dst, GLuint mask);
|
||||
|
||||
|
||||
extern void
|
||||
_mesa_check_init_viewport(GLcontext *ctx, GLuint width, GLuint height);
|
||||
|
||||
extern GLboolean
|
||||
_mesa_make_current( GLcontext *ctx, GLframebuffer *drawBuffer,
|
||||
GLframebuffer *readBuffer );
|
||||
|
@@ -958,8 +958,8 @@ LONGSTRING static const char enum_string_table[] =
|
||||
"GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV\0"
|
||||
"GL_MAX_VARYING_FLOATS\0"
|
||||
"GL_MAX_VARYING_FLOATS_ARB\0"
|
||||
"GL_MAX_VERTEX_ATTRIBS\0"
|
||||
"GL_MAX_VERTEX_ATTRIBS_ARB\0"
|
||||
"GL_MAX_VERTEX_GENERIC_ATTRIBS\0"
|
||||
"GL_MAX_VERTEX_GENERIC_ATTRIBS_ARB\0"
|
||||
"GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\0"
|
||||
"GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\0"
|
||||
"GL_MAX_VERTEX_UNIFORM_COMPONENTS\0"
|
||||
|
@@ -1601,9 +1601,6 @@ _mesa_generate_mipmap(GLcontext *ctx, GLenum target,
|
||||
return;
|
||||
}
|
||||
|
||||
if (dstImage->ImageOffsets)
|
||||
_mesa_free(dstImage->ImageOffsets);
|
||||
|
||||
/* Free old image data */
|
||||
if (dstImage->Data)
|
||||
ctx->Driver.FreeTexImageData(ctx, dstImage);
|
||||
|
@@ -2979,6 +2979,8 @@ struct __GLcontextRec
|
||||
GLenum RenderMode; /**< either GL_RENDER, GL_SELECT, GL_FEEDBACK */
|
||||
GLbitfield NewState; /**< bitwise-or of _NEW_* flags */
|
||||
|
||||
GLboolean ViewportInitialized; /**< has viewport size been initialized? */
|
||||
|
||||
GLbitfield varying_vp_inputs; /**< mask of VERT_BIT_* flags */
|
||||
|
||||
/** \name Derived state */
|
||||
|
@@ -1250,6 +1250,8 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
|
||||
* We allocate the array for 1D/2D textures too in order to avoid special-
|
||||
* case code in the texstore routines.
|
||||
*/
|
||||
if (img->ImageOffsets)
|
||||
_mesa_free(img->ImageOffsets);
|
||||
img->ImageOffsets = (GLuint *) _mesa_malloc(depth * sizeof(GLuint));
|
||||
for (i = 0; i < depth; i++) {
|
||||
img->ImageOffsets[i] = i * width * height;
|
||||
|
@@ -274,20 +274,11 @@ st_make_current(struct st_context *st,
|
||||
_glapi_check_multithread();
|
||||
|
||||
if (st) {
|
||||
GLboolean firstTime = st->ctx->FirstTimeCurrent;
|
||||
if(!_mesa_make_current(st->ctx, &draw->Base, &read->Base))
|
||||
if (!_mesa_make_current(st->ctx, &draw->Base, &read->Base))
|
||||
return GL_FALSE;
|
||||
/* Need to initialize viewport here since draw->Base->Width/Height
|
||||
* will still be zero at this point.
|
||||
* This could be improved, but would require rather extensive work
|
||||
* elsewhere (allocate rb surface storage sooner)
|
||||
*/
|
||||
if (firstTime) {
|
||||
GLuint w = draw->InitWidth, h = draw->InitHeight;
|
||||
_mesa_set_viewport(st->ctx, 0, 0, w, h);
|
||||
_mesa_set_scissor(st->ctx, 0, 0, w, h);
|
||||
|
||||
}
|
||||
_mesa_check_init_viewport(st->ctx, draw->InitWidth, draw->InitHeight);
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
else {
|
||||
|
@@ -134,16 +134,7 @@ void st_resize_framebuffer( struct st_framebuffer *stfb,
|
||||
if (stfb->Base.Width != width || stfb->Base.Height != height) {
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
if (ctx) {
|
||||
if (stfb->InitWidth == 0 && stfb->InitHeight == 0) {
|
||||
/* didn't have a valid size until now */
|
||||
stfb->InitWidth = width;
|
||||
stfb->InitHeight = height;
|
||||
if (ctx->Viewport.Width <= 1) {
|
||||
/* set context's initial viewport/scissor size */
|
||||
_mesa_set_viewport(ctx, 0, 0, width, height);
|
||||
_mesa_set_scissor(ctx, 0, 0, width, height);
|
||||
}
|
||||
}
|
||||
_mesa_check_init_viewport(ctx, width, height);
|
||||
|
||||
_mesa_resize_framebuffer(ctx, &stfb->Base, width, height);
|
||||
|
||||
|
@@ -198,9 +198,6 @@ st_generate_mipmap(GLcontext *ctx, GLenum target,
|
||||
return;
|
||||
}
|
||||
|
||||
if (dstImage->ImageOffsets)
|
||||
_mesa_free(dstImage->ImageOffsets);
|
||||
|
||||
/* Free old image data */
|
||||
if (dstImage->Data)
|
||||
ctx->Driver.FreeTexImageData(ctx, dstImage);
|
||||
|
Reference in New Issue
Block a user