Merge branch 'master' into i915-superioctl

This commit is contained in:
Dave Airlie
2007-10-12 11:02:46 +10:00
61 changed files with 1562 additions and 419 deletions

View File

@@ -12,7 +12,7 @@ WARN_FLAGS = -Wall
OPT_FLAGS = -O -g
EXPAT_INCLUDES = -I/usr/local/include
X11_INCLUDES = -I/usr/X11R6/include
X11_INCLUDES = -I/usr/local/include
DEFINES = -DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER \
-DGLX_DIRECT_RENDERING -DGLX_INDIRECT_RENDERING \
-DHAVE_ALIAS
@@ -28,11 +28,11 @@ ASM_SOURCES =
LIBDRM_CFLAGS = `pkg-config --cflags libdrm`
LIBDRM_LIB = `pkg-config --libs libdrm`
DRI_LIB_DEPS = -L/usr/local/lib -lm -pthread -lexpat $(LIBDRM_LIB)
GL_LIB_DEPS = -L/usr/X11R6/lib -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
GL_LIB_DEPS = -L/usr/local/lib -lX11 -lXext -lXxf86vm -lXdamage -lXfixes \
-lm -pthread $(LIBDRM_LIB)
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -L/usr/X11R6/lib -lGLU -lGL -lX11 -lXmu -lXt -lXi -lm
GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -L/usr/X11R6/lib -lGL -lXt -lX11
GLUT_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -L/usr/local/lib -lGLU -lGL -lX11 -lXmu -lXt -lXi -lm
GLW_LIB_DEPS = -L$(TOP)/$(LIB_DIR) -L/usr/local/lib -lGL -lXt -lX11
# Directories

3
progs/beos/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
demo
GLInfo
sample

View File

@@ -41,8 +41,8 @@ shadowtex
showbuffer.c
showbuffer.h
singlebuffer
spriteblast
spectex
spriteblast
stex3d
streaming_rect
teapot

4
progs/directfb/.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
df_gears
df_morph3d
df_reflect
multi_window

5
progs/egl/.gitignore vendored Normal file
View File

@@ -0,0 +1,5 @@
demo1
demo2
demo3
eglgears
eglinfo

1
progs/fbdev/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
glfbdevtest

42
progs/fp/.gitignore vendored Normal file
View File

@@ -0,0 +1,42 @@
point-position
readtex.c
readtex.h
tri-abs
tri-add
tri-cmp
tri-cos
tri-depth
tri-depth2
tri-depthwrite
tri-depthwrite2
tri-dp3
tri-dp4
tri-dph
tri-dst
tri-ex2
tri-flr
tri-frc
tri-kil
tri-lg2
tri-lit
tri-lrp
tri-mad
tri-max
tri-min
tri-mov
tri-mul
tri-param
tri-position
tri-pow
tri-rcp
tri-rsq
tri-scs
tri-sge
tri-sge2
tri-sin
tri-slt
tri-sub
tri-swz
tri-swz2
tri-tex
tri-xpd

10
progs/glsl/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
brick
bump
deriv
extfuncs.h
mandelbrot
noise
readtex.c
readtex.h
texdemo1
toyball

View File

