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.

MD5 checksums

-tdb
+4855c2d93bd2ebd43f384bdcc92c9a27  MesaLib-8.0.1.tar.gz
+24eeebf66971809d8f40775a379b36c9  MesaLib-8.0.1.tar.bz2
+54e745d14dac5717f7f65b4e2d5c1df2  MesaLib-8.0.1.zip
 

New features

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;