Compare commits
13 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
0cbff147e5 | ||
|
2aab46f3c9 | ||
|
570b7c6d25 | ||
|
0f9a254fdc | ||
|
8f827b4173 | ||
|
5b14ca7e18 | ||
|
96823333b1 | ||
|
341fd4a78c | ||
|
bfa3a88ca1 | ||
|
41c41c0e31 | ||
|
bc226ca838 | ||
|
6be7c45d15 | ||
|
6d3385fa54 |
2
.gitignore
vendored
2
.gitignore
vendored
@ -34,3 +34,5 @@ mesa-20100720.tar.bz2
|
||||
/MesaLib-8.0.tar.bz2
|
||||
/MesaLib-8.0.1.tar.bz2
|
||||
/MesaLib-8.0.2.tar.bz2
|
||||
/MesaLib-8.0.3.tar.bz2
|
||||
/MesaLib-8.0.4.tar.bz2
|
||||
|
@ -1,52 +0,0 @@
|
||||
From 89e796aef5ca1b35ca4ff6fce9231b4125e07037 Mon Sep 17 00:00:00 2001
|
||||
From: Dylan Noblesmith <nobled@dreamwidth.org>
|
||||
Date: Fri, 16 Mar 2012 18:38:49 +0000
|
||||
Subject: [PATCH] intel: fix null dereference processing HiZ buffer
|
||||
|
||||
Or technically, a near-null dereference.
|
||||
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=46303
|
||||
https://bugs.freedesktop.org/show_bug.cgi?id=46739
|
||||
|
||||
NOTE: This is a candidate for the 8.0 branch.
|
||||
|
||||
Reviewed-by: Chad Versace <chad.versace@linux.intel.com>
|
||||
(cherry picked from commit 8d9decb75f0df564abaf9888d9fc5c77de8059cd)
|
||||
---
|
||||
src/mesa/drivers/dri/intel/intel_context.c | 6 ++++++
|
||||
1 files changed, 6 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/src/mesa/drivers/dri/intel/intel_context.c b/src/mesa/drivers/dri/intel/intel_context.c
|
||||
index d3c0d70..9cdd804 100644
|
||||
--- a/src/mesa/drivers/dri/intel/intel_context.c
|
||||
+++ b/src/mesa/drivers/dri/intel/intel_context.c
|
||||
@@ -1225,6 +1225,10 @@ intel_process_dri2_buffer_with_separate_stencil(struct intel_context *intel,
|
||||
if (!rb)
|
||||
return;
|
||||
|
||||
+ /* Check if we failed to allocate the depth miptree earlier. */
|
||||
+ if (buffer->attachment == __DRI_BUFFER_HIZ && rb->mt == NULL)
|
||||
+ return;
|
||||
+
|
||||
/* If the renderbuffer's and DRIbuffer's regions match, then continue. */
|
||||
if ((buffer->attachment != __DRI_BUFFER_HIZ &&
|
||||
rb->mt &&
|
||||
@@ -1266,6 +1270,7 @@ intel_process_dri2_buffer_with_separate_stencil(struct intel_context *intel,
|
||||
* due to failure to allocate new storage.
|
||||
*/
|
||||
if (buffer->attachment == __DRI_BUFFER_HIZ) {
|
||||
+ assert(rb->mt);
|
||||
intel_miptree_release(&rb->mt->hiz_mt);
|
||||
} else {
|
||||
intel_miptree_release(&rb->mt);
|
||||
@@ -1291,6 +1296,7 @@ intel_process_dri2_buffer_with_separate_stencil(struct intel_context *intel,
|
||||
|
||||
/* Associate buffer with new storage. */
|
||||
if (buffer->attachment == __DRI_BUFFER_HIZ) {
|
||||
+ assert(rb->mt);
|
||||
rb->mt->hiz_mt = mt;
|
||||
} else {
|
||||
rb->mt = mt;
|
||||
--
|
||||
1.7.7.6
|
||||
|
@ -1,21 +1,21 @@
|
||||
diff -up Mesa-8.0.1/src/gallium/state_trackers/dri/sw/drisw.c.shmget Mesa-8.0.1/src/gallium/state_trackers/dri/sw/drisw.c
|
||||
--- Mesa-8.0.1/src/gallium/state_trackers/dri/sw/drisw.c.shmget 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/gallium/state_trackers/dri/sw/drisw.c 2012-03-15 06:35:44.989221196 -0400
|
||||
@@ -252,7 +252,6 @@ drisw_update_tex_buffer(struct dri_drawa
|
||||
diff -up mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c.jx mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c
|
||||
--- mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c.jx 2012-04-24 07:37:03.000000000 -0400
|
||||
+++ mesa-20120424/src/gallium/state_trackers/dri/sw/drisw.c 2012-05-16 13:30:36.596312047 -0400
|
||||
@@ -252,8 +252,6 @@ drisw_update_tex_buffer(struct dri_drawa
|
||||
struct pipe_transfer *transfer;
|
||||
char *map;
|
||||
int x, y, w, h;
|
||||
- int ximage_stride, line;
|
||||
- int cpp = util_format_get_blocksize(res->format);
|
||||
|
||||
get_drawable_info(dPriv, &x, &y, &w, &h);
|
||||
|
||||
@@ -265,15 +264,6 @@ drisw_update_tex_buffer(struct dri_drawa
|
||||
@@ -266,14 +264,6 @@ drisw_update_tex_buffer(struct dri_drawa
|
||||
/* Copy the Drawable content to the mapped texture buffer */
|
||||
get_image(dPriv, x, y, w, h, map);
|
||||
|
||||
- /* The pipe transfer has a pitch rounded up to the nearest 64 pixels.
|
||||
- We assume 32 bit pixels. */
|
||||
- ximage_stride = w * 4;
|
||||
- /* The pipe transfer has a pitch rounded up to the nearest 64 pixels. */
|
||||
- ximage_stride = w * cpp;
|
||||
- for (line = h-1; line; --line) {
|
||||
- memmove(&map[line * transfer->stride],
|
||||
- &map[line * ximage_stride],
|
||||
@ -25,9 +25,9 @@ diff -up Mesa-8.0.1/src/gallium/state_trackers/dri/sw/drisw.c.shmget Mesa-8.0.1/
|
||||
pipe_transfer_unmap(pipe, transfer);
|
||||
pipe_transfer_destroy(pipe, transfer);
|
||||
}
|
||||
diff -up Mesa-8.0.1/src/glx/drisw_glx.c.shmget Mesa-8.0.1/src/glx/drisw_glx.c
|
||||
--- Mesa-8.0.1/src/glx/drisw_glx.c.shmget 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/glx/drisw_glx.c 2012-03-14 11:25:04.708341441 -0400
|
||||
diff -up mesa-20120424/src/glx/drisw_glx.c.jx mesa-20120424/src/glx/drisw_glx.c
|
||||
--- mesa-20120424/src/glx/drisw_glx.c.jx 2012-04-24 07:37:03.000000000 -0400
|
||||
+++ mesa-20120424/src/glx/drisw_glx.c 2012-05-16 13:29:25.087965268 -0400
|
||||
@@ -24,6 +24,9 @@
|
||||
#if defined(GLX_DIRECT_RENDERING) && !defined(GLX_USE_APPLEGL)
|
||||
|
||||
@ -38,7 +38,7 @@ diff -up Mesa-8.0.1/src/glx/drisw_glx.c.shmget Mesa-8.0.1/src/glx/drisw_glx.c
|
||||
#include "glxclient.h"
|
||||
#include <dlfcn.h>
|
||||
#include "dri_common.h"
|
||||
@@ -203,6 +206,96 @@ swrastPutImage(__DRIdrawable * draw, int
|
||||
@@ -206,6 +209,96 @@ swrastPutImage(__DRIdrawable * draw, int
|
||||
ximage->data = NULL;
|
||||
}
|
||||
|
||||
@ -135,7 +135,7 @@ diff -up Mesa-8.0.1/src/glx/drisw_glx.c.shmget Mesa-8.0.1/src/glx/drisw_glx.c
|
||||
static void
|
||||
swrastGetImage(__DRIdrawable * read,
|
||||
int x, int y, int w, int h,
|
||||
@@ -217,11 +310,17 @@ swrastGetImage(__DRIdrawable * read,
|
||||
@@ -220,11 +313,17 @@ swrastGetImage(__DRIdrawable * read,
|
||||
readable = pread->xDrawable;
|
||||
|
||||
ximage = prp->ximage;
|
||||
|
@ -1,201 +0,0 @@
|
||||
diff -up Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h.jx Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h
|
||||
--- Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h.jx 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/gallium/include/state_tracker/drm_driver.h 2012-03-23 13:11:40.785842579 -0400
|
||||
@@ -43,6 +43,7 @@ struct winsys_handle
|
||||
enum drm_conf {
|
||||
/* How many frames to allow before throttling. Or -1 to indicate any number */
|
||||
DRM_CONF_THROTTLE, /* DRM_CONF_INT. */
|
||||
+ DRM_CONF_NOTFP,
|
||||
DRM_CONF_MAX
|
||||
};
|
||||
|
||||
diff -up Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c.jx Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c
|
||||
--- Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c.jx 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/gallium/state_trackers/dri/drm/dri2.c 2012-03-23 13:11:40.785842579 -0400
|
||||
@@ -642,6 +642,13 @@ static struct __DRIimageExtensionRec dri
|
||||
* Backend function init_screen.
|
||||
*/
|
||||
|
||||
+static const __DRIextension *dri_screen_extensions_no_tfp[] = {
|
||||
+ &dri2FlushExtension.base,
|
||||
+ &dri2ImageExtension.base,
|
||||
+ &dri2ConfigQueryExtension.base,
|
||||
+ NULL
|
||||
+};
|
||||
+
|
||||
static const __DRIextension *dri_screen_extensions[] = {
|
||||
&driTexBufferExtension.base,
|
||||
&dri2FlushExtension.base,
|
||||
@@ -671,6 +678,7 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
struct dri_screen *screen;
|
||||
struct pipe_screen *pscreen;
|
||||
const struct drm_conf_ret *throttle_ret = NULL;
|
||||
+ const struct drm_conf_ret *notfp_ret = NULL;
|
||||
|
||||
screen = CALLOC_STRUCT(dri_screen);
|
||||
if (!screen)
|
||||
@@ -682,12 +690,16 @@ dri2_init_screen(__DRIscreen * sPriv)
|
||||
sPriv->driverPrivate = (void *)screen;
|
||||
|
||||
pscreen = driver_descriptor.create_screen(screen->fd);
|
||||
- if (driver_descriptor.configuration)
|
||||
+ if (driver_descriptor.configuration) {
|
||||
throttle_ret = driver_descriptor.configuration(DRM_CONF_THROTTLE);
|
||||
+ throttle_ret = driver_descriptor.configuration(DRM_CONF_NOTFP);
|
||||
+ }
|
||||
|
||||
if (throttle_ret && throttle_ret->val.val_int != -1) {
|
||||
sPriv->extensions = dri_screen_extensions_throttle;
|
||||
screen->default_throttle_frames = throttle_ret->val.val_int;
|
||||
+ } else if (notfp_ret && notfp_ret->val.val_bool == 1) {
|
||||
+ sPriv->extensions = dri_screen_extensions_no_tfp;
|
||||
} else
|
||||
sPriv->extensions = dri_screen_extensions;
|
||||
|
||||
diff -up Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c.jx Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c
|
||||
--- Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c.jx 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/gallium/targets/dri-nouveau/target.c 2012-03-23 13:14:37.824416888 -0400
|
||||
@@ -3,6 +3,12 @@
|
||||
#include "state_tracker/drm_driver.h"
|
||||
#include "nouveau/drm/nouveau_drm_public.h"
|
||||
|
||||
+#include <xf86drm.h>
|
||||
+#include <nouveau_drm.h>
|
||||
+
|
||||
+/* yes this is an ugly hack */
|
||||
+static int nvfd = -1;
|
||||
+
|
||||
static struct pipe_screen *
|
||||
create_screen(int fd)
|
||||
{
|
||||
@@ -12,9 +18,52 @@ create_screen(int fd)
|
||||
if (!screen)
|
||||
return NULL;
|
||||
|
||||
+ nvfd = fd;
|
||||
+
|
||||
screen = debug_screen_wrap(screen);
|
||||
|
||||
return screen;
|
||||
}
|
||||
|
||||
-DRM_DRIVER_DESCRIPTOR("nouveau", "nouveau", create_screen, NULL)
|
||||
+static const struct drm_conf_ret notfp_ret = {
|
||||
+ .type = DRM_CONF_BOOL,
|
||||
+ .val.val_bool = 1,
|
||||
+};
|
||||
+
|
||||
+static const struct drm_conf_ret *drm_configuration(enum drm_conf conf)
|
||||
+{
|
||||
+ switch (conf) {
|
||||
+ case DRM_CONF_NOTFP:
|
||||
+ {
|
||||
+ /* have to open-code to reuse the fd */
|
||||
+ struct drm_nouveau_getparam g;
|
||||
+ int vram;
|
||||
+
|
||||
+ g.param = NOUVEAU_GETPARAM_CHIPSET_ID;
|
||||
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
|
||||
+ return ¬fp_ret; /* error? paranoia */
|
||||
+
|
||||
+ if (g.value < 0x50)
|
||||
+ return NULL; /* nv50+ okay */
|
||||
+
|
||||
+ if (g.value & 0xf0 == 0x30)
|
||||
+ return ¬fp_ret; /* nv30 definitely horked */
|
||||
+
|
||||
+ g.param = NOUVEAU_GETPARAM_FB_SIZE;
|
||||
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
|
||||
+ return ¬fp_ret; /* error? paranoia */
|
||||
+
|
||||
+ vram = g.value;
|
||||
+ if ((vram >> 20) <= 64)
|
||||
+ return ¬fp_ret; /* let's say <64M is too little */
|
||||
+
|
||||
+ return NULL;
|
||||
+ }
|
||||
+
|
||||
+ default:
|
||||
+ break;
|
||||
+ }
|
||||
+ return NULL;
|
||||
+}
|
||||
+
|
||||
+DRM_DRIVER_DESCRIPTOR("nouveau", "nouveau", create_screen, drm_configuration)
|
||||
diff -up Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c.jx Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c
|
||||
--- Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c.jx 2012-02-14 18:44:00.000000000 -0500
|
||||
+++ Mesa-8.0.1/src/mesa/drivers/dri/nouveau/nouveau_screen.c 2012-03-23 13:38:34.477024222 -0400
|
||||
@@ -37,7 +37,11 @@
|
||||
#include "main/renderbuffer.h"
|
||||
#include "swrast/s_renderbuffer.h"
|
||||
|
||||
+#include <xf86drm.h>
|
||||
+#include <nouveau_drm.h>
|
||||
+
|
||||
static const __DRIextension *nouveau_screen_extensions[];
|
||||
+static const __DRIextension *nouveau_screen_extensions_notfp[];
|
||||
|
||||
static void
|
||||
nouveau_destroy_screen(__DRIscreen *dri_screen);
|
||||
@@ -86,6 +90,28 @@ nouveau_get_configs(void)
|
||||
return (const __DRIconfig **)configs;
|
||||
}
|
||||
|
||||
+static int
|
||||
+shouldnt_tfp(int nvfd)
|
||||
+{
|
||||
+ /* have to open-code to reuse the fd */
|
||||
+ struct drm_nouveau_getparam g;
|
||||
+ int vram;
|
||||
+
|
||||
+ g.param = NOUVEAU_GETPARAM_CHIPSET_ID;
|
||||
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
|
||||
+ return 1; /* error? paranoia */
|
||||
+
|
||||
+ g.param = NOUVEAU_GETPARAM_FB_SIZE;
|
||||
+ if (drmCommandWriteRead(nvfd, DRM_NOUVEAU_GETPARAM, &g, sizeof(g)))
|
||||
+ return 1; /* error? paranoia */
|
||||
+
|
||||
+ vram = g.value;
|
||||
+ if ((vram >> 20) <= 64)
|
||||
+ return 1; /* let's say 64M is too little */
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static const __DRIconfig **
|
||||
nouveau_init_screen2(__DRIscreen *dri_screen)
|
||||
{
|
||||
@@ -99,7 +125,6 @@ nouveau_init_screen2(__DRIscreen *dri_sc
|
||||
return NULL;
|
||||
|
||||
dri_screen->driverPrivate = screen;
|
||||
- dri_screen->extensions = nouveau_screen_extensions;
|
||||
screen->dri_screen = dri_screen;
|
||||
|
||||
/* Open the DRM device. */
|
||||
@@ -110,6 +135,11 @@ nouveau_init_screen2(__DRIscreen *dri_sc
|
||||
goto fail;
|
||||
}
|
||||
|
||||
+ if (shouldnt_tfp(dri_screen->fd))
|
||||
+ dri_screen->extensions = nouveau_screen_extensions_notfp;
|
||||
+ else
|
||||
+ dri_screen->extensions = nouveau_screen_extensions;
|
||||
+
|
||||
/* Choose the card specific function pointers. */
|
||||
switch (screen->device->chipset & 0xf0) {
|
||||
case 0x00:
|
||||
@@ -240,6 +270,12 @@ static const __DRIextension *nouveau_scr
|
||||
&dri2ConfigQueryExtension.base,
|
||||
NULL
|
||||
};
|
||||
+
|
||||
+static const __DRIextension *nouveau_screen_extensions_notfp[] = {
|
||||
+ &nouveau_flush_extension.base,
|
||||
+ &dri2ConfigQueryExtension.base,
|
||||
+ NULL
|
||||
+};
|
||||
|
||||
const struct __DriverAPIRec driDriverAPI = {
|
||||
.InitScreen = nouveau_init_screen2,
|
75
mesa-8.0-nouveau-vieux-finish.patch
Normal file
75
mesa-8.0-nouveau-vieux-finish.patch
Normal file
@ -0,0 +1,75 @@
|
||||
From 4b4f636fadd997b82be7b0f4fe9acd1090d3ad20 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Skeggs <bskeggs@redhat.com>
|
||||
Date: Fri, 11 May 2012 03:02:13 +1000
|
||||
Subject: [PATCH] nouveau/vieux: finish != flush, how about we do that..
|
||||
|
||||
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
|
||||
---
|
||||
src/mesa/drivers/dri/nouveau/nouveau_context.c | 7 +++++++
|
||||
src/mesa/drivers/dri/nouveau/nouveau_context.h | 2 ++
|
||||
src/mesa/drivers/dri/nouveau/nouveau_driver.c | 10 ++++++++++
|
||||
3 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
index 9051e18..db5d9ea 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
@@ -91,6 +91,12 @@ nouveau_context_create(gl_api api,
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
+ if (nouveau_bo_new(context_dev(ctx), NOUVEAU_BO_VRAM, 0, 4096, &nctx->fence)) {
|
||||
+ nouveau_context_destroy(dri_ctx);
|
||||
+ *error = __DRI_CTX_ERROR_NO_MEMORY;
|
||||
+ return GL_FALSE;
|
||||
+ }
|
||||
+
|
||||
*error = __DRI_CTX_ERROR_SUCCESS;
|
||||
return GL_TRUE;
|
||||
}
|
||||
@@ -189,6 +195,7 @@ nouveau_context_destroy(__DRIcontext *dri_ctx)
|
||||
struct nouveau_context *nctx = dri_ctx->driverPrivate;
|
||||
struct gl_context *ctx = &nctx->base;
|
||||
|
||||
+ nouveau_bo_ref(NULL, &nctx->fence);
|
||||
context_drv(ctx)->context_destroy(ctx);
|
||||
}
|
||||
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
index 7777246..9d06da9 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
@@ -65,6 +65,8 @@ struct nouveau_context {
|
||||
BITSET_DECLARE(dirty, MAX_NOUVEAU_STATE);
|
||||
enum nouveau_fallback fallback;
|
||||
|
||||
+ struct nouveau_bo *fence;
|
||||
+
|
||||
struct nouveau_hw_state hw;
|
||||
struct nouveau_bo_state bo;
|
||||
struct nouveau_render_state render;
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
index 8532032..6031314 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
@@ -74,7 +74,17 @@ nouveau_flush(struct gl_context *ctx)
|
||||
static void
|
||||
nouveau_finish(struct gl_context *ctx)
|
||||
{
|
||||
+ struct nouveau_context *nctx = to_nouveau_context(ctx);
|
||||
+ struct nouveau_channel *chan = context_chan(ctx);
|
||||
+
|
||||
nouveau_flush(ctx);
|
||||
+
|
||||
+ MARK_RING(chan, 1, 1);
|
||||
+ OUT_RELOC(chan, nctx->fence, 0, NOUVEAU_BO_WR | NOUVEAU_BO_DUMMY, 0, 0);
|
||||
+ FIRE_RING(chan);
|
||||
+
|
||||
+ nouveau_bo_map(nctx->fence, NOUVEAU_BO_RDWR);
|
||||
+ nouveau_bo_unmap(nctx->fence);
|
||||
}
|
||||
|
||||
void
|
||||
--
|
||||
1.7.10
|
||||
|
296
mesa-8.0-nouveau-vieux-nvfx-lowmem.patch
Normal file
296
mesa-8.0-nouveau-vieux-nvfx-lowmem.patch
Normal file
@ -0,0 +1,296 @@
|
||||
From 1313008370f2e179dea102ba1520cf72d9012765 Mon Sep 17 00:00:00 2001
|
||||
From: Ben Skeggs <bskeggs@redhat.com>
|
||||
Date: Fri, 11 May 2012 01:31:36 +1000
|
||||
Subject: [PATCH] vieux/nvfx lowmem hacks
|
||||
|
||||
---
|
||||
src/gallium/drivers/nvfx/nvfx_fragprog.c | 23 ++++++++++----------
|
||||
src/gallium/drivers/nvfx/nvfx_screen.c | 4 ++++
|
||||
src/gallium/drivers/nvfx/nvfx_screen.h | 2 ++
|
||||
src/gallium/drivers/nvfx/nvfx_surface.c | 9 +++++++-
|
||||
src/gallium/drivers/nvfx/nvfx_vbo.c | 5 +++++
|
||||
src/gallium/drivers/nvfx/nvfx_vertprog.c | 4 +++-
|
||||
src/mesa/drivers/dri/nouveau/nouveau_context.c | 5 +++++
|
||||
src/mesa/drivers/dri/nouveau/nouveau_context.h | 4 ++++
|
||||
src/mesa/drivers/dri/nouveau/nouveau_driver.c | 3 +++
|
||||
src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c | 3 +++
|
||||
src/mesa/drivers/dri/nouveau/nv04_surface.c | 27 +++++++++++++++++++++---
|
||||
11 Dateien geändert, 72 Zeilen hinzugefügt(+), 17 Zeilen entfernt(-)
|
||||
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_fragprog.c b/src/gallium/drivers/nvfx/nvfx_fragprog.c
|
||||
index 0babcbb..f5b7a0e 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_fragprog.c
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_fragprog.c
|
||||
@@ -224,7 +224,6 @@ nvfx_fp_emit(struct nvfx_fpc *fpc, struct nvfx_insn insn)
|
||||
if(insn.unit >= 0)
|
||||
{
|
||||
hw[0] |= (insn.unit << NVFX_FP_OP_TEX_UNIT_SHIFT);
|
||||
- fp->samplers |= (1 << insn.unit);
|
||||
}
|
||||
|
||||
emit_dst(fpc, insn.dst);
|
||||
@@ -1355,17 +1354,17 @@ update_slots:
|
||||
|
||||
fp->slot_to_fp_input[fp->num_slots] = sprite_real_input;
|
||||
|
||||
- if(nvfx->is_nv4x)
|
||||
- {
|
||||
- fp->or = 0;
|
||||
- for(i = 0; i <= fp->num_slots; ++i) {
|
||||
- unsigned fp_input = fp->slot_to_fp_input[i];
|
||||
- if(fp_input == NVFX_FP_OP_INPUT_SRC_TC(8))
|
||||
- fp->or |= (1 << 12);
|
||||
- else if(fp_input == NVFX_FP_OP_INPUT_SRC_TC(9))
|
||||
- fp->or |= (1 << 13);
|
||||
- else if(fp_input >= NVFX_FP_OP_INPUT_SRC_TC(0) && fp_input <= NVFX_FP_OP_INPUT_SRC_TC(7))
|
||||
- fp->or |= (1 << (fp_input - NVFX_FP_OP_INPUT_SRC_TC0 + 14));
|
||||
+ fp->or = 0;
|
||||
+ fp->samplers = 0;
|
||||
+ for(i = 0; i <= fp->num_slots; ++i) {
|
||||
+ unsigned fp_input = fp->slot_to_fp_input[i];
|
||||
+ if(fp_input == NVFX_FP_OP_INPUT_SRC_TC(8))
|
||||
+ fp->or |= (1 << 12);
|
||||
+ else if(fp_input == NVFX_FP_OP_INPUT_SRC_TC(9))
|
||||
+ fp->or |= (1 << 13);
|
||||
+ else if(fp_input >= NVFX_FP_OP_INPUT_SRC_TC(0) && fp_input <= NVFX_FP_OP_INPUT_SRC_TC(7)) {
|
||||
+ fp->or |= (1 << (fp_input - NVFX_FP_OP_INPUT_SRC_TC0 + 14));
|
||||
+ fp->samplers |= 1 << (fp_input - NVFX_FP_OP_INPUT_SRC_TC(0));
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_screen.c b/src/gallium/drivers/nvfx/nvfx_screen.c
|
||||
index b4a1b3a..e6dc596 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_screen.c
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_screen.c
|
||||
@@ -533,6 +533,10 @@ nvfx_screen_create(struct nouveau_device *dev)
|
||||
screen->advertise_blend_equation_separate = !!screen->is_nv4x;
|
||||
screen->use_nv4x = screen->is_nv4x;
|
||||
|
||||
+ screen->hack = TRUE;
|
||||
+ if (debug_get_bool_option("NVFX_UNHACK", FALSE))
|
||||
+ screen->hack = FALSE;
|
||||
+
|
||||
if(screen->is_nv4x) {
|
||||
if(debug_get_bool_option("NVFX_SIMULATE_NV30", FALSE))
|
||||
screen->use_nv4x = 0;
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_screen.h b/src/gallium/drivers/nvfx/nvfx_screen.h
|
||||
index 35c9d91..55ed439 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_screen.h
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_screen.h
|
||||
@@ -14,6 +14,8 @@ struct nvfx_screen {
|
||||
|
||||
struct nvfx_context *cur_ctx;
|
||||
|
||||
+ boolean hack;
|
||||
+
|
||||
unsigned is_nv4x; /* either 0 or ~0 */
|
||||
unsigned use_nv4x; /* either 0 or ~0 */
|
||||
boolean force_swtnl;
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_surface.c b/src/gallium/drivers/nvfx/nvfx_surface.c
|
||||
index cac3fca..3937869 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_surface.c
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_surface.c
|
||||
@@ -273,8 +273,12 @@ nvfx_resource_copy_region(struct pipe_context *pipe,
|
||||
small = (w * h <= copy_threshold);
|
||||
if((!dst_to_gpu || !src_on_gpu) && small)
|
||||
ret = -1; /* use the CPU */
|
||||
- else
|
||||
+ else {
|
||||
ret = nv04_region_copy_2d(ctx, &dst, &src, w, h, dst_to_gpu, src_on_gpu);
|
||||
+ if (nvfx_screen(pipe->screen)->hack)
|
||||
+ FIRE_RING(nvfx_screen(pipe->screen)->base.channel);
|
||||
+ }
|
||||
+
|
||||
if(!ret)
|
||||
{}
|
||||
else if(ret > 0
|
||||
@@ -335,6 +339,9 @@ nvfx_surface_fill(struct pipe_context* pipe, struct pipe_surface *dsts,
|
||||
h = util_format_get_nblocksy(dsts->format, h);
|
||||
|
||||
ret = nv04_region_fill_2d(ctx, &dst, w, h, value);
|
||||
+ if (nvfx_screen(pipe->screen)->hack)
|
||||
+ FIRE_RING(nvfx_screen(pipe->screen)->base.channel);
|
||||
+
|
||||
if(ret > 0 && dsts->texture->bind & PIPE_BIND_RENDER_TARGET)
|
||||
return 1;
|
||||
else if(ret)
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_vbo.c b/src/gallium/drivers/nvfx/nvfx_vbo.c
|
||||
index b72379d..5860b54 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_vbo.c
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_vbo.c
|
||||
@@ -237,6 +237,11 @@ void nvfx_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
|
||||
}
|
||||
}
|
||||
|
||||
+ if (nvfx->screen->hack) {
|
||||
+ struct nouveau_channel *chan = nvfx->screen->base.channel;
|
||||
+ FIRE_RING(chan);
|
||||
+ }
|
||||
+
|
||||
if (nvfx->screen->force_swtnl || !nvfx_state_validate(nvfx))
|
||||
nvfx_draw_vbo_swtnl(pipe, info);
|
||||
else
|
||||
diff --git a/src/gallium/drivers/nvfx/nvfx_vertprog.c b/src/gallium/drivers/nvfx/nvfx_vertprog.c
|
||||
index a11941f..e19a288 100644
|
||||
--- a/src/gallium/drivers/nvfx/nvfx_vertprog.c
|
||||
+++ b/src/gallium/drivers/nvfx/nvfx_vertprog.c
|
||||
@@ -288,6 +288,8 @@ nvfx_vp_emit(struct nvfx_vpc *vpc, struct nvfx_insn insn)
|
||||
|
||||
hw = vpc->vpi->data;
|
||||
|
||||
+ if (insn.cc_test != NVFX_COND_TR)
|
||||
+ hw[0] |= NVFX_VP(INST_COND_TEST_ENABLE);
|
||||
hw[0] |= (insn.cc_test << NVFX_VP(INST_COND_SHIFT));
|
||||
hw[0] |= ((insn.cc_swz[0] << NVFX_VP(INST_COND_SWZ_X_SHIFT)) |
|
||||
(insn.cc_swz[1] << NVFX_VP(INST_COND_SWZ_Y_SHIFT)) |
|
||||
@@ -649,7 +651,7 @@ nvfx_vertprog_parse_instruction(struct nvfx_context* nvfx, struct nvfx_vpc *vpc,
|
||||
nvfx_vp_emit(vpc, arith(sat, VEC, SNE, dst, mask, src[0], src[1], none));
|
||||
break;
|
||||
case TGSI_OPCODE_SSG:
|
||||
- nvfx_vp_emit(vpc, arith(sat, VEC, SSG, dst, mask, src[0], src[1], none));
|
||||
+ nvfx_vp_emit(vpc, arith(sat, VEC, SSG, dst, mask, src[0], none, none));
|
||||
break;
|
||||
case TGSI_OPCODE_STR:
|
||||
nvfx_vp_emit(vpc, arith(sat, VEC, STR, dst, mask, src[0], src[1], none));
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.c b/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
index 5838b4e..db5d9ea 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.c
|
||||
@@ -112,6 +112,11 @@ nouveau_context_init(struct gl_context *ctx, struct nouveau_screen *screen,
|
||||
nctx->screen = screen;
|
||||
nctx->fallback = HWTNL;
|
||||
|
||||
+ if (getenv("NOUVEAU_UNHACK"))
|
||||
+ nctx->hack = GL_FALSE;
|
||||
+ else
|
||||
+ nctx->hack = GL_TRUE;
|
||||
+
|
||||
/* Initialize the function pointers. */
|
||||
_mesa_init_driver_functions(&functions);
|
||||
nouveau_driver_functions_init(&functions);
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_context.h b/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
index d44c02a..9d06da9 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_context.h
|
||||
@@ -76,6 +76,8 @@ struct nouveau_context {
|
||||
GLboolean clear_blocked;
|
||||
int clear_seq;
|
||||
} hierz;
|
||||
+
|
||||
+ GLboolean hack;
|
||||
};
|
||||
|
||||
#define to_nouveau_context(ctx) ((struct nouveau_context *)(ctx))
|
||||
@@ -90,6 +92,8 @@ struct nouveau_context {
|
||||
(to_nouveau_context(ctx)->hw.eng3d)
|
||||
#define context_drv(ctx) \
|
||||
(to_nouveau_context(ctx)->screen->driver)
|
||||
+#define context_hack(ctx) \
|
||||
+ (to_nouveau_context(ctx)->hack)
|
||||
#define context_dirty(ctx, s) \
|
||||
BITSET_SET(to_nouveau_context(ctx)->dirty, NOUVEAU_STATE_##s)
|
||||
#define context_dirty_i(ctx, s, i) \
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_driver.c b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
index dab6807..6031314 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_driver.c
|
||||
@@ -138,6 +138,9 @@ nouveau_clear(struct gl_context *ctx, GLbitfield buffers)
|
||||
|
||||
if (buffers)
|
||||
_mesa_meta_Clear(ctx, buffers);
|
||||
+
|
||||
+ if (context_hack(ctx))
|
||||
+ FIRE_RING(context_chan(ctx));
|
||||
}
|
||||
|
||||
void
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
|
||||
index de04d18..2337a73 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nouveau_vbo_t.c
|
||||
@@ -456,6 +456,9 @@ TAG(vbo_render_prims)(struct gl_context *ctx,
|
||||
max_index);
|
||||
|
||||
vbo_deinit_arrays(ctx, ib, arrays);
|
||||
+
|
||||
+ if (context_hack(ctx))
|
||||
+ FIRE_RING(context_chan(ctx));
|
||||
}
|
||||
|
||||
/* VBO rendering entry points. */
|
||||
diff --git a/src/mesa/drivers/dri/nouveau/nv04_surface.c b/src/mesa/drivers/dri/nouveau/nv04_surface.c
|
||||
index 4a3000c..2383711 100644
|
||||
--- a/src/mesa/drivers/dri/nouveau/nv04_surface.c
|
||||
+++ b/src/mesa/drivers/dri/nouveau/nv04_surface.c
|
||||
@@ -209,6 +209,13 @@ nv04_surface_copy_swizzle(struct gl_context *ctx,
|
||||
unsigned sub_h = h > max_h ? max_h : h;
|
||||
unsigned x, y;
|
||||
|
||||
+ if (context_hack(ctx)) {
|
||||
+ void *flush_notify = chan->flush_notify;
|
||||
+ chan->flush_notify = NULL;
|
||||
+ FIRE_RING(chan);
|
||||
+ chan->flush_notify = flush_notify;
|
||||
+ }
|
||||
+
|
||||
/* Swizzled surfaces must be POT */
|
||||
assert(_mesa_is_pow_two(dst->width) &&
|
||||
_mesa_is_pow_two(dst->height));
|
||||
@@ -263,7 +270,7 @@ nv04_surface_copy_swizzle(struct gl_context *ctx,
|
||||
|
||||
nouveau_bo_context_reset(bctx);
|
||||
|
||||
- if (context_chipset(ctx) < 0x10)
|
||||
+ if (context_hack(ctx) || context_chipset(ctx) < 0x10)
|
||||
FIRE_RING(chan);
|
||||
}
|
||||
|
||||
@@ -282,6 +289,13 @@ nv04_surface_copy_m2mf(struct gl_context *ctx,
|
||||
unsigned dst_offset = dst->offset + dy * dst->pitch + dx * dst->cpp;
|
||||
unsigned src_offset = src->offset + sy * src->pitch + sx * src->cpp;
|
||||
|
||||
+ if (context_hack(ctx)) {
|
||||
+ void *flush_notify = chan->flush_notify;
|
||||
+ chan->flush_notify = NULL;
|
||||
+ FIRE_RING(chan);
|
||||
+ chan->flush_notify = flush_notify;
|
||||
+ }
|
||||
+
|
||||
nouveau_bo_marko(bctx, m2mf, NV04_M2MF_DMA_BUFFER_IN,
|
||||
src->bo, bo_flags | NOUVEAU_BO_RD);
|
||||
nouveau_bo_marko(bctx, m2mf, NV04_M2MF_DMA_BUFFER_OUT,
|
||||
@@ -311,7 +325,7 @@ nv04_surface_copy_m2mf(struct gl_context *ctx,
|
||||
|
||||
nouveau_bo_context_reset(bctx);
|
||||
|
||||
- if (context_chipset(ctx) < 0x10)
|
||||
+ if (context_hack(ctx) || context_chipset(ctx) < 0x10)
|
||||
FIRE_RING(chan);
|
||||
}
|
||||
|
||||
@@ -429,6 +443,13 @@ nv04_surface_fill(struct gl_context *ctx,
|
||||
struct nouveau_grobj *rect = hw->rect;
|
||||
unsigned bo_flags = NOUVEAU_BO_VRAM | NOUVEAU_BO_GART;
|
||||
|
||||
+ if (context_hack(ctx)) {
|
||||
+ void *flush_notify = chan->flush_notify;
|
||||
+ chan->flush_notify = NULL;
|
||||
+ FIRE_RING(chan);
|
||||
+ chan->flush_notify = flush_notify;
|
||||
+ }
|
||||
+
|
||||
MARK_RING (chan, 19, 4);
|
||||
|
||||
BEGIN_RING(chan, surf2d, NV04_CONTEXT_SURFACES_2D_DMA_IMAGE_SOURCE, 2);
|
||||
@@ -454,7 +475,7 @@ nv04_surface_fill(struct gl_context *ctx,
|
||||
OUT_RING (chan, (dx << 16) | dy);
|
||||
OUT_RING (chan, ( w << 16) | h);
|
||||
|
||||
- if (context_chipset(ctx) < 0x10)
|
||||
+ if (context_hack(ctx) || context_chipset(ctx) < 0x10)
|
||||
FIRE_RING(chan);
|
||||
}
|
||||
|
||||
--
|
||||
1.7.10.1
|
||||
|
@ -1,265 +0,0 @@
|
||||
diff --git a/docs/relnotes-8.0.1.html b/docs/relnotes-8.0.1.html
|
||||
index 8c8cd3f..29a314c 100644
|
||||
--- a/docs/relnotes-8.0.1.html
|
||||
+++ b/docs/relnotes-8.0.1.html
|
||||
@@ -28,7 +28,9 @@ for DRI hardware acceleration.
|
||||
|
||||
<h2>MD5 checksums</h2>
|
||||
<pre>
|
||||
-tdb
|
||||
+4855c2d93bd2ebd43f384bdcc92c9a27 MesaLib-8.0.1.tar.gz
|
||||
+24eeebf66971809d8f40775a379b36c9 MesaLib-8.0.1.tar.bz2
|
||||
+54e745d14dac5717f7f65b4e2d5c1df2 MesaLib-8.0.1.zip
|
||||
</pre>
|
||||
|
||||
<h2>New features</h2>
|
||||
diff --git a/src/gallium/auxiliary/rtasm/rtasm_cpu.c b/src/gallium/auxiliary/rtasm/rtasm_cpu.c
|
||||
index 0461c81..7afcf14 100644
|
||||
--- a/src/gallium/auxiliary/rtasm/rtasm_cpu.c
|
||||
+++ b/src/gallium/auxiliary/rtasm/rtasm_cpu.c
|
||||
@@ -25,43 +25,43 @@
|
||||
*
|
||||
**************************************************************************/
|
||||
|
||||
+#include "pipe/p_config.h"
|
||||
+#include "rtasm_cpu.h"
|
||||
+
|
||||
+#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
|
||||
|
||||
#include "util/u_debug.h"
|
||||
-#include "rtasm_cpu.h"
|
||||
+#include "util/u_cpu_detect.h"
|
||||
|
||||
+DEBUG_GET_ONCE_BOOL_OPTION(nosse, "GALLIUM_NOSSE", FALSE);
|
||||
|
||||
-#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
|
||||
-static boolean rtasm_sse_enabled(void)
|
||||
+static struct util_cpu_caps *get_cpu_caps(void)
|
||||
{
|
||||
- static boolean firsttime = 1;
|
||||
- static boolean enabled;
|
||||
-
|
||||
- /* This gets called quite often at the moment:
|
||||
- */
|
||||
- if (firsttime) {
|
||||
- enabled = !debug_get_bool_option("GALLIUM_NOSSE", FALSE);
|
||||
- firsttime = FALSE;
|
||||
- }
|
||||
- return enabled;
|
||||
+ util_cpu_detect();
|
||||
+ return &util_cpu_caps;
|
||||
}
|
||||
-#endif
|
||||
|
||||
int rtasm_cpu_has_sse(void)
|
||||
{
|
||||
- /* FIXME: actually detect this at run-time */
|
||||
-#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
|
||||
- return rtasm_sse_enabled();
|
||||
-#else
|
||||
- return 0;
|
||||
-#endif
|
||||
+ return !debug_get_option_nosse() && get_cpu_caps()->has_sse;
|
||||
}
|
||||
|
||||
int rtasm_cpu_has_sse2(void)
|
||||
{
|
||||
- /* FIXME: actually detect this at run-time */
|
||||
-#if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64)
|
||||
- return rtasm_sse_enabled();
|
||||
+ return !debug_get_option_nosse() && get_cpu_caps()->has_sse2;
|
||||
+}
|
||||
+
|
||||
+
|
||||
#else
|
||||
+
|
||||
+int rtasm_cpu_has_sse(void)
|
||||
+{
|
||||
return 0;
|
||||
-#endif
|
||||
}
|
||||
+
|
||||
+int rtasm_cpu_has_sse2(void)
|
||||
+{
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
diff --git a/src/gallium/drivers/r300/compiler/radeon_program_alu.c b/src/gallium/drivers/r300/compiler/radeon_program_alu.c
|
||||
index dd1dfb3..c48f936 100644
|
||||
--- a/src/gallium/drivers/r300/compiler/radeon_program_alu.c
|
||||
+++ b/src/gallium/drivers/r300/compiler/radeon_program_alu.c
|
||||
@@ -1165,35 +1165,79 @@ int radeonTransformDeriv(struct radeon_compiler* c,
|
||||
}
|
||||
|
||||
/**
|
||||
+ * IF Temp[0].x -> IF Temp[0].x
|
||||
+ * ... -> ...
|
||||
+ * KILP -> KIL -abs(Temp[0].x)
|
||||
+ * ... -> ...
|
||||
+ * ENDIF -> ENDIF
|
||||
+ *
|
||||
+ * === OR ===
|
||||
+ *
|
||||
* IF Temp[0].x -\
|
||||
* KILP - > KIL -abs(Temp[0].x)
|
||||
* ENDIF -/
|
||||
*
|
||||
- * This needs to be done in its own pass, because it modifies the instructions
|
||||
- * before and after KILP.
|
||||
+ * === OR ===
|
||||
+ *
|
||||
+ * IF Temp[0].x -> IF Temp[0].x
|
||||
+ * ... -> ...
|
||||
+ * ELSE -> ELSE
|
||||
+ * ... -> ...
|
||||
+ * KILP -> KIL -abs(Temp[0].x)
|
||||
+ * ... -> ...
|
||||
+ * ENDIF -> ENDIF
|
||||
+ *
|
||||
+ * === OR ===
|
||||
+ *
|
||||
+ * KILP -> KIL -none.1111
|
||||
+ *
|
||||
+ * This needs to be done in its own pass, because it might modify the
|
||||
+ * instructions before and after KILP.
|
||||
*/
|
||||
void rc_transform_KILP(struct radeon_compiler * c, void *user)
|
||||
{
|
||||
struct rc_instruction * inst;
|
||||
for (inst = c->Program.Instructions.Next;
|
||||
inst != &c->Program.Instructions; inst = inst->Next) {
|
||||
+ struct rc_instruction * if_inst;
|
||||
+ unsigned in_if = 0;
|
||||
|
||||
if (inst->U.I.Opcode != RC_OPCODE_KILP)
|
||||
continue;
|
||||
|
||||
+ for (if_inst = inst->Prev; if_inst != &c->Program.Instructions;
|
||||
+ if_inst = if_inst->Prev) {
|
||||
+
|
||||
+ if (if_inst->U.I.Opcode == RC_OPCODE_IF) {
|
||||
+ in_if = 1;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
inst->U.I.Opcode = RC_OPCODE_KIL;
|
||||
|
||||
- if (inst->Prev->U.I.Opcode != RC_OPCODE_IF
|
||||
- || inst->Next->U.I.Opcode != RC_OPCODE_ENDIF) {
|
||||
+ if (!in_if) {
|
||||
inst->U.I.SrcReg[0] = negate(builtin_one);
|
||||
} else {
|
||||
-
|
||||
+ /* This should work even if the KILP is inside the ELSE
|
||||
+ * block, because -0.0 is considered negative. */
|
||||
inst->U.I.SrcReg[0] =
|
||||
- negate(absolute(inst->Prev->U.I.SrcReg[0]));
|
||||
- /* Remove IF */
|
||||
- rc_remove_instruction(inst->Prev);
|
||||
- /* Remove ENDIF */
|
||||
- rc_remove_instruction(inst->Next);
|
||||
+ negate(absolute(if_inst->U.I.SrcReg[0]));
|
||||
+
|
||||
+ if (inst->Prev->U.I.Opcode != RC_OPCODE_IF
|
||||
+ && inst->Next->U.I.Opcode != RC_OPCODE_ENDIF) {
|
||||
+
|
||||
+ /* Optimize the special case:
|
||||
+ * IF Temp[0].x
|
||||
+ * KILP
|
||||
+ * ENDIF
|
||||
+ */
|
||||
+
|
||||
+ /* Remove IF */
|
||||
+ rc_remove_instruction(inst->Prev);
|
||||
+ /* Remove ENDIF */
|
||||
+ rc_remove_instruction(inst->Next);
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
diff --git a/src/gallium/drivers/svga/svga_screen.c b/src/gallium/drivers/svga/svga_screen.c
|
||||
index 82a3ff2..e22deb4 100644
|
||||
--- a/src/gallium/drivers/svga/svga_screen.c
|
||||
+++ b/src/gallium/drivers/svga/svga_screen.c
|
||||
@@ -235,7 +235,7 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
|
||||
case PIPE_SHADER_CAP_MAX_TEMPS:
|
||||
if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_FRAGMENT_SHADER_TEMPS, &result))
|
||||
return 32;
|
||||
- return result.u;
|
||||
+ return MIN2(result.u, SVGA3D_TEMPREG_MAX);
|
||||
case PIPE_SHADER_CAP_MAX_ADDRS:
|
||||
case PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR:
|
||||
/*
|
||||
@@ -286,7 +286,7 @@ static int svga_get_shader_param(struct pipe_screen *screen, unsigned shader, en
|
||||
case PIPE_SHADER_CAP_MAX_TEMPS:
|
||||
if (!sws->get_cap(sws, SVGA3D_DEVCAP_MAX_VERTEX_SHADER_TEMPS, &result))
|
||||
return 32;
|
||||
- return result.u;
|
||||
+ return MIN2(result.u, SVGA3D_TEMPREG_MAX);
|
||||
case PIPE_SHADER_CAP_MAX_ADDRS:
|
||||
return 1;
|
||||
case PIPE_SHADER_CAP_MAX_PREDS:
|
||||
diff --git a/src/mesa/drivers/dri/i965/brw_eu_emit.c b/src/mesa/drivers/dri/i965/brw_eu_emit.c
|
||||
index 3347157..b2581da 100644
|
||||
--- a/src/mesa/drivers/dri/i965/brw_eu_emit.c
|
||||
+++ b/src/mesa/drivers/dri/i965/brw_eu_emit.c
|
||||
@@ -2188,7 +2188,7 @@ void brw_fb_WRITE(struct brw_compile *p,
|
||||
msg_type,
|
||||
msg_length,
|
||||
header_present,
|
||||
- 1, /* last render target write */
|
||||
+ eot, /* last render target write */
|
||||
response_length,
|
||||
eot,
|
||||
0 /* send_commit_msg */);
|
||||
diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
|
||||
index a2959a8..4b27e06 100644
|
||||
--- a/src/mesa/main/bufferobj.c
|
||||
+++ b/src/mesa/main/bufferobj.c
|
||||
@@ -1159,17 +1159,17 @@ _mesa_GetBufferParameterivARB(GLenum target, GLenum pname, GLint *params)
|
||||
*params = _mesa_bufferobj_mapped(bufObj);
|
||||
return;
|
||||
case GL_BUFFER_ACCESS_FLAGS:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = bufObj->AccessFlags;
|
||||
return;
|
||||
case GL_BUFFER_MAP_OFFSET:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = (GLint) bufObj->Offset;
|
||||
return;
|
||||
case GL_BUFFER_MAP_LENGTH:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = (GLint) bufObj->Length;
|
||||
return;
|
||||
@@ -1210,7 +1210,7 @@ _mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
|
||||
*params = simplified_access_mode(bufObj->AccessFlags);
|
||||
return;
|
||||
case GL_BUFFER_ACCESS_FLAGS:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = bufObj->AccessFlags;
|
||||
return;
|
||||
@@ -1218,12 +1218,12 @@ _mesa_GetBufferParameteri64v(GLenum target, GLenum pname, GLint64 *params)
|
||||
*params = _mesa_bufferobj_mapped(bufObj);
|
||||
return;
|
||||
case GL_BUFFER_MAP_OFFSET:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = bufObj->Offset;
|
||||
return;
|
||||
case GL_BUFFER_MAP_LENGTH:
|
||||
- if (ctx->VersionMajor < 3)
|
||||
+ if (!ctx->Extensions.ARB_map_buffer_range)
|
||||
goto invalid_pname;
|
||||
*params = bufObj->Length;
|
||||
return;
|
1447
mesa-8.0.4-git.patch
Normal file
1447
mesa-8.0.4-git.patch
Normal file
File diff suppressed because it is too large
Load Diff
62
mesa.spec
62
mesa.spec
@ -1,5 +1,5 @@
|
||||
%if 0%{?rhel}
|
||||
%define rhel_no_hw_arches ppc ppc64
|
||||
%define rhel_no_hw_arches ppc ppc64 ppc64p7
|
||||
%endif
|
||||
|
||||
# S390 doesn't have video cards, but we need swrast for xserver's GLX
|
||||
@ -7,13 +7,19 @@
|
||||
%define with_hardware 0
|
||||
%define dri_drivers --with-dri-drivers=swrast
|
||||
%else
|
||||
# llvm is a joke on non-x86
|
||||
%ifarch %{ix86} x86_64
|
||||
%define with_llvm 1
|
||||
%endif
|
||||
%define with_hardware 1
|
||||
%define base_drivers nouveau,radeon,r200
|
||||
%ifarch %{ix86}
|
||||
%define ix86_drivers ,i915,i965
|
||||
%define with_vmware 1
|
||||
%endif
|
||||
%ifarch x86_64
|
||||
%define amd64_drivers ,i915,i965
|
||||
%define with_vmware 1
|
||||
%endif
|
||||
%ifarch ia64
|
||||
%define ia64_drivers ,i915
|
||||
@ -29,8 +35,8 @@
|
||||
|
||||
Summary: Mesa graphics libraries
|
||||
Name: mesa
|
||||
Version: 8.0.2
|
||||
Release: 3%{?dist}
|
||||
Version: 8.0.4
|
||||
Release: 1%{?dist}
|
||||
License: MIT
|
||||
Group: System Environment/Libraries
|
||||
URL: http://www.mesa3d.org
|
||||
@ -45,9 +51,10 @@ Source3: make-git-snapshot.sh
|
||||
#Patch7: mesa-7.1-link-shared.patch
|
||||
Patch8: mesa-7.10-llvmcore.patch
|
||||
Patch9: mesa-8.0-llvmpipe-shmget.patch
|
||||
Patch10: 0001-intel-fix-null-dereference-processing-HiZ-buffer.patch
|
||||
Patch11: mesa-8.0-nouveau-tfp-blacklist.patch
|
||||
Patch12: mesa-8.0.1-fix-16bpp.patch
|
||||
Patch13: mesa-8.0-nouveau-vieux-nvfx-lowmem.patch
|
||||
Patch14: mesa-8.0-nouveau-vieux-finish.patch
|
||||
Patch15: mesa-8.0.4-git.patch
|
||||
|
||||
BuildRequires: pkgconfig autoconf automake libtool
|
||||
%if %{with_hardware}
|
||||
@ -68,8 +75,10 @@ BuildRequires: libXmu-devel
|
||||
BuildRequires: elfutils
|
||||
BuildRequires: python
|
||||
%if %{with_hardware}
|
||||
%if 0%{?with_llvm}
|
||||
BuildRequires: llvm-devel >= 3.0
|
||||
%endif
|
||||
%endif
|
||||
BuildRequires: libxml2-python
|
||||
BuildRequires: libudev-devel
|
||||
BuildRequires: libtalloc-devel
|
||||
@ -246,6 +255,7 @@ Provides: libwayland-egl-devel
|
||||
%description libwayland-egl-devel
|
||||
Mesa libwayland-egl development package
|
||||
|
||||
%if 0%{?with_vmware}
|
||||
%package libxatracker
|
||||
Summary: Mesa XA state tracker for vmware
|
||||
Group: System Environment/Libraries
|
||||
@ -264,6 +274,7 @@ Provides: libxatracker-devel
|
||||
|
||||
%description libxatracker-devel
|
||||
Mesa XA state tracker development package
|
||||
%endif
|
||||
|
||||
%package libglapi
|
||||
Summary: Mesa shared glapi
|
||||
@ -280,9 +291,10 @@ Mesa shared glapi
|
||||
#patch7 -p1 -b .dricore
|
||||
%patch8 -p1 -b .llvmcore
|
||||
%patch9 -p1 -b .shmget
|
||||
%patch10 -p1 -b .intel-hiz-fix
|
||||
%patch11 -p1 -b .nouveau
|
||||
%patch12 -p1 -b .16bpp
|
||||
%patch13 -p1 -b .nouveau-lowmem
|
||||
%patch14 -p1 -b .nouveau-finish
|
||||
%patch15 -p1 -b .git
|
||||
|
||||
%build
|
||||
|
||||
@ -313,9 +325,9 @@ export CXXFLAGS="$RPM_OPT_FLAGS"
|
||||
--enable-shared-glapi \
|
||||
--enable-gbm \
|
||||
%if %{with_hardware}
|
||||
--with-gallium-drivers=svga,r300,r600,nouveau,swrast \
|
||||
--enable-gallium-llvm \
|
||||
--enable-xa \
|
||||
--with-gallium-drivers=%{?with_vmware:svga,}r300,r600,nouveau,swrast \
|
||||
%{?with_llvm:--enable-gallium-llvm} \
|
||||
%{?with_vmware:--enable-xa} \
|
||||
%else
|
||||
--disable-gallium-llvm \
|
||||
--with-gallium-drivers=swrast \
|
||||
@ -434,8 +446,10 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%endif
|
||||
%{_libdir}/dri/nouveau_dri.so
|
||||
%{_libdir}/dri/nouveau_vieux_dri.so
|
||||
%if 0%{?with_vmware}
|
||||
%{_libdir}/dri/vmwgfx_dri.so
|
||||
%endif
|
||||
%endif
|
||||
%{_libdir}/dri/swrast_dri.so
|
||||
|
||||
%files -n khrplatform-devel
|
||||
@ -535,6 +549,7 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%{_libdir}/libwayland-egl.so
|
||||
%{_libdir}/pkgconfig/wayland-egl.pc
|
||||
|
||||
%if 0%{?with_vmware}
|
||||
%files libxatracker
|
||||
%defattr(-,root,root,-)
|
||||
%doc docs/COPYING
|
||||
@ -552,8 +567,35 @@ rm -rf $RPM_BUILD_ROOT
|
||||
%{_includedir}/xa_context.h
|
||||
%{_libdir}/pkgconfig/xatracker.pc
|
||||
%endif
|
||||
%endif
|
||||
|
||||
%changelog
|
||||
* Wed Sep 19 2012 Dave Airlie <airlied@redhat.com> 8.0.4-1
|
||||
- rebase to 8.0.4 release + 8.0 branch fixes
|
||||
|
||||
* Mon Jun 25 2012 Adam Jackson <ajax@redhat.com> 8.0.3-3
|
||||
- mesa-8.0.3-git.patch: Sync with 8.0 branch.
|
||||
|
||||
* Thu Jun 07 2012 Adam Jackson <ajax@redhat.com> 8.0.3-2
|
||||
- Disable llvm on non-x86 (#829202)
|
||||
|
||||
* Wed May 23 2012 Adam Jackson <ajax@redhat.com> 8.0.3-1
|
||||
- Mesa 8.0.3
|
||||
- 0001-intel-fix-null-dereference-processing-HiZ-buffer.patch: Drop, merged.
|
||||
|
||||
* Fri May 15 2012 Ben Skeggs <bskeggs@redhat.com> 8.0.2-8
|
||||
- nouveau: add back a missing hunk from a previous patch
|
||||
|
||||
* Fri May 11 2012 Ben Skeggs <bskeggs@redhat.com> 8.0.2-7
|
||||
- nouveau: fix shell lag on <=nv2x chipsets, and hack around low-vram issues
|
||||
|
||||
* Wed May 09 2012 Karsten Hopp <karsten@redhat.com> 8.0.2-6
|
||||
- revert disabling of hardware drivers, disable only llvm on PPC*
|
||||
(#819060)
|
||||
|
||||
* Thu Apr 26 2012 Adam Jackson <ajax@redhat.com> 8.0.2-4
|
||||
- Don't build vmware stuff on PPC (#815444)
|
||||
|
||||
* Tue Apr 10 2012 Adam Jackson <ajax@redhat.com> 8.0.2-3
|
||||
- Require newer libX11 on F17+
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user