@@ -247,7 +247,7 @@ LoadAndCompileShader(GLuint shader, const char *text)
GLchar log[1000];
GLsizei len;
glGetShaderInfoLog_func(shader, 1000, &len, log);
fprintf(stderr, "brick: problem compiling shader: %s\n", log);
fprintf(stderr, "bump: problem compiling shader: %s\n", log);
exit(1);
}
else {
@@ -267,12 +267,12 @@ ReadShader(GLuint shader, const char *filename)
char *buffer = (char*) malloc(max);
FILE *f = fopen(filename, "r");
if (!f) {
fprintf(stderr, "brick: Unable to open shader file %s\n", filename);
fprintf(stderr, "bump: Unable to open shader file %s\n", filename);
exit(1);
}
n = fread(buffer, 1, max, f);
printf("brick: read %d bytes from shader file %s\n", n, filename);
printf("bump: read %d bytes from shader file %s\n", n, filename);
if (n > 0) {
buffer[n] = 0;
LoadAndCompileShader(shader, buffer);

View File

@@ -172,7 +172,7 @@ LoadAndCompileShader(GLuint shader, const char *text)
GLchar log[1000];
GLsizei len;
glGetShaderInfoLog_func(shader, 1000, &len, log);
fprintf(stderr, "brick: problem compiling shader: %s\n", log);
fprintf(stderr, "mandelbrot: problem compiling shader: %s\n", log);
exit(1);
}
else {
@@ -192,12 +192,12 @@ ReadShader(GLuint shader, const char *filename)
char *buffer = (char*) malloc(max);
FILE *f = fopen(filename, "r");
if (!f) {
fprintf(stderr, "brick: Unable to open shader file %s\n", filename);
fprintf(stderr, "mandelbrot: Unable to open shader file %s\n", filename);
exit(1);
}
n = fread(buffer, 1, max, f);
printf("brick: read %d bytes from shader file %s\n", n, filename);
printf("mandelbrot: read %d bytes from shader file %s\n", n, filename);
if (n > 0) {
buffer[n] = 0;
LoadAndCompileShader(shader, buffer);

View File

@@ -188,7 +188,7 @@ LoadAndCompileShader(GLuint shader, const char *text)
GLchar log[1000];
GLsizei len;
glGetShaderInfoLog_func(shader, 1000, &len, log);
fprintf(stderr, "brick: problem compiling shader: %s\n", log);
fprintf(stderr, "noise: problem compiling shader: %s\n", log);
exit(1);
}
else {

View File

@@ -185,7 +185,7 @@ LoadAndCompileShader(GLuint shader, const char *text)
GLchar log[1000];
GLsizei len;
glGetShaderInfoLog_func(shader, 1000, &len, log);
fprintf(stderr, "brick: problem compiling shader: %s\n", log);
fprintf(stderr, "toyball: problem compiling shader: %s\n", log);
exit(1);
}
else {
@@ -205,12 +205,12 @@ ReadShader(GLuint shader, const char *filename)
char *buffer = (char*) malloc(max);
FILE *f = fopen(filename, "r");
if (!f) {
fprintf(stderr, "brick: Unable to open shader file %s\n", filename);
fprintf(stderr, "toyball: Unable to open shader file %s\n", filename);
exit(1);
}
n = fread(buffer, 1, max, f);
printf("brick: read %d bytes from shader file %s\n", n, filename);
printf("toyball: read %d bytes from shader file %s\n", n, filename);
if (n > 0) {
buffer[n] = 0;
LoadAndCompileShader(shader, buffer);

6
progs/miniglx/.gitignore vendored Normal file
View File

@@ -0,0 +1,6 @@
manytex
miniglxsample
miniglxtest
sample_server
sample_server2
texline

8
progs/osdemos/.gitignore vendored Normal file
View File

@@ -0,0 +1,8 @@
osdemo
osdemo16
osdemo32
ostest1
readtex.c
readtex.h
showbuffer.c
showbuffer.h

View File

@@ -1,24 +1,41 @@
.cvsignore
accum
anywin
bdemo
binfo
bitmap1
bitmap2
blendeq
blendxor
bugger
copy
cursor
demo
depth
eval
ffset
fog
font
font
incopy
line
logo
lthreads
lxdemo
lxgears
lxheads
lxinfo
lxpixmap
nurb
oglinfo
olympic
overlay
pend
point
prim
quad
readtex.c
readtex.h
select
shape
sphere
@@ -28,18 +45,3 @@ stretch
texture
tri
wave
bugger
pend
lthreads
lxdemo
lxgears
lxheads
lxinfo
lxpixmap
anywin
ffset
bdemo
binfo
incopy
demo
font

3
progs/slang/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
cltest
sotest
vstest

View File

@@ -1,5 +1,4 @@
.cvsignore
getproclist.h
afsmultiarb
antialias
arbfpspec
@@ -34,17 +33,18 @@ fogcoord
fptest1
fptexture
getprocaddress
jkrahntest
getproclist.h
interleave
invert
jkrahntest
manytex
mipmap_limits
multipal
no_s3tc
packedpixels
pbo
projtex
prog_parameter
projtex
random
readrate
readtex.c

1
progs/tools/trace/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
gltrace.cc

65
progs/trivial/.gitignore vendored Normal file
View File

@@ -0,0 +1,65 @@
clear
dlist-dangling
dlist-edgeflag
dlist-edgeflag-dangling
drawarrays
drawelements
drawrange
line
line-clip
line-cull
line-userclip
line-userclip-clip
line-userclip-nop
line-userclip-nop-clip
lineloop
lineloop-clip
point
point-clip
point-param
point-wide
poly
poly-flat
poly-unfilled
quad
quad-clip
quad-clip-all-vertices
quad-clip-nearplane
quad-degenerate
quad-flat
quad-offset-factor
quad-offset-unfilled
quad-offset-units
quad-tex-2d
quad-tex-3d
quad-tex-pbo
quad-unfilled
quads
quadstrip
quadstrip-flat
readtex.c
readtex.h
tri
tri-blend
tri-clip
tri-cull
tri-dlist
tri-edgeflag
tri-flat
tri-flat-clip
tri-tex-3d
tri-unfilled
tri-unfilled-clip
tri-unfilled-smooth
tri-unfilled-userclip
tri-userclip
tristrip
tristrip-clip
vbo-drawarrays
vbo-drawelements
vbo-drawrange
vp-array
vp-clip
vp-line-clip
vp-tri
vp-unfilled

1
progs/vp/.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
vp-tris

View File

@@ -5,14 +5,14 @@ glxgears
glxgears_fbconfig
glxheads
glxinfo
glxpixmap
glxpbdemo
glxpixmap
glxswapcontrol
manywin
offset
overlay
pbinfo
pbdemo
pbinfo
texture_from_pixmap
wincopy
xdemo

View File

@@ -8,7 +8,9 @@ INCDIR = $(TOP)/include
LIB_DEP = $(TOP)/$(LIB_DIR)/$(GL_LIB_NAME) $(TOP)/$(LIB_DIR)/$(GLU_LIB_NAME)
PROGS = glthreads \
PROGS = \
corender \
glthreads \
glxdemo \
glxgears \
glxgears_fbconfig \
@@ -17,6 +19,7 @@ PROGS = glthreads \
glxinfo \
glxpixmap \
glxpbdemo \
glxsnoop \
glxswapcontrol \
manywin \
offset \
@@ -82,3 +85,11 @@ xuserotfont.o: xuserotfont.c xuserotfont.h
xrotfontdemo.o: xrotfontdemo.c xuserotfont.h
$(CC) -c -I. -I$(INCDIR) $(X11_INCLUDES) $(CFLAGS) xrotfontdemo.c
corender: corender.o ipc.o
$(CC) $(CFLAGS) corender.o ipc.o $(APP_LIB_DEPS) -o $@
corender.o: corender.c ipc.h
$(CC) -c -I. -I$(INCDIR) $(X11_INCLUDES) $(CFLAGS) corender.c
ipc.o: ipc.c ipc.h
$(CC) -c -I. -I$(INCDIR) $(X11_INCLUDES) $(CFLAGS) ipc.c

396
progs/xdemos/corender.c Normal file
View File

@@ -0,0 +1,396 @@
/**
* Example of cooperative rendering into one window by two processes.
* The first instance of the program creates the GLX window.
* The second instance of the program gets the window ID from the first
* and draws into it.
* Socket IPC is used for synchronization.
*
* Usage:
* 1. run 'corender &'
* 2. run 'corender 2' (any arg will do)
*
* Brian Paul
* 11 Oct 2007
*/
#include <GL/gl.h>
#include <GL/glx.h>
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/keysym.h>
#include <unistd.h>
#include "ipc.h"
static int MyID = 0; /* 0 or 1 */
static int WindowID = 0;
static GLXContext Context = 0;
static int Width = 700, Height = 350;
static int Rot = 0;
static int Sock = 0;
static GLfloat Red[4] = {1.0, 0.2, 0.2, 1.0};
static GLfloat Blue[4] = {0.2, 0.2, 1.0, 1.0};
static int Sync = 1; /** synchronized rendering? */
static void
setup_ipc(void)
{
int k, port = 10001;
if (MyID == 0) {
/* I'm the first one, wait for connection from second */
k = CreatePort(&port);
assert(k != -1);
printf("Waiting for connection from another 'corender'\n");
Sock = AcceptConnection(k);
printf("Got connection, sending windowID\n");
/* send windowID */
SendData(Sock, &WindowID, sizeof(WindowID));
}
else {
/* I'm the second one, connect to first */
char hostname[1000];
MyHostName(hostname, 1000);
Sock = Connect(hostname, port);
assert(Sock != -1);
/* get windowID */
ReceiveData(Sock, &WindowID, sizeof(WindowID));
printf("Contacted first 'corender', getting WindowID\n");
}
}
/** from GLUT */
static void
doughnut(GLfloat r, GLfloat R, GLint nsides, GLint rings)
{
int i, j;
GLfloat theta, phi, theta1;
GLfloat cosTheta, sinTheta;
GLfloat cosTheta1, sinTheta1;
GLfloat ringDelta, sideDelta;
ringDelta = 2.0 * M_PI / rings;
sideDelta = 2.0 * M_PI / nsides;
theta = 0.0;
cosTheta = 1.0;
sinTheta = 0.0;
for (i = rings - 1; i >= 0; i--) {
theta1 = theta + ringDelta;
cosTheta1 = cos(theta1);
sinTheta1 = sin(theta1);
glBegin(GL_QUAD_STRIP);
phi = 0.0;
for (j = nsides; j >= 0; j--) {
GLfloat cosPhi, sinPhi, dist;
phi += sideDelta;
cosPhi = cos(phi);
sinPhi = sin(phi);
dist = R + r * cosPhi;
glNormal3f(cosTheta1 * cosPhi, -sinTheta1 * cosPhi, sinPhi);
glVertex3f(cosTheta1 * dist, -sinTheta1 * dist, r * sinPhi);
glNormal3f(cosTheta * cosPhi, -sinTheta * cosPhi, sinPhi);
glVertex3f(cosTheta * dist, -sinTheta * dist, r * sinPhi);
}
glEnd();
theta = theta1;
cosTheta = cosTheta1;
sinTheta = sinTheta1;
}
}
static void
redraw(Display *dpy)
{
int dbg = 0;
glXMakeCurrent(dpy, WindowID, Context);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glClearColor(0.5, 0.5, 0.5, 0.0);
if (MyID == 0) {
/* First process */
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(-1, 0, 0);
glRotatef(Rot, 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Red);
doughnut(0.5, 2.0, 20, 30);
glPopMatrix();
glFinish();
if (!Sync) {
usleep(1000*10);
}
/* signal second process to render */
if (Sync) {
int code = 1;
if (dbg) printf("0: send signal\n");
SendData(Sock, &code, sizeof(code));
SendData(Sock, &Rot, sizeof(Rot));
}
/* wait for second process to finish rendering */
if (Sync) {
int code = 0;
if (dbg) printf("0: wait signal\n");
ReceiveData(Sock, &code, sizeof(code));
if (dbg) printf("0: got signal\n");
assert(code == 2);
}
}
else {
/* Second process */
/* wait for first process's signal for me to render */
if (Sync) {
int code = 0;
if (dbg) printf("1: wait signal\n");
ReceiveData(Sock, &code, sizeof(code));
ReceiveData(Sock, &Rot, sizeof(Rot));
if (dbg) printf("1: got signal\n");
assert(code == 1);
}
/* XXX this clear should not be here, but for some reason, it
* makes things _mostly_ work correctly w/ NVIDIA's driver.
* There's only occasional glitches.
* Without this glClear(), depth buffer for the second process
* is pretty much broken.
*/
//glClear(GL_DEPTH_BUFFER_BIT);
glPushMatrix();
glTranslatef(1, 0, 0);
glRotatef(Rot + 90 , 1, 0, 0);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Blue);
doughnut(0.5, 2.0, 20, 30);
glPopMatrix();
glFinish();
glXSwapBuffers(dpy, WindowID);
usleep(1000*10);
/* signal first process that I'm done rendering */
if (Sync) {
int code = 2;
if (dbg) printf("1: send signal\n");
SendData(Sock, &code, sizeof(code));
}
}
}
static void
resize(Display *dpy, int width, int height)
{
float ar = (float) width / height;
glXMakeCurrent(dpy, WindowID, Context);
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-ar, ar, 1.0, -1.0, 5.0, 200.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0, 0, -15);
Width = width;
Height = height;
}
static void
set_window_title(Display *dpy, Window win, const char *title)
{
XSizeHints sizehints;
sizehints.flags = 0;
XSetStandardProperties(dpy, win, title, title,
None, (char **)NULL, 0, &sizehints);
}
static Window
make_gl_window(Display *dpy, XVisualInfo *visinfo, int width, int height)
{
int scrnum;
XSetWindowAttributes attr;
unsigned long mask;
Window root;
Window win;
int x = 0, y = 0;
char *name = NULL;
scrnum = DefaultScreen( dpy );
root = RootWindow( dpy, scrnum );
/* window attributes */
attr.background_pixel = 0;
attr.border_pixel = 0;
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
win = XCreateWindow( dpy, root, x, y, width, height,
0, visinfo->depth, InputOutput,
visinfo->visual, mask, &attr );
/* set hints and properties */
{
XSizeHints sizehints;
sizehints.x = x;
sizehints.y = y;
sizehints.width = width;
sizehints.height = height;
sizehints.flags = USSize | USPosition;
XSetNormalHints(dpy, win, &sizehints);
XSetStandardProperties(dpy, win, name, name,
None, (char **)NULL, 0, &sizehints);
}
return win;
}
static void
set_event_mask(Display *dpy, Window win)
{
XSetWindowAttributes attr;
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
XChangeWindowAttributes(dpy, win, CWEventMask, &attr);
}
static void
event_loop(Display *dpy)
{
while (1) {
while (XPending(dpy) > 0) {
XEvent event;
XNextEvent(dpy, &event);
switch (event.type) {
case Expose:
redraw(dpy);
break;
case ConfigureNotify:
resize(dpy, event.xconfigure.width, event.xconfigure.height);
break;
case KeyPress:
{
char buffer[10];
int r, code;
code = XLookupKeysym(&event.xkey, 0);
if (code == XK_Left) {
}
else {
r = XLookupString(&event.xkey, buffer, sizeof(buffer),
NULL, NULL);
if (buffer[0] == 27) {
exit(0);
}
}
}
default:
/* nothing */
;
}
}
if (MyID == 0 || !Sync)
Rot += 1;
redraw(dpy);
}
}
static XVisualInfo *
choose_visual(Display *dpy)
{
int attribs[] = { GLX_RGBA,
GLX_RED_SIZE, 1,
GLX_GREEN_SIZE, 1,
GLX_BLUE_SIZE, 1,
GLX_DOUBLEBUFFER,
GLX_DEPTH_SIZE, 1,
None };
int scrnum = DefaultScreen( dpy );
return glXChooseVisual(dpy, scrnum, attribs);
}
static void
parse_opts(int argc, char *argv[])
{
if (argc > 1) {
MyID = 1;
}
}
int
main( int argc, char *argv[] )
{
Display *dpy;
XVisualInfo *visinfo;
parse_opts(argc, argv);
dpy = XOpenDisplay(NULL);
visinfo = choose_visual(dpy);
Context = glXCreateContext( dpy, visinfo, NULL, True );
if (!Context) {
printf("Error: glXCreateContext failed\n");
exit(1);
}
if (MyID == 0) {
WindowID = make_gl_window(dpy, visinfo, Width, Height);
set_window_title(dpy, WindowID, "corender");
XMapWindow(dpy, WindowID);
/*printf("WindowID 0x%x\n", (int) WindowID);*/
}
/* do ipc hand-shake here */
setup_ipc();
assert(Sock);
assert(WindowID);
if (MyID == 1) {
set_event_mask(dpy, WindowID);
}
resize(dpy, Width, Height);
event_loop(dpy);
return 0;
}

377
progs/xdemos/glxsnoop.c Normal file
View File

@@ -0,0 +1,377 @@
/**
* Display/snoop the z/stencil/back/front buffers of another app's window.
* Also, an example of the need for shared ancillary renderbuffers.
*
* Hint: use 'xwininfo' to get a window's ID.
*
* Brian Paul
* 11 Oct 2007
*/
#define GL_GLEXT_PROTOTYPES
#include <GL/gl.h>
#include <GL/glx.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <X11/keysym.h>
#define Z_BUFFER 1
#define STENCIL_BUFFER 2
#define BACK_BUFFER 3
#define FRONT_BUFFER 4
static int Buffer = BACK_BUFFER;
static int WindowID = 0;
static const char *DisplayName = NULL;
static GLXContext Context = 0;
static int Width, Height;
/**
* Grab the z/stencil/back/front image from the srcWin and display it
* (possibly converted to grayscale) in the dstWin.
*/
static void
redraw(Display *dpy, Window srcWin, Window dstWin )
{
GLubyte *image = malloc(Width * Height * 4);
glXMakeCurrent(dpy, srcWin, Context);
glPixelStorei(GL_PACK_ALIGNMENT, 1);
if (Buffer == BACK_BUFFER) {
glReadBuffer(GL_BACK);
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image);
}
else if (Buffer == FRONT_BUFFER) {
glReadBuffer(GL_FRONT);
glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image);
}
else if (Buffer == Z_BUFFER) {
GLfloat *z = malloc(Width * Height * sizeof(GLfloat));
int i;
glReadPixels(0, 0, Width, Height, GL_DEPTH_COMPONENT, GL_FLOAT, z);
for (i = 0; i < Width * Height; i++) {
image[i*4+0] =
image[i*4+1] =
image[i*4+2] = (GLint) (255.0 * z[i]);
image[i*4+3] = 255;
}
free(z);
}
else if (Buffer == STENCIL_BUFFER) {
GLubyte *sten = malloc(Width * Height * sizeof(GLubyte));
int i, min = 100, max = -1;
float step;
int sz;
glGetIntegerv(GL_STENCIL_BITS, &sz);
glReadPixels(0, 0, Width, Height,
GL_STENCIL_INDEX, GL_UNSIGNED_BYTE, sten);
/* find min/max for converting stencil to grayscale */
for (i = 0; i < Width * Height; i++) {
if (sten[i] < min)
min = sten[i];
if (sten[i] > max)
max = sten[i];
}
if (min == max)
step = 0;
else
step = 255.0 / (float) (max - min);
for (i = 0; i < Width * Height; i++) {
image[i*4+0] =
image[i*4+1] =
image[i*4+2] = (GLint) ((sten[i] - min) * step);
image[i*4+3] = 255;
}
free(sten);
}
glXMakeCurrent(dpy, dstWin, Context);
glWindowPos2iARB(0, 0);
glDrawBuffer(GL_FRONT);
glDrawPixels(Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, image);
glFlush();
free(image);
}
static void
set_window_title(Display *dpy, Window win, const char *title)
{
XSizeHints sizehints;
sizehints.flags = 0;
XSetStandardProperties(dpy, win, title, title,
None, (char **)NULL, 0, &sizehints);
}
static Window
make_gl_window(Display *dpy, XVisualInfo *visinfo, int width, int height)
{
int scrnum;
XSetWindowAttributes attr;
unsigned long mask;
Window root;
Window win;
int x = 0, y = 0;
char *name = NULL;
scrnum = DefaultScreen( dpy );
root = RootWindow( dpy, scrnum );
/* window attributes */
attr.background_pixel = 0;
attr.border_pixel = 0;
attr.colormap = XCreateColormap( dpy, root, visinfo->visual, AllocNone);
attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
win = XCreateWindow( dpy, root, x, y, width, height,
0, visinfo->depth, InputOutput,
visinfo->visual, mask, &attr );
/* set hints and properties */
{
XSizeHints sizehints;
sizehints.x = x;
sizehints.y = y;
sizehints.width = width;
sizehints.height = height;
sizehints.flags = USSize | USPosition;
XSetNormalHints(dpy, win, &sizehints);
XSetStandardProperties(dpy, win, name, name,
None, (char **)NULL, 0, &sizehints);
}
return win;
}
static void
update_window_title(Display *dpy, Window win)
{
char title[1000], *buf;
switch (Buffer) {
case Z_BUFFER:
buf = "Z";
break;
case STENCIL_BUFFER:
buf = "Stencil";
break;
case BACK_BUFFER:
buf = "Back";
break;
case FRONT_BUFFER:
buf = "Front";
break;
default:
buf = "";
}
sprintf(title, "glxsnoop window 0x%x (%s buffer)", (int) WindowID, buf);
set_window_title(dpy, win, title);
}
static void
keypress(Display *dpy, Window win, char key)
{
switch (key) {
case 27:
/* escape */
exit(0);
break;
case 's':
Buffer = STENCIL_BUFFER;
break;
case 'z':
Buffer = Z_BUFFER;
break;
case 'f':
Buffer = FRONT_BUFFER;
break;
case 'b':
Buffer = BACK_BUFFER;
break;
default:
return;
}
update_window_title(dpy, win);
redraw(dpy, WindowID, win);
}
static void
event_loop(Display *dpy, Window win)
{
XEvent event;
while (1) {
XNextEvent( dpy, &event );
switch (event.type) {
case Expose:
redraw(dpy, WindowID, win);
break;
case ConfigureNotify:
/*resize( event.xconfigure.width, event.xconfigure.height );*/
break;
case KeyPress:
{
char buffer[10];
int r, code;
code = XLookupKeysym(&event.xkey, 0);
if (code == XK_Left) {
}
else {
r = XLookupString(&event.xkey, buffer, sizeof(buffer),
NULL, NULL);
keypress(dpy, win, buffer[0]);
}
}
default:
/* nothing */
;
}
}
}
static VisualID
get_window_visualid(Display *dpy, Window win)
{
XWindowAttributes attr;
if (XGetWindowAttributes(dpy, win, &attr)) {
return attr.visual->visualid;
}
else {
return 0;
}
}
static void
get_window_size(Display *dpy, Window win, int *w, int *h)
{
XWindowAttributes attr;
if (XGetWindowAttributes(dpy, win, &attr)) {
*w = attr.width;
*h = attr.height;
}
else {
*w = *h = 0;
}
}
static XVisualInfo *
visualid_to_visualinfo(Display *dpy, VisualID vid)
{
XVisualInfo *vinfo, templ;
long mask;
int n;
templ.visualid = vid;
mask = VisualIDMask;
vinfo = XGetVisualInfo(dpy, mask, &templ, &n);
return vinfo;
}
static void
key_usage(void)
{
printf("Keyboard:\n");
printf(" z - display Z buffer\n");
printf(" s - display stencil buffer\n");
printf(" f - display front color buffer\n");
printf(" b - display back buffer\n");
}
static void
usage(void)
{
printf("Usage: glxsnoop [-display dpy] windowID\n");
key_usage();
}
static void
parse_opts(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++) {
if (strcmp(argv[i], "-h") == 0) {
usage();
exit(0);
}
else if (strcmp(argv[i], "-display") == 0) {
DisplayName = argv[i + 1];
i++;
}
else {
if (argv[i][0] == '0' && argv[i][1] == 'x') {
/* hex */
WindowID = strtol(argv[i], NULL, 16);
}
else {
WindowID = atoi(argv[i]);
}
break;
}
}
if (!WindowID) {
usage();
exit(0);
}
}
int
main( int argc, char *argv[] )
{
Display *dpy;
VisualID vid;
XVisualInfo *visinfo;
Window win;
parse_opts(argc, argv);
key_usage();
dpy = XOpenDisplay(DisplayName);
/* find the VisualID for the named window */
vid = get_window_visualid(dpy, WindowID);
get_window_size(dpy, WindowID, &Width, &Height);
visinfo = visualid_to_visualinfo(dpy, vid);
Context = glXCreateContext( dpy, visinfo, NULL, True );
if (!Context) {
printf("Error: glXCreateContext failed\n");
exit(1);
}
win = make_gl_window(dpy, visinfo, Width, Height);
XMapWindow(dpy, win);
update_window_title(dpy, win);
event_loop( dpy, win );
return 0;
}

264
progs/xdemos/ipc.c Normal file
View File

@@ -0,0 +1,264 @@
/* Copyright (c) 2003 Tungsten Graphics, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files ("the
* Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions: The above copyright notice, the Tungsten
* Graphics splash screen, and this permission notice shall be included
* in all copies or substantial portions of the Software. THE SOFTWARE
* IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
* SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
* DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
* OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
* THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Simple IPC API
* Brian Paul
*/
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "ipc.h"
#if defined(IRIX) || defined(irix)
typedef int socklen_t;
#endif
#define NO_DELAY 1
#define DEFAULT_MASTER_PORT 7011
/*
* Return my hostname in <nameOut>.
* Return 1 for success, 0 for error.
*/
int
MyHostName(char *nameOut, int maxNameLength)
{
int k = gethostname(nameOut, maxNameLength);
return k==0;
}
/*
* Create a socket attached to a port. Later, we can call AcceptConnection
* on the socket returned from this function.
* Return the new socket number or -1 if error.
*/
int
CreatePort(int *port)
{
char hostname[1000];
struct sockaddr_in servaddr;
struct hostent *hp;
int so_reuseaddr = 1;
int tcp_nodelay = 1;
int sock, k;
/* create socket */
sock = socket(AF_INET, SOCK_STREAM, 0);
assert(sock > 2);
/* get my host name */
k = gethostname(hostname, 1000);
assert(k == 0);
/* get hostent info */
hp = gethostbyname(hostname);
assert(hp);
/* initialize the servaddr struct */
memset(&servaddr, 0, sizeof(servaddr) );
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons((unsigned short) (*port));
memcpy((char *) &servaddr.sin_addr, hp->h_addr,
sizeof(servaddr.sin_addr));
/* deallocate when we exit */
k = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR,
(char *) &so_reuseaddr, sizeof(so_reuseaddr));
assert(k==0);
/* send packets immediately */
#if NO_DELAY
k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
(char *) &tcp_nodelay, sizeof(tcp_nodelay));
assert(k==0);
#endif
if (*port == 0)
*port = DEFAULT_MASTER_PORT;
k = 1;
while (k && (*port < 65534)) {
/* bind our address to the socket */
servaddr.sin_port = htons((unsigned short) (*port));
k = bind(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (k)
*port = *port + 1;
}
#if 0
printf("###### Real Port: %d\n", *port);
#endif
/* listen for connections */
k = listen(sock, 100);
assert(k == 0);
return sock;
}
/*
* Accept a connection on the named socket.
* Return a new socket for the new connection, or -1 if error.
*/
int
AcceptConnection(int socket)
{
struct sockaddr addr;
socklen_t addrLen;
int newSock;
addrLen = sizeof(addr);
newSock = accept(socket, &addr, &addrLen);
if (newSock == 1)
return -1;
else
return newSock;
}
/*
* Contact the server running on the given host on the named port.
* Return socket number or -1 if error.
*/
int
Connect(const char *hostname, int port)
{
struct sockaddr_in servaddr;
struct hostent *hp;
int sock, k;
int tcp_nodelay = 1;
assert(port);
sock = socket(AF_INET, SOCK_STREAM, 0);
assert(sock >= 0);
hp = gethostbyname(hostname);
assert(hp);
memset(&servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons((unsigned short) port);
memcpy((char *) &servaddr.sin_addr, hp->h_addr, sizeof(servaddr.sin_addr));
k = connect(sock, (struct sockaddr *) &servaddr, sizeof(servaddr));
if (k != 0) {
perror("Connect:");
return -1;
}
#if NO_DELAY
/* send packets immediately */
k = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY,
(char *) &tcp_nodelay, sizeof(tcp_nodelay));
assert(k==0);
#endif
return sock;
}
void
CloseSocket(int socket)
{
close(socket);
}
int
SendData(int socket, const void *data, int bytes)
{
int sent = 0;
int b;
while (sent < bytes) {
b = write(socket, (char *) data + sent, bytes - sent);
if (b <= 0)
return -1; /* something broke */
sent += b;
}
return sent;
}
int
ReceiveData(int socket, void *data, int bytes)
{
int received = 0, b;
while (received < bytes) {
b = read(socket, (char *) data + received, bytes - received);
if (b <= 0)
return -1;
received += b;
}
return received;
}
int
SendString(int socket, const char *str)
{
const int len = strlen(str);
int sent, b;
/* first, send a 4-byte length indicator */
b = write(socket, &len, sizeof(len));
if (b <= 0)
return -1;
sent = SendData(socket, str, len);
assert(sent == len);
return sent;
}
int
ReceiveString(int socket, char *str, int maxLen)
{
int len, received, b;
/* first, read 4 bytes to see how long of string to receive */
b = read(socket, &len, sizeof(len));
if (b <= 0)
return -1;
assert(len <= maxLen); /* XXX fix someday */
assert(len >= 0);
received = ReceiveData(socket, str, len);
assert(received != -1);
assert(received == len);
str[len] = 0;
return received;
}

16
progs/xdemos/ipc.h Normal file
View File

@@ -0,0 +1,16 @@
#ifndef IPC_H
#define IPC_H
extern int MyHostName(char *nameOut, int maxNameLength);
extern int CreatePort(int *port);
extern int AcceptConnection(int socket);
extern int Connect(const char *hostname, int port);
extern void CloseSocket(int socket);
extern int SendData(int socket, const void *data, int bytes);
extern int ReceiveData(int socket, void *data, int bytes);
extern int SendString(int socket, const char *str);
extern int ReceiveString(int socket, char *str, int maxLen);
#endif /* IPC_H */

View File

@@ -34,8 +34,6 @@
#define I915_SET_FIELD( var, mask, value ) (var &= ~(mask), var |= value)
#define CMD_3D (0x3<<29)
#define PRIM3D_INLINE (CMD_3D | (0x1f<<24))
#define PRIM3D_TRILIST (0x0<<18)
#define PRIM3D_TRISTRIP (0x1<<18)

View File

@@ -28,7 +28,7 @@
#include "intel_batchbuffer.h"
#include "intel_ioctl.h"
#include "intel_decode.h"
#include "i915_debug.h"
#include "intel_reg.h"
/* Relocations in kernel space:
* - pass dma buffer seperately

View File

@@ -105,8 +105,7 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
}
else {
BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24) | (1 << 25);
CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB);
CMD = (XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB);
}
for (i = 0; i < nbox; i++, pbox++) {
@@ -184,8 +183,7 @@ intelEmitFillBlit(struct intel_context *intel,
break;
case 4:
BR13 = dst_pitch | (0xF0 << 16) | (1 << 24) | (1 << 25);
CMD = (XY_COLOR_BLT_CMD | XY_COLOR_BLT_WRITE_ALPHA |
XY_COLOR_BLT_WRITE_RGB);
CMD = (XY_COLOR_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB);
break;
default:
return;
@@ -273,8 +271,7 @@ intelEmitCopyBlit(struct intel_context *intel,
(((GLint) dst_pitch) & 0xffff) |
(translate_raster_op(logic_op) << 16) | (1 << 24) | (1 << 25);
CMD =
(XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB);
(XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB);
break;
default:
return;
@@ -443,15 +440,14 @@ intelClearWithBlit(GLcontext * ctx, GLbitfield mask)
if (buf == BUFFER_DEPTH || buf == BUFFER_STENCIL) {
CMD = XY_COLOR_BLT_CMD;
if (clearMask & BUFFER_BIT_DEPTH)
CMD |= XY_COLOR_BLT_WRITE_RGB;
CMD |= XY_BLT_WRITE_RGB;
if (clearMask & BUFFER_BIT_STENCIL)
CMD |= XY_COLOR_BLT_WRITE_ALPHA;
CMD |= XY_BLT_WRITE_ALPHA;
}
else {
/* clearing RGBA */
CMD = (XY_COLOR_BLT_CMD |
XY_COLOR_BLT_WRITE_ALPHA |
XY_COLOR_BLT_WRITE_RGB);
CMD = XY_COLOR_BLT_CMD |
XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
}
}
else {

View File

@@ -292,6 +292,8 @@ extern char *__progname;
#define SUBPIXEL_X 0.125
#define SUBPIXEL_Y 0.125
#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1))
#define INTEL_FIREVERTICES(intel) \
do { \
if ((intel)->prim.flush) \
@@ -460,9 +462,6 @@ extern void intelInitStateFuncs(struct dd_function_table *functions);
#define BLENDFACT_INV_CONST_ALPHA 0x0f
#define BLENDFACT_MASK 0x0f
#define MI_BATCH_BUFFER_END (0xA<<23)
extern int intel_translate_compare_func(GLenum func);
extern int intel_translate_stencil_op(GLenum op);
extern int intel_translate_blend_factor(GLenum factor);

View File

@@ -99,12 +99,29 @@ intel_miptree_create(struct intel_context *intel,
if (ok) {
if (!mt->compressed) {
/* XXX: Align pitch to multiple of 64 bytes for now to allow
* render-to-texture to work in all cases. This should probably be
* replaced at some point by some scheme to only do this when really
* necessary.
int align;
if (intel->intelScreen->ttm) {
/* XXX: Align pitch to multiple of 64 bytes for now to allow
* render-to-texture to work in all cases. This should probably be
* replaced at some point by some scheme to only do this when really
* necessary.
*/
align = 63;
} else {
align = 3;
}
mt->pitch = (mt->pitch * cpp + align) & ~align;
/* XXX: At least the i915 seems very upset when the pitch is a multiple
* of 1024 and sometimes 512 bytes - performance can drop by several
* times. Go to the next multiple of the required alignment for now.
*/
mt->pitch = ((mt->pitch * cpp + 63) & ~63) / cpp;
if (!(mt->pitch & 511))
mt->pitch += align + 1;
mt->pitch /= cpp;
}
mt->region = intel_region_alloc(intel->intelScreen,

View File

@@ -43,7 +43,8 @@ static void upload_clip_unit( struct brw_context *brw )
memset(&clip, 0, sizeof(clip));
/* CACHE_NEW_CLIP_PROG */
clip.thread0.grf_reg_count = ((brw->clip.prog_data->total_grf-1) & ~15) / 16;
clip.thread0.grf_reg_count =
ALIGN(brw->clip.prog_data->total_grf, 16) / 16 - 1;
clip.thread0.kernel_start_pointer = brw->clip.prog_gs_offset >> 6;
clip.thread3.urb_entry_read_length = brw->clip.prog_data->urb_read_length;
clip.thread3.const_urb_entry_read_length = brw->clip.prog_data->curb_read_length;

View File

@@ -304,7 +304,7 @@ static void upload_constant_buffer(struct brw_context *brw)
if (!brw_pool_alloc(pool,
bufsz,
6,
1 << 6,
&brw->curbe.gs_offset)) {
_mesa_printf("out of GS memory for curbe\n");
assert(0);

View File

@@ -290,7 +290,7 @@ static void get_space( struct brw_context *brw,
struct gl_buffer_object **vbo_return,
GLuint *offset_return )
{
size = (size + 63) & ~63;
size = ALIGN(size, 64);
if (brw->vb.upload.offset + size > BRW_UPLOAD_INIT_SIZE)
wrap_buffers(brw, size);
@@ -541,7 +541,8 @@ GLboolean brw_upload_vertices( struct brw_context *brw,
for (i = 0; i < nr_enabled; i++) {
OUT_BATCH( vbp.vb[i].vb0.dword );
OUT_BATCH( bmBufferOffset(&brw->intel, vbp.vb[i].buffer) + vbp.vb[i].offset);
OUT_RELOC( vbp.vb[i].buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
vbp.vb[i].offset);
OUT_BATCH( vbp.vb[i].max_index );
OUT_BATCH( vbp.vb[i].instance_data_step_rate );
}
@@ -632,8 +633,9 @@ void brw_upload_indices( struct brw_context *brw,
BEGIN_BATCH(4, 0);
OUT_BATCH( ib.header.dword );
OUT_BATCH( bmBufferOffset(intel, buffer) + offset );
OUT_BATCH( bmBufferOffset(intel, buffer) + offset + ib_size );
OUT_RELOC( buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, offset);
OUT_RELOC( buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
offset + ib_size);
OUT_BATCH( 0 );
ADVANCE_BATCH();
}

View File

@@ -46,7 +46,8 @@ static void upload_gs_unit( struct brw_context *brw )
/* CACHE_NEW_GS_PROG */
if (brw->gs.prog_active) {
gs.thread0.grf_reg_count = ((brw->gs.prog_data->total_grf-1) & ~15) / 16;
gs.thread0.grf_reg_count =
ALIGN(brw->gs.prog_data->total_grf, 16) / 16 - 1;
gs.thread0.kernel_start_pointer = brw->gs.prog_gs_offset >> 6;
gs.thread3.urb_entry_read_length = brw->gs.prog_data->urb_read_length;
}

View File

@@ -118,7 +118,7 @@ static void upload_sf_unit( struct brw_context *brw )
memset(&sf, 0, sizeof(sf));
/* CACHE_NEW_SF_PROG */
sf.thread0.grf_reg_count = ((brw->sf.prog_data->total_grf-1) & ~15) / 16;
sf.thread0.grf_reg_count = ALIGN(brw->sf.prog_data->total_grf, 16) / 16 - 1;
sf.thread0.kernel_start_pointer = brw->sf.prog_gs_offset >> 6;
sf.thread3.urb_entry_read_length = brw->sf.prog_data->urb_read_length;

View File

@@ -148,7 +148,7 @@ GLuint brw_upload_cache( struct brw_cache *cache,
GLuint hash = hash_key(key, key_size);
void *tmp = _mesa_malloc(key_size + cache->aux_size);
if (!brw_pool_alloc(cache->pool, data_size, 6, &offset)) {
if (!brw_pool_alloc(cache->pool, data_size, 1 << 6, &offset)) {
/* Should not be possible:
*/
_mesa_printf("brw_pool_alloc failed\n");

View File

@@ -41,10 +41,9 @@ GLboolean brw_pool_alloc( struct brw_mem_pool *pool,
GLuint align,
GLuint *offset_return)
{
GLuint align_mask = (1<<align)-1;
GLuint fixup = ((pool->offset + align_mask) & ~align_mask) - pool->offset;
GLuint fixup = ALIGN(pool->offset, align) - pool->offset;
size = (size + 3) & ~3;
size = ALIGN(size, 4);
if (pool->offset + fixup + size >= pool->size) {
_mesa_printf("%s failed\n", __FUNCTION__);

View File

@@ -37,8 +37,6 @@
#include "intel_tex_layout.h"
#include "macros.h"
#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1))
GLboolean brw_miptree_layout( struct intel_mipmap_tree *mt )
{
/* XXX: these vary depending on image format:
@@ -64,7 +62,7 @@ GLboolean brw_miptree_layout( struct intel_mipmap_tree *mt )
mt->pitch = ALIGN(width, align_w);
pack_y_pitch = (height + 3) / 4;
} else {
mt->pitch = ((mt->width0 * mt->cpp + 3) & ~3) / mt->cpp;
mt->pitch = ALIGN(mt->width0 * mt->cpp, 4) / mt->cpp;
pack_y_pitch = ALIGN(mt->height0, align_h);
}

View File

@@ -44,7 +44,7 @@ static void upload_vs_unit( struct brw_context *brw )
/* CACHE_NEW_VS_PROG */
vs.thread0.kernel_start_pointer = brw->vs.prog_gs_offset >> 6;
vs.thread0.grf_reg_count = ((brw->vs.prog_data->total_grf-1) & ~15) / 16;
vs.thread0.grf_reg_count = ALIGN(brw->vs.prog_data->total_grf, 16) / 16 - 1;
vs.thread3.urb_entry_read_length = brw->vs.prog_data->urb_read_length;
vs.thread3.const_urb_entry_read_length = brw->vs.prog_data->curb_read_length;
vs.thread3.dispatch_grf_start_reg = 1;

View File

@@ -62,7 +62,7 @@ static void upload_wm_unit(struct brw_context *brw )
memset(&wm, 0, sizeof(wm));
/* CACHE_NEW_WM_PROG */
wm.thread0.grf_reg_count = ((brw->wm.prog_data->total_grf-1) & ~15) / 16;
wm.thread0.grf_reg_count = ALIGN(brw->wm.prog_data->total_grf, 16) / 16 - 1;
wm.thread0.kernel_start_pointer = brw->wm.prog_gs_offset >> 6;
wm.thread3.dispatch_grf_start_reg = brw->wm.prog_data->first_curbe_grf;
wm.thread3.urb_entry_read_length = brw->wm.prog_data->urb_read_length;
@@ -71,7 +71,7 @@ static void upload_wm_unit(struct brw_context *brw )
wm.wm5.max_threads = max_threads;
if (brw->wm.prog_data->total_scratch) {
GLuint per_thread = (brw->wm.prog_data->total_scratch + 1023) / 1024;
GLuint per_thread = ALIGN(brw->wm.prog_data->total_scratch, 1024);
GLuint total = per_thread * (max_threads + 1);
/* Scratch space -- just have to make sure there is sufficient

View File

@@ -168,7 +168,7 @@ static GLboolean alloc_from_pool( struct intel_context *intel,
if (!block)
return GL_FALSE;
sz = (buf->size + align-1) & ~(align-1);
sz = ALIGN(buf->size, align);
block->mem = mmAllocMem(pool->heap,
sz,

View File

@@ -37,7 +37,7 @@ static void intel_batchbuffer_reset( struct intel_batchbuffer *batch )
assert(batch->map == NULL);
batch->offset = (unsigned long)batch->ptr;
batch->offset = (batch->offset + 63) & ~63;
batch->offset = ALIGN(batch->offset, 64);
batch->ptr = (unsigned char *) batch->offset;
if (BATCH_SZ - batch->offset < BATCH_REFILL) {
@@ -208,7 +208,7 @@ void intel_batchbuffer_align( struct intel_batchbuffer *batch,
GLuint sz )
{
unsigned long ptr = (unsigned long) batch->ptr;
unsigned long aptr = (ptr + align) & ~((unsigned long)align-1);
unsigned long aptr = ALIGN(ptr, align);
GLuint fixup = aptr - ptr;
if (intel_batchbuffer_space(batch) < fixup + sz)

View File

@@ -121,6 +121,12 @@ void intel_batchbuffer_align( struct intel_batchbuffer *batch,
#define BATCH_LOCALS
#define BEGIN_BATCH(n, flags) intel_batchbuffer_require_space(intel->batch, n*4, flags)
#define OUT_BATCH(d) intel_batchbuffer_emit_dword(intel->batch, d)
#define OUT_RELOC(buf, flags, delta) do { \
assert((delta) >= 0); \
OUT_BATCH(bmBufferOffset(intel, buf) + delta); \
} while (0)
#define ADVANCE_BATCH() do { } while(0)

View File

@@ -110,8 +110,7 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv,
}
else {
BR13 = (0xCC << 16) | (1<<24) | (1<<25);
CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB);
CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
}
if (src->tiled) {
@@ -145,10 +144,10 @@ void intelCopyBuffer( const __DRIdrawablePrivate *dPriv,
OUT_BATCH( dst_pitch | BR13 );
OUT_BATCH( (tmp.y1 << 16) | tmp.x1 );
OUT_BATCH( (tmp.y2 << 16) | tmp.x2 );
OUT_BATCH( bmBufferOffset(intel, dst->buffer) );
OUT_RELOC( dst->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, 0 );
OUT_BATCH( (tmp.y1 << 16) | tmp.x1 );
OUT_BATCH( src_pitch );
OUT_BATCH( bmBufferOffset(intel, src->buffer) );
OUT_RELOC( src->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ, 0 );
ADVANCE_BATCH();
}
}
@@ -199,8 +198,7 @@ void intelEmitFillBlit( struct intel_context *intel,
break;
case 4:
BR13 = (0xF0 << 16) | (1<<24) | (1<<25);
CMD = (XY_COLOR_BLT_CMD | XY_COLOR_BLT_WRITE_ALPHA |
XY_COLOR_BLT_WRITE_RGB);
CMD = XY_COLOR_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
break;
default:
return;
@@ -216,7 +214,7 @@ void intelEmitFillBlit( struct intel_context *intel,
OUT_BATCH( dst_pitch | BR13 );
OUT_BATCH( (y << 16) | x );
OUT_BATCH( ((y+h) << 16) | (x+w) );
OUT_BATCH( bmBufferOffset(intel, dst_buffer) + dst_offset );
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset );
OUT_BATCH( color );
ADVANCE_BATCH();
}
@@ -290,8 +288,7 @@ void intelEmitCopyBlit( struct intel_context *intel,
case 4:
BR13 = (translate_raster_op(logic_op) << 16) | (1<<24) |
(1<<25);
CMD = (XY_SRC_COPY_BLT_CMD | XY_SRC_COPY_BLT_WRITE_ALPHA |
XY_SRC_COPY_BLT_WRITE_RGB);
CMD = XY_SRC_COPY_BLT_CMD | XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
break;
default:
return;
@@ -328,10 +325,12 @@ void intelEmitCopyBlit( struct intel_context *intel,
OUT_BATCH( dst_pitch | BR13 );
OUT_BATCH( (dst_y << 16) | dst_x );
OUT_BATCH( (dst_y2 << 16) | dst_x2 );
OUT_BATCH( bmBufferOffset(intel, dst_buffer) + dst_offset );
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
dst_offset );
OUT_BATCH( (src_y << 16) | src_x );
OUT_BATCH( src_pitch );
OUT_BATCH( bmBufferOffset(intel, src_buffer) + src_offset );
OUT_RELOC( src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
src_offset );
ADVANCE_BATCH();
}
else {
@@ -340,10 +339,11 @@ void intelEmitCopyBlit( struct intel_context *intel,
OUT_BATCH( (dst_pitch & 0xffff) | BR13 );
OUT_BATCH( (0 << 16) | dst_x );
OUT_BATCH( (h << 16) | dst_x2 );
OUT_BATCH( bmBufferOffset(intel, dst_buffer) + dst_offset + dst_y * dst_pitch );
OUT_BATCH( (0 << 16) | src_x );
OUT_RELOC( dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
dst_offset + dst_y * dst_pitch );
OUT_BATCH( (src_pitch & 0xffff) );
OUT_BATCH( bmBufferOffset(intel, src_buffer) + src_offset + src_y * src_pitch );
OUT_RELOC( src_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
src_offset + src_y * src_pitch );
ADVANCE_BATCH();
}
}
@@ -388,12 +388,11 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
break;
case 4:
BR13 = (0xF0 << 16) | (1<<24) | (1<<25);
BACK_CMD = FRONT_CMD = (XY_COLOR_BLT_CMD |
XY_COLOR_BLT_WRITE_ALPHA |
XY_COLOR_BLT_WRITE_RGB);
BACK_CMD = FRONT_CMD = XY_COLOR_BLT_CMD |
XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
DEPTH_CMD = XY_COLOR_BLT_CMD;
if (flags & BUFFER_BIT_DEPTH) DEPTH_CMD |= XY_COLOR_BLT_WRITE_RGB;
if (flags & BUFFER_BIT_STENCIL) DEPTH_CMD |= XY_COLOR_BLT_WRITE_ALPHA;
if (flags & BUFFER_BIT_DEPTH) DEPTH_CMD |= XY_BLT_WRITE_RGB;
if (flags & BUFFER_BIT_STENCIL) DEPTH_CMD |= XY_BLT_WRITE_ALPHA;
break;
default:
return;
@@ -484,7 +483,8 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
OUT_BATCH( front_pitch | BR13 );
OUT_BATCH( (b.y1 << 16) | b.x1 );
OUT_BATCH( (b.y2 << 16) | b.x2 );
OUT_BATCH( bmBufferOffset(intel, front->buffer) );
OUT_RELOC( front->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
0 );
OUT_BATCH( clear_color );
ADVANCE_BATCH();
}
@@ -495,7 +495,8 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
OUT_BATCH( back_pitch | BR13 );
OUT_BATCH( (b.y1 << 16) | b.x1 );
OUT_BATCH( (b.y2 << 16) | b.x2 );
OUT_BATCH( bmBufferOffset(intel, back->buffer) );
OUT_RELOC( back->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
0 );
OUT_BATCH( clear_color );
ADVANCE_BATCH();
}
@@ -506,7 +507,8 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
OUT_BATCH( depth_pitch | BR13 );
OUT_BATCH( (b.y1 << 16) | b.x1 );
OUT_BATCH( (b.y2 << 16) | b.x2 );
OUT_BATCH( bmBufferOffset(intel, depth->buffer) );
OUT_RELOC( depth->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
0 );
OUT_BATCH( clear_depth );
ADVANCE_BATCH();
}
@@ -517,11 +519,6 @@ void intelClearWithBlit(GLcontext *ctx, GLbitfield flags)
}
#define BR13_565 0x1
#define BR13_8888 0x3
void
intelEmitImmediateColorExpandBlit(struct intel_context *intel,
GLuint cpp,
@@ -535,9 +532,9 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel,
GLshort w, GLshort h,
GLenum logic_op)
{
struct xy_setup_blit setup;
struct xy_text_immediate_blit text;
int dwords = ((src_size + 7) & ~7) / 4;
int dwords = ALIGN(src_size, 8) / 4;
uint32_t opcode, br13;
assert( logic_op - GL_CLEAR >= 0 );
assert( logic_op - GL_CLEAR < 0x10 );
@@ -554,31 +551,6 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel,
__FUNCTION__,
dst_buffer, dst_pitch, dst_offset, x, y, w, h, src_size, dwords);
memset(&setup, 0, sizeof(setup));
setup.br0.client = CLIENT_2D;
setup.br0.opcode = OPCODE_XY_SETUP_BLT;
setup.br0.write_alpha = (cpp == 4);
setup.br0.write_rgb = (cpp == 4);
setup.br0.dst_tiled = dst_tiled;
setup.br0.length = (sizeof(setup) / sizeof(int)) - 2;
setup.br13.dest_pitch = dst_pitch;
setup.br13.rop = translate_raster_op(logic_op);
setup.br13.color_depth = (cpp == 4) ? BR13_8888 : BR13_565;
setup.br13.clipping_enable = 0;
setup.br13.mono_source_transparency = 1;
setup.dw2.clip_y1 = 0;
setup.dw2.clip_x1 = 0;
setup.dw3.clip_y2 = 100;
setup.dw3.clip_x2 = 100;
setup.dest_base_addr = bmBufferOffset(intel, dst_buffer) + dst_offset;
setup.background_color = 0;
setup.foreground_color = fg_color;
setup.pattern_base_addr = 0;
memset(&text, 0, sizeof(text));
text.dw0.client = CLIENT_2D;
text.dw0.opcode = OPCODE_XY_TEXT_IMMEDIATE_BLT;
@@ -594,15 +566,33 @@ intelEmitImmediateColorExpandBlit(struct intel_context *intel,
text.dw2.dest_x2 = x + w;
intel_batchbuffer_require_space( intel->batch,
sizeof(setup) +
(8 * 4) +
sizeof(text) +
dwords,
INTEL_BATCH_NO_CLIPRECTS );
intel_batchbuffer_data( intel->batch,
&setup,
sizeof(setup),
INTEL_BATCH_NO_CLIPRECTS );
opcode = XY_SETUP_BLT_CMD;
if (cpp == 4)
opcode |= XY_BLT_WRITE_ALPHA | XY_BLT_WRITE_RGB;
if (dst_tiled)
opcode |= XY_DST_TILED;
br13 = dst_pitch | (translate_raster_op(logic_op) << 16) | (1 << 29);
if (cpp == 2)
br13 |= BR13_565;
else
br13 |= BR13_8888;
BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
OUT_BATCH(opcode);
OUT_BATCH(br13);
OUT_BATCH((0 << 16) | 0); /* clip x1, y1 */
OUT_BATCH((100 << 16) | 100); /* clip x2, y2 */
OUT_RELOC(dst_buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE, dst_offset);
OUT_BATCH(0); /* bg */
OUT_BATCH(fg_color); /* fg */
OUT_BATCH(0); /* pattern base addr */
ADVANCE_BATCH();
intel_batchbuffer_data( intel->batch,
&text,

View File

@@ -498,7 +498,7 @@ GLboolean intelInitContext( struct intel_context *intel,
_mesa_enable_extension( ctx, "GL_EXT_texture_compression_s3tc" );
_mesa_enable_extension( ctx, "GL_S3_s3tc" );
}
else if (driQueryOptionb (&intelScreen->optionCache, "force_s3tc_enable")) {
else if (driQueryOptionb (&intel->optionCache, "force_s3tc_enable")) {
_mesa_enable_extension( ctx, "GL_EXT_texture_compression_s3tc" );
}

View File

@@ -252,6 +252,8 @@ void UNLOCK_HARDWARE( struct intel_context *intel );
#define SUBPIXEL_X 0.125
#define SUBPIXEL_Y 0.125
#define ALIGN(value, alignment) ((value + alignment - 1) & ~(alignment - 1))
/* ================================================================
* Color packing:
*/

View File

@@ -233,8 +233,8 @@ GLboolean intel_miptree_image_data(struct intel_context *intel,
if (dst->compressed) {
alignment = intel_compressed_alignment(dst->internal_format);
src_row_pitch = ((src_row_pitch + alignment - 1) & ~(alignment - 1));
width = ((width + alignment - 1) & ~(alignment - 1));
src_row_pitch = ALIGN(src_row_pitch, alignment);
width = ALIGN(width, alignment);
height = (height + 3) / 4;
}

View File

@@ -91,11 +91,6 @@ static void set_bit( GLubyte *dest,
dest[bit/8] |= 1 << (bit % 8);
}
static int align(int x, int align)
{
return (x + align - 1) & ~(align - 1);
}
/* Extract a rectangle's worth of data from the bitmap. Called
* per-cliprect.
*/
@@ -147,7 +142,7 @@ static GLuint get_bitmap_rect(GLsizei width, GLsizei height,
}
if (row_align)
bit = (bit + row_align - 1) & ~(row_align - 1);
bit = ALIGN(bit, row_align);
}
return count;
@@ -268,7 +263,7 @@ do_blit_bitmap( GLcontext *ctx,
for (px = 0; px < box_w; px += DX) {
int h = MIN2(DY, box_h - py);
int w = MIN2(DX, box_w - px);
GLuint sz = align(align(w,8) * h, 64)/8;
GLuint sz = ALIGN(ALIGN(w,8) * h, 64)/8;
GLenum logic_op = ctx->Color.ColorLogicOpEnabled ?
ctx->Color.LogicOp : GL_COPY;

View File

@@ -1,91 +0,0 @@
/**************************************************************************
*
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
* 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"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sub license, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice (including the
* next paragraph) shall be included in all copies or substantial portions
* of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
**************************************************************************/
#ifndef _INTEL_REG_H_
#define _INTEL_REG_H_
#define CMD_3D (0x3<<29)
#define _3DPRIMITIVE ((0x3<<29)|(0x1f<<24))
#define PRIM_INDIRECT (1<<23)
#define PRIM_INLINE (0<<23)
#define PRIM_INDIRECT_SEQUENTIAL (0<<17)
#define PRIM_INDIRECT_ELTS (1<<17)
#define PRIM3D_TRILIST (0x0<<18)
#define PRIM3D_TRISTRIP (0x1<<18)
#define PRIM3D_TRISTRIP_RVRSE (0x2<<18)
#define PRIM3D_TRIFAN (0x3<<18)
#define PRIM3D_POLY (0x4<<18)
#define PRIM3D_LINELIST (0x5<<18)
#define PRIM3D_LINESTRIP (0x6<<18)
#define PRIM3D_RECTLIST (0x7<<18)
#define PRIM3D_POINTLIST (0x8<<18)
#define PRIM3D_DIB (0x9<<18)
#define PRIM3D_MASK (0x1f<<18)
#define I915PACKCOLOR4444(r,g,b,a) \
((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
#define I915PACKCOLOR1555(r,g,b,a) \
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
((a) ? 0x8000 : 0))
#define I915PACKCOLOR565(r,g,b) \
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
#define I915PACKCOLOR8888(r,g,b,a) \
((a<<24) | (r<<16) | (g<<8) | b)
#define BR00_BITBLT_CLIENT 0x40000000
#define BR00_OP_COLOR_BLT 0x10000000
#define BR00_OP_SRC_COPY_BLT 0x10C00000
#define BR13_SOLID_PATTERN 0x80000000
#define XY_COLOR_BLT_CMD ((2<<29)|(0x50<<22)|0x4)
#define XY_COLOR_BLT_WRITE_ALPHA (1<<21)
#define XY_COLOR_BLT_WRITE_RGB (1<<20)
#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21)
#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20)
#define XY_SRC_TILED (1<<15)
#define XY_DST_TILED (1<<11)
#define FENCE_LINEAR 0
#define FENCE_XMAJOR 1
#define FENCE_YMAJOR 2
#endif

View File

@@ -25,16 +25,19 @@
*
**************************************************************************/
#define CMD_MI (0x0 << 29)
#define CMD_2D (0x2 << 29)
#define CMD_3D (0x3 << 29)
#ifndef _INTEL_REG_H_
#define _INTEL_REG_H_
#define MI_BATCH_BUFFER_END (CMD_MI | 0xA << 23)
/* Stalls command execution waiting for the given events to have occurred. */
#define MI_WAIT_FOR_EVENT (CMD_MI | (0x3 << 23))
#define MI_WAIT_FOR_PLANE_B_FLIP (1<<6)
#define MI_WAIT_FOR_PLANE_A_FLIP (1<<2)
#define CMD_3D (0x3<<29)
#define _3DPRIMITIVE ((0x3<<29)|(0x1f<<24))
/* Primitive dispatch on 830-945 */
#define _3DPRIMITIVE (CMD_3D | (0x1f << 24))
#define PRIM_INDIRECT (1<<23)
#define PRIM_INLINE (0<<23)
#define PRIM_INDIRECT_SEQUENTIAL (0<<17)
@@ -52,37 +55,22 @@
#define PRIM3D_DIB (0x9<<18)
#define PRIM3D_MASK (0x1f<<18)
#define I915PACKCOLOR4444(r,g,b,a) \
((((a) & 0xf0) << 8) | (((r) & 0xf0) << 4) | ((g) & 0xf0) | ((b) >> 4))
#define XY_SETUP_BLT_CMD (CMD_2D | (0x011 << 22) | 6)
#define I915PACKCOLOR1555(r,g,b,a) \
((((r) & 0xf8) << 7) | (((g) & 0xf8) << 2) | (((b) & 0xf8) >> 3) | \
((a) ? 0x8000 : 0))
#define XY_COLOR_BLT_CMD (CMD_2D | (0x50 << 22) | 4)
#define I915PACKCOLOR565(r,g,b) \
((((r) & 0xf8) << 8) | (((g) & 0xfc) << 3) | (((b) & 0xf8) >> 3))
#define XY_SRC_COPY_BLT_CMD (CMD_2D | (0x53 << 22) | 6)
#define I915PACKCOLOR8888(r,g,b,a) \
((a<<24) | (r<<16) | (g<<8) | b)
/* BR00 */
#define XY_BLT_WRITE_ALPHA (1 << 21)
#define XY_BLT_WRITE_RGB (1 << 20)
#define XY_SRC_TILED (1 << 15)
#define XY_DST_TILED (1 << 11)
/* BR13 */
#define BR13_565 (0x1 << 24)
#define BR13_8888 (0x3 << 24)
#define BR00_BITBLT_CLIENT 0x40000000
#define BR00_OP_COLOR_BLT 0x10000000
#define BR00_OP_SRC_COPY_BLT 0x10C00000
#define BR13_SOLID_PATTERN 0x80000000
#define XY_COLOR_BLT_CMD ((2<<29)|(0x50<<22)|0x4)
#define XY_COLOR_BLT_WRITE_ALPHA (1<<21)
#define XY_COLOR_BLT_WRITE_RGB (1<<20)
#define XY_SRC_COPY_BLT_CMD ((2<<29)|(0x53<<22)|6)
#define XY_SRC_COPY_BLT_WRITE_ALPHA (1<<21)
#define XY_SRC_COPY_BLT_WRITE_RGB (1<<20)
#define MI_WAIT_FOR_EVENT ((0x3<<23))
#define MI_WAIT_FOR_PLANE_B_FLIP (1<<6)
#define MI_WAIT_FOR_PLANE_A_FLIP (1<<2)
#endif
#define FENCE_LINEAR 0
#define FENCE_XMAJOR 1
#define FENCE_YMAJOR 2

View File

@@ -32,14 +32,9 @@
#include "intel_mipmap_tree.h"
#include "intel_tex_layout.h"
#include "intel_context.h"
#include "macros.h"
static int align(int value, int alignment)
{
return (value + alignment - 1) & ~(alignment - 1);
}
GLuint intel_compressed_alignment(GLenum internalFormat)
{
GLuint alignment = 4;
@@ -70,7 +65,7 @@ void i945_miptree_layout_2d( struct intel_mipmap_tree *mt )
if (mt->compressed) {
align_w = intel_compressed_alignment(mt->internal_format);
mt->pitch = align(mt->width0, align_w);
mt->pitch = ALIGN(mt->width0, align_w);
}
/* May need to adjust pitch to accomodate the placement of
@@ -82,10 +77,10 @@ void i945_miptree_layout_2d( struct intel_mipmap_tree *mt )
GLuint mip1_width;
if (mt->compressed) {
mip1_width = align(minify(mt->width0), align_w)
+ align(minify(minify(mt->width0)), align_w);
mip1_width = ALIGN(minify(mt->width0), align_w)
+ ALIGN(minify(minify(mt->width0)), align_w);
} else {
mip1_width = align(minify(mt->width0), align_w)
mip1_width = ALIGN(minify(mt->width0), align_w)
+ minify(minify(mt->width0));
}
@@ -97,7 +92,7 @@ void i945_miptree_layout_2d( struct intel_mipmap_tree *mt )
/* Pitch must be a whole number of dwords, even though we
* express it in texels.
*/
mt->pitch = align(mt->pitch * mt->cpp, 4) / mt->cpp;
mt->pitch = ALIGN(mt->pitch * mt->cpp, 4) / mt->cpp;
mt->total_height = 0;
for ( level = mt->first_level ; level <= mt->last_level ; level++ ) {
@@ -109,7 +104,7 @@ void i945_miptree_layout_2d( struct intel_mipmap_tree *mt )
if (mt->compressed)
img_height = MAX2(1, height/4);
else
img_height = align(height, align_h);
img_height = ALIGN(height, align_h);
/* Because the images are packed better, the final offset
@@ -120,7 +115,7 @@ void i945_miptree_layout_2d( struct intel_mipmap_tree *mt )
/* Layout_below: step right after second mipmap.
*/
if (level == mt->first_level + 1) {
x += align(width, align_w);
x += ALIGN(width, align_w);
}
else {
y += img_height;

View File

@@ -72,10 +72,10 @@ static nouveau_card nouveau_card_list[]={
{0x014D, "Quadro FX 550", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
{0x014E, "Quadro FX 540", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
{0x014F, "GeForce 6200", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
{0x0150, "GeForce2 GTS/Pro", NV11_TCL_PRIMITIVE_3D, NV_15, 0},
{0x0151, "GeForce2 Ti", NV11_TCL_PRIMITIVE_3D, NV_15, 0},
{0x0152, "GeForce2 Ultra, Bladerunner", NV11_TCL_PRIMITIVE_3D, NV_15, 0},
{0x0153, "Quadro2 Pro", NV11_TCL_PRIMITIVE_3D, NV_15, 0},
{0x0150, "GeForce2 GTS/Pro", NV11_TCL_PRIMITIVE_3D, NV_11, 0},
{0x0151, "GeForce2 Ti", NV11_TCL_PRIMITIVE_3D, NV_11, 0},
{0x0152, "GeForce2 Ultra, Bladerunner", NV11_TCL_PRIMITIVE_3D, NV_11, 0},
{0x0153, "Quadro2 Pro", NV11_TCL_PRIMITIVE_3D, NV_11, 0},
{0x0161, "GeForce 6200 TurboCache(TM)", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
{0x0162, "GeForce 6200 SE TurboCache (TM)", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
{0x0163, "GeForce 6200 LE", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
@@ -132,20 +132,20 @@ static nouveau_card nouveau_card_list[]={
{0x0240, "GeForce 6150", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
{0x0242, "GeForce 6100", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
{0x0244, "Geforce 6150 Go", NV30_TCL_PRIMITIVE_3D|0x4400, NV_44, 0},
{0x0250, "GeForce4 Ti 4600", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0251, "GeForce4 Ti 4400", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0252, "GeForce4 Ti", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0253, "GeForce4 Ti 4200", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0258, "Quadro4 900 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0259, "Quadro4 750 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x025B, "Quadro4 700 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0280, "GeForce4 Ti 4800", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0281, "GeForce4 Ti 4200 AGP 8x", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0282, "GeForce4 Ti 4800 SE", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0286, "GeForce4 Ti 4200 Go AGP 8x", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0288, "Quadro4 980 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0289, "Quadro4 780 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x028C, "Quadro4 700 GoGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_25, 0},
{0x0250, "GeForce4 Ti 4600", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0251, "GeForce4 Ti 4400", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0252, "GeForce4 Ti", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0253, "GeForce4 Ti 4200", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0258, "Quadro4 900 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0259, "Quadro4 750 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x025B, "Quadro4 700 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0280, "GeForce4 Ti 4800", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0281, "GeForce4 Ti 4200 AGP 8x", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0282, "GeForce4 Ti 4800 SE", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0286, "GeForce4 Ti 4200 Go AGP 8x", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0288, "Quadro4 980 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0289, "Quadro4 780 XGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x028C, "Quadro4 700 GoGL", NV20_TCL_PRIMITIVE_3D|0x0500, NV_20, 0},
{0x0290, "GeForce 7900 GTX", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
{0x0291, "GeForce 7900 GT", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
{0x0292, "GeForce 7900 GS", NV30_TCL_PRIMITIVE_3D|0x4000, NV_40, 0},
@@ -176,21 +176,21 @@ static nouveau_card nouveau_card_list[]={
{0x031D, "NV31GLM", NV30_TCL_PRIMITIVE_3D|0x0300, NV_30, 0},
{0x031E, "NV31GLM Pro", NV30_TCL_PRIMITIVE_3D|0x0300, NV_30, 0},
{0x031F, "NV31GLM Pro", NV30_TCL_PRIMITIVE_3D|0x0300, NV_30, 0},
{0x0320, "GeForce FX 5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0321, "GeForce FX 5200 Ultra", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0322, "GeForce FX 5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0323, "GeForce FX 5200LE", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0324, "GeForce FX Go5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0325, "GeForce FX Go5250", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0326, "GeForce FX 5500", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0327, "GeForce FX 5100", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0328, "GeForce FX Go5200 32M/64M", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0329, "GeForce FX Go5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x032A, "Quadro NVS 280 PCI", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x032B, "Quadro FX 500/600 PCI", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x032C, "GeForce FX Go 5300", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x032D, "GeForce FX Go5100", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x032F, "NV34GL", NV30_TCL_PRIMITIVE_3D|0x0600, NV_34, 0},
{0x0320, "GeForce FX 5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0321, "GeForce FX 5200 Ultra", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0322, "GeForce FX 5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0323, "GeForce FX 5200LE", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0324, "GeForce FX Go5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0325, "GeForce FX Go5250", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0326, "GeForce FX 5500", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0327, "GeForce FX 5100", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0328, "GeForce FX Go5200 32M/64M", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0329, "GeForce FX Go5200", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x032A, "Quadro NVS 280 PCI", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x032B, "Quadro FX 500/600 PCI", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x032C, "GeForce FX Go 5300", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x032D, "GeForce FX Go5100", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x032F, "NV34GL", NV30_TCL_PRIMITIVE_3D|0x0600, NV_30, 0},
{0x0330, "GeForce FX 5900 Ultra", NV30_TCL_PRIMITIVE_3D|0x0400, NV_30, 0},
{0x0331, "GeForce FX 5900", NV30_TCL_PRIMITIVE_3D|0x0400, NV_30, 0},
{0x0332, "GeForce FX 5900XT", NV30_TCL_PRIMITIVE_3D|0x0400, NV_30, 0},

View File

@@ -378,3 +378,39 @@ void nouveauCopySubBuffer(__DRIdrawablePrivate *dPriv,
{
}
void nouveauClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer,
int fill, int mask)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
int dimensions;
if (!buffer) {
return;
}
/* FIXME: only support 32 bits atm */
/* Surface that we will work on */
nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_FORMAT, 4);
OUT_RING(0x0b); /* Y32 color format */
OUT_RING((buffer->pitch<<16)|buffer->pitch);
OUT_RING(buffer->offset);
OUT_RING(buffer->offset);
/* Now clear a rectangle */
dimensions = ((buffer->mesa.Height)<<16) | (buffer->mesa.Width);
nouveauObjectOnSubchannel(nmesa, NvSubGdiRectText, NvGdiRectText);
BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
OUT_RING(3); /* SRCCOPY */
BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_BLOCK_LEVEL1_TL, 5);
OUT_RING(0); /* top left */
OUT_RING(dimensions); /* bottom right */
OUT_RING(fill);
OUT_RING(0); /* top left */
OUT_RING(dimensions); /* bottom right */
}

View File

@@ -133,9 +133,6 @@ typedef struct nouveau_context {
nouveau_renderbuffer_t *color_buffer;
nouveau_renderbuffer_t *depth_buffer;
/* Color buffer clear value */
uint32_t clear_color_value;
/* Depth/stencil clear value */
uint32_t clear_value;
@@ -234,6 +231,9 @@ extern void nouveauSwapBuffers(__DRIdrawablePrivate *dPriv);
extern void nouveauCopySubBuffer(__DRIdrawablePrivate *dPriv,
int x, int y, int w, int h);
extern void nouveauClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer,
int fill, int mask);
/* Debugging utils: */
extern int NOUVEAU_DEBUG;

View File

@@ -35,6 +35,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "framebuffer.h"
#include "utils.h"
#include "colormac.h"
/* Wrapper for DRM_NOUVEAU_GETPARAM ioctl */
GLboolean nouveauDRMGetParam(nouveauContextPtr nmesa,
@@ -135,7 +136,74 @@ static void nouveauFinish( GLcontext *ctx )
/* glClear */
static void nouveauClear( GLcontext *ctx, GLbitfield mask )
{
// XXX we really should do something here...
uint32_t clear_value;
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
/* FIXME: should we clear front buffer, even if asked to do it? */
if (mask & (BUFFER_BIT_FRONT_LEFT|BUFFER_BIT_BACK_LEFT)) {
GLubyte c[4];
int color_bits = 32;
int color_mask = 0xffffffff;
UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,ctx->Color.ClearColor);
clear_value = PACK_COLOR_8888(c[3],c[0],c[1],c[2]);
if (ctx->DrawBuffer) {
/* FIXME: find correct color buffer, instead of [0][0] */
if (ctx->DrawBuffer->_ColorDrawBuffers[0][0]) {
color_bits = ctx->DrawBuffer->_ColorDrawBuffers[0][0]->RedBits;
color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->GreenBits;
color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->BlueBits;
color_bits += ctx->DrawBuffer->_ColorDrawBuffers[0][0]->AlphaBits;
}
}
if (color_bits<24) {
clear_value = PACK_COLOR_565(c[0],c[1],c[2]);
color_mask = 0xffff;
}
nouveauClearBuffer(ctx, nmesa->color_buffer,
clear_value, color_mask);
}
if (mask & (BUFFER_BIT_DEPTH)) {
int depth_bits = 24;
int depth_mask;
if (ctx->DrawBuffer) {
if (ctx->DrawBuffer->_DepthBuffer) {
depth_bits = ctx->DrawBuffer->_DepthBuffer->DepthBits;
}
}
switch(depth_bits) {
case 16:
clear_value = (uint32_t) (ctx->Depth.Clear * 32767.0);
depth_mask = 0xffff;
break;
default:
clear_value = ((uint32_t) (ctx->Depth.Clear * 16777215.0)) << 8;
depth_mask = 0xffffff00;
break;
}
nouveauClearBuffer(ctx, nmesa->depth_buffer,
clear_value, depth_mask);
}
if (mask & (BUFFER_BIT_STENCIL)) {
int stencil_bits = 0;
if (ctx->DrawBuffer) {
if (ctx->DrawBuffer->_StencilBuffer) {
stencil_bits = ctx->DrawBuffer->_StencilBuffer->StencilBits;
}
}
if (stencil_bits>0) {
nouveauClearBuffer(ctx, nmesa->depth_buffer,
ctx->Stencil.Clear, (1<<stencil_bits)-1);
}
}
}
void nouveauDriverInitFunctions( struct dd_function_table *functions )

View File

@@ -110,91 +110,19 @@ static void nv10BlendFuncSeparate(GLcontext *ctx, GLenum sfactorRGB, GLenum dfac
OUT_RING_CACHE(dfactorRGB);
}
static void nv10ClearBuffer(GLcontext *ctx, nouveau_renderbuffer_t *buffer, int fill, int mask)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
int dimensions;
if (!buffer) {
return;
}
/* Surface that we will work on */
nouveauObjectOnSubchannel(nmesa, NvSubCtxSurf2D, NvCtxSurf2D);
BEGIN_RING_SIZE(NvSubCtxSurf2D, NV10_CONTEXT_SURFACES_2D_FORMAT, 4);
OUT_RING(0x0b); /* Y32 color format */
OUT_RING((buffer->pitch<<16)|buffer->pitch);
OUT_RING(buffer->offset);
OUT_RING(buffer->offset);
/* Now clear a rectangle */
dimensions = ((buffer->mesa.Height)<<16) | (buffer->mesa.Width);
nouveauObjectOnSubchannel(nmesa, NvSubGdiRectText, NvGdiRectText);
BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_OPERATION, 1);
OUT_RING(3); /* SRCCOPY */
BEGIN_RING_SIZE(NvSubGdiRectText, NV04_GDI_RECTANGLE_TEXT_BLOCK_LEVEL1_TL, 5);
OUT_RING(0); /* top left */
OUT_RING(dimensions); /* bottom right */
OUT_RING(fill);
OUT_RING(0); /* top left */
OUT_RING(dimensions); /* bottom right */
}
static void nv10Clear(GLcontext *ctx, GLbitfield mask)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
if (mask & (BUFFER_BIT_FRONT_LEFT|BUFFER_BIT_BACK_LEFT)) {
nv10ClearBuffer(ctx, nmesa->color_buffer,
nmesa->clear_color_value, 0xffffffff);
}
/* FIXME: check depth bits */
if (mask & (BUFFER_BIT_DEPTH)) {
nv10ClearBuffer(ctx, nmesa->depth_buffer,
nmesa->clear_value, 0xffffff00);
}
/* FIXME: check about stencil? */
if (mask & (BUFFER_BIT_STENCIL)) {
nv10ClearBuffer(ctx, nmesa->depth_buffer,
nmesa->clear_value, 0x000000ff);
}
}
static void nv10ClearColor(GLcontext *ctx, const GLfloat color[4])
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
GLubyte c[4];
UNCLAMPED_FLOAT_TO_RGBA_CHAN(c,color);
nmesa->clear_color_value = PACK_COLOR_8888(c[3],c[0],c[1],c[2]);
/* Not for NV10 */
}
static void nv10ClearDepth(GLcontext *ctx, GLclampd d)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
/* switch (ctx->DrawBuffer->_DepthBuffer->DepthBits) {
case 16:
nmesa->clear_value = (uint32_t)(d*0x7FFF);
break;
case 24:*/
nmesa->clear_value = ((nmesa->clear_value&0x000000FF) |
(((uint32_t)(d*0xFFFFFF))<<8));
/* break;
}*/
/* Not for NV10 */
}
static void nv10ClearStencil(GLcontext *ctx, GLint s)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
/* if (ctx->DrawBuffer->_DepthBuffer->DepthBits == 24) {*/
nmesa->clear_value = ((nmesa->clear_value&0xFFFFFF00)|
(s&0x000000FF));
/* }*/
/* Not for NV10 */
}
static void nv10ClipPlane(GLcontext *ctx, GLenum plane, const GLfloat *equation)
@@ -1037,10 +965,10 @@ void nv10InitStateFuncs(GLcontext *ctx, struct dd_function_table *func)
func->BlendColor = nv10BlendColor;
func->BlendEquationSeparate = nv10BlendEquationSeparate;
func->BlendFuncSeparate = nv10BlendFuncSeparate;
func->Clear = nv10Clear;
func->ClearColor = nv10ClearColor;
func->ClearDepth = nv10ClearDepth;
func->ClearStencil = nv10ClearStencil;
/* func->Clear = nv10Clear;*/ /* Not for NV10 */
func->ClearColor = nv10ClearColor; /* Not for NV10 */
func->ClearDepth = nv10ClearDepth; /* Not for NV10 */
func->ClearStencil = nv10ClearStencil; /* Not for NV10 */
func->ClipPlane = nv10ClipPlane;
func->ColorMask = nv10ColorMask;
func->ColorMaterial = nv10ColorMaterial;

View File

@@ -951,6 +951,10 @@ static void emit_tex(struct r300_fragment_program *fp,
if (REG_GET_TYPE(dest) == REG_TYPE_OUTPUT) {
rdest = dest;
dest = get_temp_reg_tex(fp);
} else if (fpi->DstReg.WriteMask != WRITEMASK_XYZW) {
/* in case write mask isn't XYZW */
rdest = dest;
dest = get_temp_reg_tex(fp);
}
hwdest =
t_hw_dst(fp, dest, GL_TRUE,
@@ -1016,7 +1020,7 @@ static void emit_tex(struct r300_fragment_program *fp,
/* Copy from temp to output if needed */
if (REG_GET_VALID(rdest)) {
emit_arith(fp, PFS_OP_MAD, rdest, WRITEMASK_XYZW, dest,
emit_arith(fp, PFS_OP_MAD, rdest, fpi->DstReg.WriteMask, dest,
pfs_one, pfs_zero, 0);
free_temp(fp, dest);
}

View File

@@ -818,7 +818,7 @@ _mesa_load_state_parameters(GLcontext *ctx,
for (i = 0; i < paramList->NumParameters; i++) {
if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
_mesa_fetch_state(ctx,
(gl_state_index *) paramList->Parameters[i].StateIndexes,
paramList->Parameters[i].StateIndexes,
paramList->ParameterValues[i]);
}
}

View File

@@ -864,7 +864,7 @@ emit_kill(slang_emit_info *emitInfo)
* Note that ARB-KILL depends on sign of vector operand.
*/
inst = new_instruction(emitInfo, OPCODE_KIL_NV);
inst->DstReg.CondMask = COND_TR; /* always branch */
inst->DstReg.CondMask = COND_TR; /* always kill */
return inst;
}

View File

@@ -41,7 +41,6 @@
struct fog_stage_data {
GLvector4f fogcoord; /* has actual storage allocated */
GLvector4f input; /* points into VB->EyePtr Z values */
};
#define FOG_STAGE_DATA(stage) ((struct fog_stage_data *)stage->privatePtr)
@@ -91,7 +90,8 @@ init_static_data( void )
* evaluating the GL_LINEAR, GL_EXP or GL_EXP2 fog function.
* Fog coordinates are distances from the eye (typically between the
* near and far clip plane distances).
* Note the fog (eye Z) coords may be negative so we use ABS(z) below.
* Note that fogcoords may be negative, if eye z is source absolute
* value must be taken earlier.
* Fog blend factors are in the range [0,1].
*/
static void
@@ -169,13 +169,10 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage)
*/
input = &store->fogcoord;
/* NOTE: negate plane here so we get positive fog coords! */
/* NOTE2: this doesn't always work (tests/fog - all frag depth fog
coords will be negative). */
plane[0] = -m[2];
plane[1] = -m[6];
plane[2] = -m[10];
plane[3] = -m[14];
plane[0] = m[2];
plane[1] = m[6];
plane[2] = m[10];
plane[3] = m[14];
/* Full eye coords weren't required, just calculate the
* eye Z values.
*/
@@ -189,12 +186,12 @@ run_fog_stage(GLcontext *ctx, struct tnl_pipeline_stage *stage)
NOTE should avoid going through array twice */
coord = input->start;
for (i = 0; i < input->count; i++) {
input->data[i][0] = FABSF(*coord);
*coord = FABSF(*coord);
STRIDE_F(coord, input->stride);
}
}
else {
/* fog coordinates = eye Z coordinates (use ABS later) */
/* fog coordinates = eye Z coordinates - need to copy for ABS */
input = &store->fogcoord;
if (VB->EyePtr->size < 2)
@@ -249,7 +246,6 @@ alloc_fog_data(GLcontext *ctx, struct tnl_pipeline_stage *stage)
return GL_FALSE;
_mesa_vector4f_alloc( &store->fogcoord, 0, tnl->vb.Size, 32 );
_mesa_vector4f_init( &store->input, 0, NULL );
if (!inited)
init_static_data();