Mesa (master): freedreno/ir3: add debug flag to disable cp

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 4f17e026bb99c173444ff5ca7d0b782ed89ee604
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4f17e026bb99c173444ff5ca7d0b782ed89ee604

Author: Rob Clark robcl...@freedesktop.org
Date:   Sun Oct 19 14:55:32 2014 -0400

freedreno/ir3: add debug flag to disable cp

FD_MESA_DEBUG=nocp will disable copy propagation pass.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/freedreno_screen.c |1 +
 src/gallium/drivers/freedreno/freedreno_util.h   |1 +
 src/gallium/drivers/freedreno/ir3/ir3_cmdline.c  |7 +++
 src/gallium/drivers/freedreno/ir3/ir3_compiler.c |2 +-
 4 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index bc6ff78..ddc7302 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -70,6 +70,7 @@ static const struct debug_named_value debug_options[] = {
{optmsgs,   FD_DBG_OPTMSGS,Enable optimizater debug 
messages},
{optdump,   FD_DBG_OPTDUMP,Dump shader DAG to .dot files},
{glsl130,   FD_DBG_GLSL130,Temporary flag to enable GLSL 130 
on a3xx+},
+   {nocp,  FD_DBG_NOCP,   Disable copy-propagation},
DEBUG_NAMED_VALUE_END
 };
 
diff --git a/src/gallium/drivers/freedreno/freedreno_util.h 
b/src/gallium/drivers/freedreno/freedreno_util.h
index f1a1e6e..36a5995 100644
--- a/src/gallium/drivers/freedreno/freedreno_util.h
+++ b/src/gallium/drivers/freedreno/freedreno_util.h
@@ -66,6 +66,7 @@ enum adreno_stencil_op fd_stencil_op(unsigned op);
 #define FD_DBG_OPTMSGS  0x0400
 #define FD_DBG_OPTDUMP  0x0800
 #define FD_DBG_GLSL130  0x1000
+#define FD_DBG_NOCP 0x2000
 
 extern int fd_mesa_debug;
 extern bool fd_binning_enabled;
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c 
b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
index 86239b4..652ec16 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_cmdline.c
@@ -133,6 +133,7 @@ static void print_usage(void)
printf(--saturate-s MASK - bitmask of samplers to saturate S 
coord\n);
printf(--saturate-t MASK - bitmask of samplers to saturate T 
coord\n);
printf(--saturate-r MASK - bitmask of samplers to saturate R 
coord\n);
+   printf(--nocp- disable copy propagation\n);
printf(--help- show this message\n);
 }
 
@@ -199,6 +200,12 @@ int main(int argc, char **argv)
continue;
}
 
+   if (!strcmp(argv[n], --nocp)) {
+   fd_mesa_debug |= FD_DBG_NOCP;
+   n++;
+   continue;
+   }
+
if (!strcmp(argv[n], --help)) {
print_usage();
return 0;
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c 
b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
index dc4f985..233f174 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
@@ -3175,7 +3175,7 @@ ir3_compile_shader(struct ir3_shader_variant *so,
ir3_dump_instr_list(block-head);
}
 
-   if (cp)
+   if (cp  !(fd_mesa_debug  FD_DBG_NOCP))
ir3_block_cp(block);
 
if (fd_mesa_debug  FD_DBG_OPTDUMP)

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/a3xx: disable early-z when we have kill's

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 3fcb0212018e52c374f937e806abeca07e938d28
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3fcb0212018e52c374f937e806abeca07e938d28

Author: Rob Clark robcl...@freedesktop.org
Date:   Sat Oct 18 16:52:44 2014 -0400

freedreno/a3xx: disable early-z when we have kill's

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a3xx/fd3_emit.c|3 +++
 src/gallium/drivers/freedreno/ir3/ir3_compiler.c |4 
 src/gallium/drivers/freedreno/ir3/ir3_shader.h   |3 +++
 3 files changed, 10 insertions(+)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 8300a55..5bf41b1 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -454,6 +454,9 @@ fd3_emit_state(struct fd_context *ctx, struct fd_ringbuffer 
*ring,
val |= A3XX_RB_DEPTH_CONTROL_FRAG_WRITES_Z;
val |= A3XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE;
}
+   if (fp-has_kill) {
+   val |= A3XX_RB_DEPTH_CONTROL_EARLY_Z_DISABLE;
+   }
OUT_PKT0(ring, REG_A3XX_RB_DEPTH_CONTROL, 1);
OUT_RING(ring, val);
}
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c 
b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
index 8c4ec88..dc4f985 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_compiler.c
@@ -2047,6 +2047,8 @@ trans_kill(const struct instr_translater *t,
ir3_reg_create(instr, 0, IR3_REG_SSA)-instr = cond;
 
ctx-kill[ctx-kill_count++] = instr;
+
+   ctx-so-has_kill = true;
 }
 
 /*
@@ -2081,6 +2083,8 @@ trans_killif(const struct instr_translater *t,
 
ctx-kill[ctx-kill_count++] = instr;
 
+   ctx-so-has_kill = true;
+
 }
 /*
  * I2F / U2F / F2I / F2U
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_shader.h 
b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
index 628c09e..a26dab2 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_shader.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3_shader.h
@@ -171,6 +171,9 @@ struct ir3_shader_variant {
/* do we have one or more texture sample instructions: */
bool has_samp;
 
+   /* do we have kill instructions: */
+   bool has_kill;
+
/* const reg # of first immediate, ie. 1 == c1
 * (not regid, because TGSI thinks in terms of vec4 registers,
 * not scalar registers)

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/a3xx: more layer/level fixes

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 74069e324e559a9361ebe631d1b819ff6e675c8f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=74069e324e559a9361ebe631d1b819ff6e675c8f

Author: Rob Clark robcl...@freedesktop.org
Date:   Wed Oct 15 17:15:06 2014 -0400

freedreno/a3xx: more layer/level fixes

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a3xx/fd3_emit.c  |9 +++--
 src/gallium/drivers/freedreno/a3xx/fd3_gmem.c  |7 +--
 src/gallium/drivers/freedreno/freedreno_resource.c |6 ++
 3 files changed, 14 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 050530e..0439dc7 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -282,8 +282,13 @@ void
 fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, struct pipe_surface 
*psurf)
 {
struct fd_resource *rsc = fd_resource(psurf-texture);
+   unsigned lvl = psurf-u.tex.level;
+   struct fd_resource_slice *slice = rsc-slices[lvl];
+   uint32_t layer_offset = slice-size0 * psurf-u.tex.first_layer;
enum pipe_format format = fd3_gmem_restore_format(psurf-format);
 
+   debug_assert(psurf-u.tex.first_layer == psurf-u.tex.last_layer);
+
/* output sampler state: */
OUT_PKT3(ring, CP_LOAD_STATE, 4);
OUT_RING(ring, CP_LOAD_STATE_0_DST_OFF(FRAG_TEX_OFF) |
@@ -314,7 +319,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, 
struct pipe_surface *psurf
OUT_RING(ring, A3XX_TEX_CONST_1_FETCHSIZE(TFETCH_DISABLE) |
A3XX_TEX_CONST_1_WIDTH(psurf-width) |
A3XX_TEX_CONST_1_HEIGHT(psurf-height));
-   OUT_RING(ring, A3XX_TEX_CONST_2_PITCH(rsc-slices[0].pitch * rsc-cpp) |
+   OUT_RING(ring, A3XX_TEX_CONST_2_PITCH(slice-pitch * rsc-cpp) |
A3XX_TEX_CONST_2_INDX(0));
OUT_RING(ring, 0x);
 
@@ -326,7 +331,7 @@ fd3_emit_gmem_restore_tex(struct fd_ringbuffer *ring, 
struct pipe_surface *psurf
CP_LOAD_STATE_0_NUM_UNIT(1));
OUT_RING(ring, CP_LOAD_STATE_1_STATE_TYPE(ST_CONSTANTS) |
CP_LOAD_STATE_1_EXT_SRC_ADDR(0));
-   OUT_RELOC(ring, rsc-bo, 0, 0, 0);
+   OUT_RELOC(ring, rsc-bo, layer_offset, 0, 0);
 }
 
 void
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
index 219c9e0..2eefa91 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
@@ -609,8 +609,11 @@ fd3_emit_sysmem_prep(struct fd_context *ctx)
struct fd_ringbuffer *ring = ctx-ring;
uint32_t pitch = 0;
 
-   if (pfb-cbufs[0])
-   pitch = fd_resource(pfb-cbufs[0]-texture)-slices[0].pitch;
+   if (pfb-cbufs[0]) {
+   struct pipe_surface *psurf = pfb-cbufs[0];
+   unsigned lvl = psurf-u.tex.level;
+   pitch = fd_resource(psurf-texture)-slices[lvl].pitch;
+   }
 
fd3_emit_restore(ctx);
 
diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c 
b/src/gallium/drivers/freedreno/freedreno_resource.c
index b6b39f0..49ae517 100644
--- a/src/gallium/drivers/freedreno/freedreno_resource.c
+++ b/src/gallium/drivers/freedreno/freedreno_resource.c
@@ -199,9 +199,8 @@ setup_slices(struct fd_resource *rsc)
 
for (level = 0; level = prsc-last_level; level++) {
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
-   uint32_t aligned_width = align(width, 32);
 
-   slice-pitch = aligned_width;
+   slice-pitch = align(width, 32);
slice-offset = size;
slice-size0 = slice-pitch * height * rsc-cpp;
 
@@ -229,9 +228,8 @@ setup_slices_array(struct fd_resource *rsc)
 
for (level = 0; level = prsc-last_level; level++) {
struct fd_resource_slice *slice = fd_resource_slice(rsc, level);
-   uint32_t aligned_width = align(width, 32);
 
-   slice-pitch = aligned_width;
+   slice-pitch = align(width, 32);
slice-offset = size;
slice-size0 = align(slice-pitch * height * rsc-cpp, 4096);
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/a3xx: only emit dirty consts

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 94bb33617d1e8978dc52b8aaa4eb41bfb6703f79
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=94bb33617d1e8978dc52b8aaa4eb41bfb6703f79

Author: Rob Clark robcl...@freedesktop.org
Date:   Fri Oct 17 08:57:16 2014 -0400

freedreno/a3xx: only emit dirty consts

If app only updates (for example) vertex uniforms, it would be nice to
only re-emit those and not also frag uniforms.  Means we need to mark
the first frag shader const buffer dirty after a clear.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a3xx/fd3_draw.c |   10 +-
 src/gallium/drivers/freedreno/a3xx/fd3_emit.c |4 
 2 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index 7cc24e5..e168d97 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -136,14 +136,21 @@ fd3_draw(struct fd_context *ctx, const struct 
pipe_draw_info *info)
},
.rasterflat = ctx-rasterizer  ctx-rasterizer-flatshade,
};
-   unsigned dirty;
+   uint32_t dirty, vconst;
 
fixup_shader_state(ctx, emit.key);
 
+   /* save/restore vertex const state too, so that vertex
+* shader consts also get emitted for render pass:
+*/
+   vconst = ctx-constbuf[PIPE_SHADER_VERTEX].dirty_mask;
+
dirty = ctx-dirty;
emit.dirty = dirty  ~(FD_DIRTY_BLEND);
draw_impl(ctx, ctx-binning_ring, emit);
 
+   ctx-constbuf[PIPE_SHADER_VERTEX].dirty_mask = vconst;
+
/* and now regular (non-binning) pass: */
emit.key.binning_pass = false;
emit.dirty = dirty;
@@ -312,6 +319,7 @@ fd3_clear(struct fd_context *ctx, unsigned buffers,
 
fd3_emit_vertex_bufs(ring, emit);
 
+   ctx-constbuf[PIPE_SHADER_FRAGMENT].dirty_mask = ~0;
fd3_emit_constant(ring, SB_FRAG_SHADER, 0, 0, 4, color-ui, NULL);
 
OUT_PKT0(ring, REG_A3XX_PC_PRIM_VTX_CNTL, 1);
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
index 0439dc7..8300a55 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_emit.c
@@ -93,10 +93,6 @@ emit_constants(struct fd_ringbuffer *ring,
uint32_t first_immediate;
uint32_t base = 0;
 
-   // XXX TODO only emit dirty consts.. but we need to keep track if
-   // they are clobbered by a clear, gmem2mem, or mem2gmem..
-   constbuf-dirty_mask = enabled_mask;
-
/* in particular, with binning shader we may end up with unused
 * consts, ie. we could end up w/ constlen that is smaller
 * than first_immediate.  In that case truncate the user consts

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/ir3: comment + better fxn name

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: ab33a240890a7ef147d4b8cf35c27ae1932a1dbe
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ab33a240890a7ef147d4b8cf35c27ae1932a1dbe

Author: Rob Clark robcl...@freedesktop.org
Date:   Sat Oct 18 14:46:35 2014 -0400

freedreno/ir3: comment + better fxn name

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/ir3/ir3_sched.c |8 +---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3_sched.c 
b/src/gallium/drivers/freedreno/ir3/ir3_sched.c
index cf09cea..24d7c63 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_sched.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_sched.c
@@ -162,7 +162,8 @@ static void schedule(struct ir3_sched_ctx *ctx,
  * Delay-slot calculation.  Follows fanin/fanout.
  */
 
-static unsigned delay_calc2(struct ir3_sched_ctx *ctx,
+/* calculate delay for specified src: */
+static unsigned delay_calc_srcn(struct ir3_sched_ctx *ctx,
struct ir3_instruction *assigner,
struct ir3_instruction *consumer, unsigned srcn)
 {
@@ -173,7 +174,7 @@ static unsigned delay_calc2(struct ir3_sched_ctx *ctx,
for (i = 1; i  assigner-regs_count; i++) {
struct ir3_register *reg = assigner-regs[i];
if (reg-flags  IR3_REG_SSA) {
-   unsigned d = delay_calc2(ctx, reg-instr,
+   unsigned d = delay_calc_srcn(ctx, reg-instr,
consumer, srcn);
delay = MAX2(delay, d);
}
@@ -186,6 +187,7 @@ static unsigned delay_calc2(struct ir3_sched_ctx *ctx,
return delay;
 }
 
+/* calculate delay for instruction (maximum of delay for all srcs): */
 static unsigned delay_calc(struct ir3_sched_ctx *ctx,
struct ir3_instruction *instr)
 {
@@ -194,7 +196,7 @@ static unsigned delay_calc(struct ir3_sched_ctx *ctx,
for (i = 1; i  instr-regs_count; i++) {
struct ir3_register *reg = instr-regs[i];
if (reg-flags  IR3_REG_SSA) {
-   unsigned d = delay_calc2(ctx, reg-instr,
+   unsigned d = delay_calc_srcn(ctx, reg-instr,
instr, i - 1);
delay = MAX2(delay, d);
}

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno: positions come out as integers, not half-integers

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: f0ca26725e48e6d85a9e2749caaf122e7bb8d6e6
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f0ca26725e48e6d85a9e2749caaf122e7bb8d6e6

Author: Ilia Mirkin imir...@alum.mit.edu
Date:   Fri Oct  3 16:23:19 2014 -0400

freedreno: positions come out as integers, not half-integers

Signed-off-by: Ilia Mirkin imir...@alum.mit.edu
Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/freedreno_screen.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index 24f360b..bc6ff78 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -161,7 +161,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR:
case PIPE_CAP_MIXED_COLORBUFFER_FORMATS:
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT:
-   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
+   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
case PIPE_CAP_SEAMLESS_CUBE_MAP:
case PIPE_CAP_VERTEX_COLOR_UNCLAMPED:
case PIPE_CAP_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION:
@@ -205,7 +205,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_DEPTH_CLIP_DISABLE:
case PIPE_CAP_SEAMLESS_CUBE_MAP_PER_TEXTURE:
case PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT:
-   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER:
+   case PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER:
case PIPE_CAP_TGSI_CAN_COMPACT_CONSTANTS:
case PIPE_CAP_FRAGMENT_COLOR_CLAMPED:
case PIPE_CAP_VERTEX_COLOR_CLAMPED:

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/ir3: fix potential gpu lockup with kill

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 8a0ffedd8de51eaf980855283c4525dba6dc5847
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8a0ffedd8de51eaf980855283c4525dba6dc5847

Author: Rob Clark robcl...@freedesktop.org
Date:   Sat Oct 18 15:28:16 2014 -0400

freedreno/ir3: fix potential gpu lockup with kill

It seems like the hardware is unhappy if we execute a kill instruction
prior to last input (ei).  Probably the shader thread stops executing
and the end-input flag is never set.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/ir3/ir3.c   |   11 +++
 src/gallium/drivers/freedreno/ir3/ir3.h   |   10 ++
 src/gallium/drivers/freedreno/ir3/ir3_depth.c |   16 +--
 src/gallium/drivers/freedreno/ir3/ir3_sched.c |   26 +
 4 files changed, 61 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/freedreno/ir3/ir3.c 
b/src/gallium/drivers/freedreno/ir3/ir3.c
index 70d37ff..60d4e4a 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3.c
@@ -81,6 +81,8 @@ void ir3_destroy(struct ir3 *shader)
shader-chunk = chunk-next;
free(chunk);
}
+   free(shader-instrs);
+   free(shader-baryfs);
free(shader);
 }
 
@@ -596,6 +598,15 @@ static void insert_instr(struct ir3 *shader,
shader-instrs_sz * sizeof(shader-instrs[0]));
}
shader-instrs[shader-instrs_count++] = instr;
+
+   if (is_input(instr)) {
+   if (shader-baryfs_count == shader-baryfs_sz) {
+   shader-baryfs_sz = MAX2(2 * shader-baryfs_sz, 16);
+   shader-baryfs = realloc(shader-baryfs,
+   shader-baryfs_sz * 
sizeof(shader-baryfs[0]));
+   }
+   shader-baryfs[shader-baryfs_count++] = instr;
+   }
 }
 
 struct ir3_block * ir3_block_create(struct ir3 *shader,
diff --git a/src/gallium/drivers/freedreno/ir3/ir3.h 
b/src/gallium/drivers/freedreno/ir3/ir3.h
index d2d3dca..21992f6 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3.h
+++ b/src/gallium/drivers/freedreno/ir3/ir3.h
@@ -210,7 +210,11 @@ struct ir3_instruction {
 * result of moving a const to a reg would have a low cost,  so 
to
 * it could make sense to duplicate the instruction at various
 * points where the result is needed to reduce register 
footprint.
+*
+* DEPTH_UNUSED used to mark unused instructions after depth
+* calculation pass.
 */
+#define DEPTH_UNUSED  ~0
unsigned depth;
};
struct ir3_instruction *next;
@@ -224,6 +228,8 @@ struct ir3_heap_chunk;
 struct ir3 {
unsigned instrs_count, instrs_sz;
struct ir3_instruction **instrs;
+   unsigned baryfs_count, baryfs_sz;
+   struct ir3_instruction **baryfs;
unsigned heap_idx;
struct ir3_heap_chunk *chunk;
 };
@@ -272,6 +278,10 @@ static inline void ir3_clear_mark(struct ir3 *shader)
/* TODO would be nice to drop the instruction array.. for
 * new compiler, _clear_mark() is all we use it for, and
 * we could probably manage a linked list instead..
+*
+* Also, we'll probably want to mark instructions within
+* a block, so tracking the list of instrs globally is
+* unlikely to be what we want.
 */
unsigned i;
for (i = 0; i  shader-instrs_count; i++) {
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_depth.c 
b/src/gallium/drivers/freedreno/ir3/ir3_depth.c
index dcc0362..76413d4 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_depth.c
+++ b/src/gallium/drivers/freedreno/ir3/ir3_depth.c
@@ -150,10 +150,22 @@ void ir3_block_depth(struct ir3_block *block)
if (block-outputs[i])
ir3_instr_depth(block-outputs[i]);
 
-   /* at this point, any unvisited input is unused: */
+   /* mark un-used instructions: */
+   for (i = 0; i  block-shader-instrs_count; i++) {
+   struct ir3_instruction *instr = block-shader-instrs[i];
+
+   /* just consider instructions within this block: */
+   if (instr-block != block)
+   continue;
+
+   if (!ir3_instr_check_mark(instr))
+   instr-depth = DEPTH_UNUSED;
+   }
+
+   /* cleanup unused inputs: */
for (i = 0; i  block-ninputs; i++) {
struct ir3_instruction *in = block-inputs[i];
-   if (in  !ir3_instr_check_mark(in))
+   if (in  (in-depth == DEPTH_UNUSED))
block-inputs[i] = NULL;
}
 }
diff --git a/src/gallium/drivers/freedreno/ir3/ir3_sched.c 
b/src/gallium/drivers/freedreno/ir3/ir3_sched.c
index 24d7c63..b2ef811 100644
--- a/src/gallium/drivers/freedreno/ir3/ir3_sched.c
+++ 

Mesa (master): vc4: Don' t look at back stencil state unless two-sided stencil is enabled.

2014-10-21 Thread Eric Anholt
Module: Mesa
Branch: master
Commit: 48f6351940ff62c29fff618cec722e845acc86d5
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=48f6351940ff62c29fff618cec722e845acc86d5

Author: Eric Anholt e...@anholt.net
Date:   Mon Oct 20 22:53:07 2014 +0100

vc4: Don't look at back stencil state unless two-sided stencil is enabled.

Fixes regressions in the next bugfix, because gallium util stuff leaves
the back stencil state as 0 if !back-enabled.

---

 src/gallium/drivers/vc4/vc4_state.c |8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_state.c 
b/src/gallium/drivers/vc4/vc4_state.c
index 31f2424..99b5b3c 100644
--- a/src/gallium/drivers/vc4/vc4_state.c
+++ b/src/gallium/drivers/vc4/vc4_state.c
@@ -203,12 +203,16 @@ vc4_create_depth_stencil_alpha_state(struct pipe_context 
*pctx,
 
 uint8_t front_writemask_bits =
 tlb_stencil_setup_writemask(front-writemask);
-uint8_t back_writemask_bits =
-tlb_stencil_setup_writemask(back-writemask);
+uint8_t back_writemask = front-writemask;
+uint8_t back_writemask_bits = front_writemask_bits;
 
 so-stencil_uniforms[0] =
 tlb_stencil_setup_bits(front, front_writemask_bits);
 if (back-enabled) {
+back_writemask = back-writemask;
+back_writemask_bits =
+tlb_stencil_setup_writemask(back-writemask);
+
 so-stencil_uniforms[0] |= (1  30);
 so-stencil_uniforms[1] =
 tlb_stencil_setup_bits(back, 
back_writemask_bits);

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): vc4: Fix stencil writemask handling.

2014-10-21 Thread Eric Anholt
Module: Mesa
Branch: master
Commit: cc298023c9b302a7a24ee01fe2da1c93f5b44666
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=cc298023c9b302a7a24ee01fe2da1c93f5b44666

Author: Eric Anholt e...@anholt.net
Date:   Mon Oct 20 21:14:57 2014 +0100

vc4: Fix stencil writemask handling.

If the writemask doesn't compress, then we want to put in the uncompressed
writemask, not the compressed writemask failure value (all-on).

Fixes glean's stencil2 and fbo-clear-formats on stencil.

---

 src/gallium/drivers/vc4/vc4_state.c |4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_state.c 
b/src/gallium/drivers/vc4/vc4_state.c
index 99b5b3c..73d 100644
--- a/src/gallium/drivers/vc4/vc4_state.c
+++ b/src/gallium/drivers/vc4/vc4_state.c
@@ -223,8 +223,8 @@ vc4_create_depth_stencil_alpha_state(struct pipe_context 
*pctx,
 
 if (front_writemask_bits == 0xff ||
 back_writemask_bits == 0xff) {
-so-stencil_uniforms[2] = (front_writemask_bits |
-   (back_writemask_bits  8));
+so-stencil_uniforms[2] = (front-writemask |
+   (back_writemask  8));
 }
 }
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): vc4: Fix SRC_ALPHA_SATURATE blending.

2014-10-21 Thread Eric Anholt
Module: Mesa
Branch: master
Commit: ef280c95f2623357452f5ca8e65367b7ac30699f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ef280c95f2623357452f5ca8e65367b7ac30699f

Author: Eric Anholt e...@anholt.net
Date:   Tue Oct 21 15:46:48 2014 +0100

vc4: Fix SRC_ALPHA_SATURATE blending.

Fixes glean blendFunc.

---

 src/gallium/drivers/vc4/vc4_program.c |   14 +++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/vc4/vc4_program.c 
b/src/gallium/drivers/vc4/vc4_program.c
index 7a2a975..c6d9fb3 100644
--- a/src/gallium/drivers/vc4/vc4_program.c
+++ b/src/gallium/drivers/vc4/vc4_program.c
@@ -1308,9 +1308,17 @@ vc4_blend_channel(struct vc4_compile *c,
 case PIPE_BLENDFACTOR_DST_COLOR:
 return qir_FMUL(c, val, dst[channel]);
 case PIPE_BLENDFACTOR_SRC_ALPHA_SATURATE:
-return qir_FMIN(c, src[3], qir_FSUB(c,
-qir_uniform_f(c, 1.0),
-dst[3]));
+if (channel != 3) {
+return qir_FMUL(c,
+val,
+qir_FMIN(c,
+ src[3],
+ qir_FSUB(c,
+  qir_uniform_f(c, 
1.0),
+  dst[3])));
+} else {
+return val;
+}
 case PIPE_BLENDFACTOR_CONST_COLOR:
 return qir_FMUL(c, val,
 get_temp_for_uniform(c,

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Demos (master): cmake: Define HAVE_FREEGLUT when glutInitContextProfile symbol is present.

2014-10-21 Thread Jose Fonseca
Module: Demos
Branch: master
Commit: d01490215409f0bea1a159cb1375ba6bd04d
URL:
http://cgit.freedesktop.org/mesa/demos/commit/?id=d01490215409f0bea1a159cb1375ba6bd04d

Author: José Fonseca jose.r.fons...@gmail.com
Date:   Tue Oct 21 20:26:04 2014 +0100

cmake: Define HAVE_FREEGLUT when glutInitContextProfile symbol is present.

Just like the configure.ac does.

Trivial.

---

 CMakeLists.txt |9 +
 1 file changed, 9 insertions(+)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 88a8b88..c3e217f 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -4,6 +4,7 @@ project (mesademos)
 
 include (FindPkgConfig)
 include (CheckCCompilerFlag)
+include (CheckSymbolExists)
 
 find_package (OpenGL REQUIRED)
 find_package (GLUT REQUIRED)
@@ -25,6 +26,14 @@ if (PKG_CONFIG_FOUND AND NOT WIN32)
pkg_check_modules (VG vg)
 endif ()
 
+# Check for FreeGLUT 2.6 or later
+set (CMAKE_REQUIRED_INCLUDES ${GLUT_INCLUDE_DIR})
+set (CMAKE_REQUIRED_LIBRARIES ${GLUT_glut_LIBRARY})
+check_symbol_exists (glutInitContextProfile GL/glut.h;GL/freeglut.h 
HAVE_FREEGLUT)
+if (HAVE_FREEGLUT)
+   add_definitions (-DHAVE_FREEGLUT)
+endif ()
+
 if (UNIX)
link_libraries(m)
 endif (UNIX)

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): radeonsi: inline si_pm4_alloc_state

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 139bde061a6968671c7119ce78837f144a169abf
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=139bde061a6968671c7119ce78837f144a169abf

Author: Marek Olšák marek.ol...@amd.com
Date:   Tue Oct 14 17:31:00 2014 +0200

radeonsi: inline si_pm4_alloc_state

It seemed like the function needed a context pointer. Let's remove it
to make it less confusing.

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_pm4.c|5 -
 src/gallium/drivers/radeonsi/si_pm4.h|1 -
 src/gallium/drivers/radeonsi/si_state.c  |   14 +++---
 src/gallium/drivers/radeonsi/si_state_draw.c |   20 ++--
 4 files changed, 17 insertions(+), 23 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_pm4.c 
b/src/gallium/drivers/radeonsi/si_pm4.c
index 0b872b8..954eb6e 100644
--- a/src/gallium/drivers/radeonsi/si_pm4.c
+++ b/src/gallium/drivers/radeonsi/si_pm4.c
@@ -120,11 +120,6 @@ void si_pm4_free_state(struct si_context *sctx,
FREE(state);
 }
 
-struct si_pm4_state * si_pm4_alloc_state(struct si_context *sctx)
-{
-   return CALLOC_STRUCT(si_pm4_state);
-}
-
 unsigned si_pm4_dirty_dw(struct si_context *sctx)
 {
unsigned count = 0;
diff --git a/src/gallium/drivers/radeonsi/si_pm4.h 
b/src/gallium/drivers/radeonsi/si_pm4.h
index f234286..8680a9e 100644
--- a/src/gallium/drivers/radeonsi/si_pm4.h
+++ b/src/gallium/drivers/radeonsi/si_pm4.h
@@ -74,7 +74,6 @@ void si_pm4_add_bo(struct si_pm4_state *state,
 void si_pm4_free_state(struct si_context *sctx,
   struct si_pm4_state *state,
   unsigned idx);
-struct si_pm4_state * si_pm4_alloc_state(struct si_context *sctx);
 
 unsigned si_pm4_dirty_dw(struct si_context *sctx);
 void si_pm4_emit(struct si_context *sctx, struct si_pm4_state *state);
diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 0ef6d97..54151eb 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -225,7 +225,7 @@ static void si_update_fb_blend_state(struct si_context 
*sctx)
if (blend == NULL)
return;
 
-   pm4 = si_pm4_alloc_state(sctx);
+   pm4 = CALLOC_STRUCT(si_pm4_state);
if (pm4 == NULL)
return;
 
@@ -406,7 +406,7 @@ static void si_set_blend_color(struct pipe_context *ctx,
   const struct pipe_blend_color *state)
 {
struct si_context *sctx = (struct si_context *)ctx;
-   struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
+   struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
 
 if (pm4 == NULL)
 return;
@@ -427,7 +427,7 @@ static void si_set_clip_state(struct pipe_context *ctx,
  const struct pipe_clip_state *state)
 {
struct si_context *sctx = (struct si_context *)ctx;
-   struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
+   struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
struct pipe_constant_buffer cb;
 
if (pm4 == NULL)
@@ -530,7 +530,7 @@ static void si_update_fb_rs_state(struct si_context *sctx)
return;
}
 
-   pm4 = si_pm4_alloc_state(sctx);
+   pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
return;
@@ -696,7 +696,7 @@ static void si_delete_rs_state(struct pipe_context *ctx, 
void *state)
  */
 static void si_update_dsa_stencil_ref(struct si_context *sctx)
 {
-   struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
+   struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
struct pipe_stencil_ref *ref = sctx-stencil_ref;
 struct si_state_dsa *dsa = sctx-queued.named.dsa;
 
@@ -2834,7 +2834,7 @@ static void si_set_border_colors(struct si_context *sctx, 
unsigned count,
}
 
if (border_color_table) {
-   struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
+   struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
 
uint64_t va_offset = sctx-border_color_table-gpu_address;
 
@@ -3081,7 +3081,7 @@ void si_init_state_functions(struct si_context *sctx)
 
 void si_init_config(struct si_context *sctx)
 {
-   struct si_pm4_state *pm4 = si_pm4_alloc_state(sctx);
+   struct si_pm4_state *pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
return;
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index f2dc22f..2b27007 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -48,7 +48,7 @@ static void si_shader_es(struct pipe_context *ctx, struct 
si_shader *shader)
uint64_t va;
 
si_pm4_delete_state(sctx, es, shader-pm4);
-   pm4 = shader-pm4 = si_pm4_alloc_state(sctx);
+   pm4 = shader-pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 

Mesa (master): glsl_to_tgsi: use _mesa_copy_linked_program_data

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 013850a1b7d6605e32883f2e93fa3d51cd3eb218
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=013850a1b7d6605e32883f2e93fa3d51cd3eb218

Author: Marek Olšák marek.ol...@amd.com
Date:   Mon Oct  6 21:12:14 2014 +0200

glsl_to_tgsi: use _mesa_copy_linked_program_data

This deduplicates some code.

---

 src/mesa/state_tracker/st_glsl_to_tgsi.cpp |5 +
 1 file changed, 1 insertion(+), 4 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index 21f4cb8..a6ce033 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -5214,6 +5214,7 @@ get_mesa_program(struct gl_context *ctx,
v-have_sqrt = pscreen-get_shader_param(pscreen, ptarget,
 
PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED);
 
+   _mesa_copy_linked_program_data(shader-Stage, shader_program, prog);
_mesa_generate_parameters_list_for_uniforms(shader_program, shader,
   prog-Parameters);
 
@@ -5319,10 +5320,6 @@ get_mesa_program(struct gl_context *ctx,
case GL_GEOMETRY_SHADER:
   stgp = (struct st_geometry_program *)prog;
   stgp-glsl_to_tgsi = v;
-  stgp-Base.InputType = shader_program-Geom.InputType;
-  stgp-Base.OutputType = shader_program-Geom.OutputType;
-  stgp-Base.VerticesOut = shader_program-Geom.VerticesOut;
-  stgp-Base.Invocations = shader_program-Geom.Invocations;
   break;
default:
   assert(!should not be reached);

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): glsl_to_tgsi: fix the value of gl_FrontFacing with native integers

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 9ec305ead7750c7f91c79b043584c1997bacd9a7
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9ec305ead7750c7f91c79b043584c1997bacd9a7

Author: Marek Olšák marek.ol...@amd.com
Date:   Thu Oct 16 16:21:54 2014 +0200

glsl_to_tgsi: fix the value of gl_FrontFacing with native integers

We must convert it to boolean from the DX9 float encoding that Gallium
specifies.

Later, we should probably define that FACE should be 0 or ~0 if native
integers are supported.

Cc: 10.2 10.3 mesa-sta...@lists.freedesktop.org
Reviewed-by: Eric Anholt e...@anholt.net

---

 src/mesa/state_tracker/st_glsl_to_tgsi.cpp |   14 +-
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp 
b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
index a0da9f6..21f4cb8 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -4781,15 +4781,19 @@ emit_wpos(struct st_context *st,
  * saturating the value to [0,1] does the job.
  */
 static void
-emit_face_var(struct st_translate *t)
+emit_face_var(struct gl_context *ctx, struct st_translate *t)
 {
struct ureg_program *ureg = t-ureg;
struct ureg_dst face_temp = ureg_DECL_temporary(ureg);
struct ureg_src face_input = t-inputs[t-inputMapping[VARYING_SLOT_FACE]];
 
-   /* MOV_SAT face_temp, input[face] */
-   face_temp = ureg_saturate(face_temp);
-   ureg_MOV(ureg, face_temp, face_input);
+   if (ctx-Const.NativeIntegers) {
+  ureg_FSGE(ureg, face_temp, face_input, ureg_imm1f(ureg, 0));
+   }
+   else {
+  /* MOV_SAT face_temp, input[face] */
+  ureg_MOV(ureg, ureg_saturate(face_temp), face_input);
+   }
 
/* Use face_temp as face input from here on: */
t-inputs[t-inputMapping[VARYING_SLOT_FACE]] = ureg_src(face_temp);
@@ -4909,7 +4913,7 @@ st_translate_program(
   }
 
   if (proginfo-InputsRead  VARYING_BIT_FACE)
- emit_face_var(t);
+ emit_face_var(ctx, t);
 
   /*
* Declare output attributes.

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): r300g: replace r300_get_num_samples with a util variant

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 22c5886f3f2eabe19fda314b4d69d8075caacaae
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=22c5886f3f2eabe19fda314b4d69d8075caacaae

Author: Marek Olšák marek.ol...@amd.com
Date:   Mon Oct 20 15:41:42 2014 +0200

r300g: replace r300_get_num_samples with a util variant

---

 src/gallium/drivers/r300/r300_state.c |   26 +-
 1 file changed, 1 insertion(+), 25 deletions(-)

diff --git a/src/gallium/drivers/r300/r300_state.c 
b/src/gallium/drivers/r300/r300_state.c
index 7d83576..fd67e35 100644
--- a/src/gallium/drivers/r300/r300_state.c
+++ b/src/gallium/drivers/r300/r300_state.c
@@ -942,30 +942,6 @@ void r300_mark_fb_state_dirty(struct r300_context *r300,
 /* The size of the rest of atoms stays the same. */
 }
 
-static unsigned r300_get_num_samples(struct r300_context *r300)
-{
-struct pipe_framebuffer_state* fb =
-(struct pipe_framebuffer_state*)r300-fb_state.state;
-unsigned i, num_samples;
-
-if (!fb-nr_cbufs  !fb-zsbuf)
-return 1;
-
-num_samples = 6;
-
-for (i = 0; i  fb-nr_cbufs; i++)
-if (fb-cbufs[i])
-num_samples = MIN2(num_samples, fb-cbufs[i]-texture-nr_samples);
-
-if (fb-zsbuf)
-num_samples = MIN2(num_samples, fb-zsbuf-texture-nr_samples);
-
-if (!num_samples)
-num_samples = 1;
-
-return num_samples;
-}
-
 static void
 r300_set_framebuffer_state(struct pipe_context* pipe,
const struct pipe_framebuffer_state* state)
@@ -1073,7 +1049,7 @@ r300_set_framebuffer_state(struct pipe_context* pipe,
 }
 }
 
-r300-num_samples = r300_get_num_samples(r300);
+r300-num_samples = util_framebuffer_get_num_samples(state);
 
 /* Set up AA config. */
 if (r300-num_samples  1) {

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): radeonsi: generate shader pm4 states right after shader compilation

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: b9b0973db206bc3d376781e2d06001f2f48dc865
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=b9b0973db206bc3d376781e2d06001f2f48dc865

Author: Marek Olšák marek.ol...@amd.com
Date:   Tue Oct 14 17:48:52 2014 +0200

radeonsi: generate shader pm4 states right after shader compilation

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_state.c  |1 +
 src/gallium/drivers/radeonsi/si_state.h  |2 ++
 src/gallium/drivers/radeonsi/si_state_draw.c |   38 ++
 3 files changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state.c 
b/src/gallium/drivers/radeonsi/si_state.c
index 54151eb..c845df1 100644
--- a/src/gallium/drivers/radeonsi/si_state.c
+++ b/src/gallium/drivers/radeonsi/si_state.c
@@ -2283,6 +2283,7 @@ int si_shader_select(struct pipe_context *ctx,
FREE(shader);
return r;
}
+   si_shader_init_pm4_state(shader);
sel-num_shaders++;
}
 
diff --git a/src/gallium/drivers/radeonsi/si_state.h 
b/src/gallium/drivers/radeonsi/si_state.h
index f70bddf..4f5140c 100644
--- a/src/gallium/drivers/radeonsi/si_state.h
+++ b/src/gallium/drivers/radeonsi/si_state.h
@@ -31,6 +31,7 @@
 #include radeon/r600_pipe_common.h
 
 struct si_screen;
+struct si_shader;
 
 struct si_state_blend {
struct si_pm4_state pm4;
@@ -270,6 +271,7 @@ unsigned si_tile_mode_index(struct r600_texture *rtex, 
unsigned level, bool sten
 /* si_state_draw.c */
 extern const struct r600_atom si_atom_cache_flush;
 extern const struct r600_atom si_atom_msaa_config;
+void si_shader_init_pm4_state(struct si_shader *shader);
 void si_emit_cache_flush(struct r600_common_context *sctx, struct r600_atom 
*atom);
 void si_draw_vbo(struct pipe_context *ctx, const struct pipe_draw_info *dinfo);
 
diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index eb7ed40..707e234 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -300,6 +300,27 @@ static void si_shader_ps(struct si_shader *shader)
   S_00B02C_USER_SGPR(num_user_sgprs));
 }
 
+void si_shader_init_pm4_state(struct si_shader *shader)
+{
+   switch (shader-selector-type) {
+   case PIPE_SHADER_VERTEX:
+   if (shader-key.vs.as_es)
+   si_shader_es(shader);
+   else
+   si_shader_vs(shader);
+   break;
+   case PIPE_SHADER_GEOMETRY:
+   si_shader_gs(shader);
+   si_shader_vs(shader-gs_copy_shader);
+   break;
+   case PIPE_SHADER_FRAGMENT:
+   si_shader_ps(shader);
+   break;
+   default:
+   assert(0);
+   }
+}
+
 /*
  * Drawing
  */
@@ -598,22 +619,12 @@ static void si_update_derived_state(struct si_context 
*sctx)
 
if (sctx-gs_shader) {
si_shader_select(ctx, sctx-gs_shader);
-
-   if (!sctx-gs_shader-current-pm4) {
-   si_shader_gs(sctx-gs_shader-current);
-   si_shader_vs(sctx-gs_shader-current-gs_copy_shader);
-   }
-
si_pm4_bind_state(sctx, gs, sctx-gs_shader-current-pm4);
si_pm4_bind_state(sctx, vs, 
sctx-gs_shader-current-gs_copy_shader-pm4);
 
sctx-b.streamout.stride_in_dw = sctx-gs_shader-so.stride;
 
si_shader_select(ctx, sctx-vs_shader);
-
-   if (!sctx-vs_shader-current-pm4)
-   si_shader_es(sctx-vs_shader-current);
-
si_pm4_bind_state(sctx, es, sctx-vs_shader-current-pm4);
 
if (!sctx-gs_rings)
@@ -639,10 +650,6 @@ static void si_update_derived_state(struct si_context 
*sctx)
si_pm4_bind_state(sctx, gs_onoff, sctx-gs_on);
} else {
si_shader_select(ctx, sctx-vs_shader);
-
-   if (!sctx-vs_shader-current-pm4)
-   si_shader_vs(sctx-vs_shader-current);
-
si_pm4_bind_state(sctx, vs, sctx-vs_shader-current-pm4);
 
sctx-b.streamout.stride_in_dw = sctx-vs_shader-so.stride;
@@ -671,9 +678,6 @@ static void si_update_derived_state(struct si_context *sctx)
sctx-ps_shader-current = sel-current;
}
 
-   if (!sctx-ps_shader-current-pm4)
-   si_shader_ps(sctx-ps_shader-current);
-
si_pm4_bind_state(sctx, ps, sctx-ps_shader-current-pm4);
 
if (si_pm4_state_changed(sctx, ps) || si_pm4_state_changed(sctx, vs)) {

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): radeonsi: revert hack for random failures in glsl-max-varyings

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: a18f803a860767be3604369d865b6c0df0d15f2a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=a18f803a860767be3604369d865b6c0df0d15f2a

Author: Marek Olšák marek.ol...@amd.com
Date:   Tue Oct 14 22:51:10 2014 +0200

radeonsi: revert hack for random failures in glsl-max-varyings

This reverts commit 032e5548b3d4b5efa52359218725cb8e31b622ad.

I've run glsl-max-varyings 30 times and it always passed.

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_state_draw.c |8 +---
 1 file changed, 1 insertion(+), 7 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index 707e234..4f81dac 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -680,14 +680,8 @@ static void si_update_derived_state(struct si_context 
*sctx)
 
si_pm4_bind_state(sctx, ps, sctx-ps_shader-current-pm4);
 
-   if (si_pm4_state_changed(sctx, ps) || si_pm4_state_changed(sctx, vs)) {
-   /* XXX: Emitting the PS state even when only the VS changed
-* fixes random failures with piglit glsl-max-varyings.
-* Not sure why...
-*/
-   sctx-emitted.named.ps = NULL;
+   if (si_pm4_state_changed(sctx, ps) || si_pm4_state_changed(sctx, vs))
si_update_spi_map(sctx);
-   }
 
if (sctx-ps_db_shader_control != 
sctx-ps_shader-current-db_shader_control) {
sctx-ps_db_shader_control = 
sctx-ps_shader-current-db_shader_control;

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): radeonsi: clarify shader constant load functions

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: d78760895772f79f3bd89e2c0ed50366ba75dbf0
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d78760895772f79f3bd89e2c0ed50366ba75dbf0

Author: Marek Olšák marek.ol...@amd.com
Date:   Fri Sep 26 23:06:32 2014 +0200

radeonsi: clarify shader constant load functions

I'll need indexed loads without the meta data flag for tessellation later.
Also rename load_const to buffer_load_const to distinguish it from indexed
const loads.

v2: add comments

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_shader.c |   86 --
 1 file changed, 46 insertions(+), 40 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index cd78f66..276c27e 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -182,32 +182,35 @@ static int get_param_index(unsigned semantic_name, 
unsigned index,
 }
 
 /**
- * Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad
- *
- * @param offset The offset parameter specifies the number of
- * elements to offset, not the number of bytes or dwords.  An element is the
- * the type pointed to by the base_ptr parameter (e.g. int is the element of
- * an int* pointer)
- *
- * When LLVM lowers the load instruction, it will convert the element offset
- * into a dword offset automatically.
+ * Build an LLVM bytecode indexed load using LLVMBuildGEP + LLVMBuildLoad.
+ * It's equivalent to doing a load from base_ptr[index].
  *
+ * \param base_ptr  Where the array starts.
+ * \param index The element index into the array.
  */
-static LLVMValueRef build_indexed_load(
-   struct si_shader_context * si_shader_ctx,
-   LLVMValueRef base_ptr,
-   LLVMValueRef offset)
+static LLVMValueRef build_indexed_load(struct si_shader_context *si_shader_ctx,
+  LLVMValueRef base_ptr, LLVMValueRef 
index)
 {
-   struct lp_build_context * base = 
si_shader_ctx-radeon_bld.soa.bld_base.base;
+   struct lp_build_tgsi_context *bld_base = 
si_shader_ctx-radeon_bld.soa.bld_base;
+   struct gallivm_state *gallivm = bld_base-base.gallivm;
+   LLVMValueRef indices[2], pointer;
 
-   LLVMValueRef indices[2] = {
-   LLVMConstInt(LLVMInt64TypeInContext(base-gallivm-context), 0, 
false),
-   offset
-   };
-   LLVMValueRef computed_ptr = LLVMBuildGEP(
-   base-gallivm-builder, base_ptr, indices, 2, );
+   indices[0] = bld_base-uint_bld.zero;
+   indices[1] = index;
 
-   LLVMValueRef result = LLVMBuildLoad(base-gallivm-builder, 
computed_ptr, );
+   pointer = LLVMBuildGEP(gallivm-builder, base_ptr, indices, 2, );
+   return LLVMBuildLoad(gallivm-builder, pointer, );
+}
+
+/**
+ * Do a load from base_ptr[index], but also add a flag that it's loading
+ * a constant.
+ */
+static LLVMValueRef build_indexed_load_const(
+   struct si_shader_context * si_shader_ctx,
+   LLVMValueRef base_ptr, LLVMValueRef index)
+{
+   LLVMValueRef result = build_indexed_load(si_shader_ctx, base_ptr, 
index);
LLVMSetMetadata(result, 1, si_shader_ctx-const_md);
return result;
 }
@@ -259,7 +262,7 @@ static void declare_input_vs(
 
t_offset = lp_build_const_int32(gallivm, input_index);
 
-   t_list = build_indexed_load(si_shader_ctx, t_list_ptr, t_offset);
+   t_list = build_indexed_load_const(si_shader_ctx, t_list_ptr, t_offset);
 
/* Build the attribute offset */
attribute_offset = lp_build_const_int32(gallivm, 0);
@@ -354,7 +357,7 @@ static LLVMValueRef fetch_input_gs(
/* Load the ESGS ring resource descriptor */
t_list_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn,
  SI_PARAM_RW_BUFFERS);
-   t_list = build_indexed_load(si_shader_ctx, t_list_ptr,
+   t_list = build_indexed_load_const(si_shader_ctx, t_list_ptr,
lp_build_const_int32(gallivm, 
SI_RING_ESGS));
 
args[0] = t_list;
@@ -562,8 +565,11 @@ static LLVMValueRef get_sample_id(struct 
radeon_llvm_context *radeon_bld)
return value;
 }
 
-static LLVMValueRef load_const(LLVMBuilderRef builder, LLVMValueRef resource,
-  LLVMValueRef offset, LLVMTypeRef return_type)
+/**
+ * Load a dword from a constant buffer.
+ */
+static LLVMValueRef buffer_load_const(LLVMBuilderRef builder, LLVMValueRef 
resource,
+ LLVMValueRef offset, LLVMTypeRef 
return_type)
 {
LLVMValueRef args[2] = {resource, offset};
 
@@ -602,15 +608,15 @@ static void declare_system_value(
LLVMBuilderRef builder = gallivm-builder;
LLVMValueRef desc = 
LLVMGetParam(si_shader_ctx-radeon_bld.main_fn, SI_PARAM_CONST);
LLVMValueRef buf_index = lp_build_const_int32(gallivm, 
SI_DRIVER_STATE_CONST_BUF);
-   

Mesa (master): gallium: add PIPE_SHADER_CAP_MAX_OUTPUTS and use it in st/ mesa

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 5f5b83cbba95a7bb8955b09e24df1e9487c10734
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=5f5b83cbba95a7bb8955b09e24df1e9487c10734

Author: Marek Olšák marek.ol...@amd.com
Date:   Wed Oct  1 20:28:17 2014 +0200

gallium: add PIPE_SHADER_CAP_MAX_OUTPUTS and use it in st/mesa

With 5 shader stages and various combinations of enabled and disabled shaders,
the maximum number of outputs in one shader doesn't have to be equal to
the maximum number of inputs in the following shader.

v2: return 32 for softpipe and llvmpipe

---

 src/gallium/auxiliary/gallivm/lp_bld_limits.h|2 ++
 src/gallium/auxiliary/tgsi/tgsi_exec.h   |2 ++
 src/gallium/docs/source/screen.rst   |2 ++
 src/gallium/drivers/freedreno/freedreno_screen.c |1 +
 src/gallium/drivers/i915/i915_screen.c   |2 ++
 src/gallium/drivers/ilo/ilo_screen.c |1 +
 src/gallium/drivers/nouveau/nv30/nv30_screen.c   |3 +++
 src/gallium/drivers/nouveau/nv50/nv50_screen.c   |2 ++
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   |2 ++
 src/gallium/drivers/r300/r300_screen.c   |4 
 src/gallium/drivers/r600/r600_pipe.c |2 ++
 src/gallium/drivers/radeonsi/si_pipe.c   |2 ++
 src/gallium/drivers/svga/svga_screen.c   |4 
 src/gallium/drivers/vc4/vc4_screen.c |2 ++
 src/gallium/include/pipe/p_defines.h |1 +
 src/mesa/state_tracker/st_extensions.c   |8 
 16 files changed, 36 insertions(+), 4 deletions(-)

diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h 
b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
index a96ab29..8c66f9d 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
@@ -97,6 +97,8 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
   return LP_MAX_TGSI_NESTING;
case PIPE_SHADER_CAP_MAX_INPUTS:
   return PIPE_MAX_SHADER_INPUTS;
+   case PIPE_SHADER_CAP_MAX_OUTPUTS:
+  return 32;
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
   return sizeof(float[4]) * 4096;
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
diff --git a/src/gallium/auxiliary/tgsi/tgsi_exec.h 
b/src/gallium/auxiliary/tgsi/tgsi_exec.h
index 4720ec6..cc5a916 100644
--- a/src/gallium/auxiliary/tgsi/tgsi_exec.h
+++ b/src/gallium/auxiliary/tgsi/tgsi_exec.h
@@ -426,6 +426,8 @@ tgsi_exec_get_shader_param(enum pipe_shader_cap param)
   return TGSI_EXEC_MAX_NESTING;
case PIPE_SHADER_CAP_MAX_INPUTS:
   return TGSI_EXEC_MAX_INPUT_ATTRIBS;
+   case PIPE_SHADER_CAP_MAX_OUTPUTS:
+  return 32;
case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
   return TGSI_EXEC_MAX_CONST_BUFFER_SIZE;
case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
diff --git a/src/gallium/docs/source/screen.rst 
b/src/gallium/docs/source/screen.rst
index ba34ec8..88d7e49 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -267,6 +267,8 @@ support different features.
 * ``PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS``: The maximum number of texture 
indirections.
 * ``PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH``: The maximum nested control flow 
depth.
 * ``PIPE_SHADER_CAP_MAX_INPUTS``: The maximum number of input registers.
+* ``PIPE_SHADER_CAP_MAX_OUTPUTS``: The maximum number of output registers.
+  This is valid for all shaders except the fragment shader.
 * ``PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE``: The maximum size per constant 
buffer in bytes.
 * ``PIPE_SHADER_CAP_MAX_CONST_BUFFERS``: Maximum number of constant buffers 
that can be bound
   to any shader stage using ``set_constant_buffer``. If 0 or 1, the pipe will
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index ddc7302..90156b4 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -351,6 +351,7 @@ fd_screen_get_shader_param(struct pipe_screen *pscreen, 
unsigned shader,
case PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH:
return 8; /* XXX */
case PIPE_SHADER_CAP_MAX_INPUTS:
+case PIPE_SHADER_CAP_MAX_OUTPUTS:
return 16;
case PIPE_SHADER_CAP_MAX_TEMPS:
return 64; /* Max native temporaries. */
diff --git a/src/gallium/drivers/i915/i915_screen.c 
b/src/gallium/drivers/i915/i915_screen.c
index 9006734..2a6e751 100644
--- a/src/gallium/drivers/i915/i915_screen.c
+++ b/src/gallium/drivers/i915/i915_screen.c
@@ -130,6 +130,8 @@ i915_get_shader_param(struct pipe_screen *screen, unsigned 
shader, enum pipe_sha
  return 0;
   case PIPE_SHADER_CAP_MAX_INPUTS:
  return 10;
+  case PIPE_SHADER_CAP_MAX_OUTPUTS:
+ return 1;
   case PIPE_SHADER_CAP_MAX_CONST_BUFFER_SIZE:
  return 32 * sizeof(float[4]);
   case PIPE_SHADER_CAP_MAX_CONST_BUFFERS:
diff --git a/src/gallium/drivers/ilo/ilo_screen.c 

Mesa (master): radeonsi: statically declare resource and sampler arrays

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 55a9b778c8c111a58f801dc20b64d0d0b0477e0d
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=55a9b778c8c111a58f801dc20b64d0d0b0477e0d

Author: Marek Olšák marek.ol...@amd.com
Date:   Sun Oct  5 12:38:54 2014 +0200

radeonsi: statically declare resource and sampler arrays

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_shader.c |   10 ++
 1 file changed, 2 insertions(+), 8 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 6f2fb7b..cd78f66 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -68,8 +68,8 @@ struct si_shader_context
LLVMValueRef const_resource[SI_NUM_CONST_BUFFERS];
LLVMValueRef ddxy_lds;
LLVMValueRef *constants[SI_NUM_CONST_BUFFERS];
-   LLVMValueRef *resources;
-   LLVMValueRef *samplers;
+   LLVMValueRef resources[SI_NUM_SAMPLER_VIEWS];
+   LLVMValueRef samplers[SI_NUM_SAMPLER_STATES];
LLVMValueRef so_buffers[4];
LLVMValueRef gs_next_vertex;
 };
@@ -2435,10 +2435,6 @@ static void preload_samplers(struct si_shader_context 
*si_shader_ctx)
if (num_samplers == 0)
return;
 
-   /* Allocate space for the values */
-   si_shader_ctx-resources = CALLOC(SI_NUM_SAMPLER_VIEWS, 
sizeof(LLVMValueRef));
-   si_shader_ctx-samplers = CALLOC(num_samplers, sizeof(LLVMValueRef));
-
res_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn, 
SI_PARAM_RESOURCE);
samp_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn, 
SI_PARAM_SAMPLER);
 
@@ -2790,8 +2786,6 @@ int si_shader_create(struct si_screen *sscreen, struct 
si_shader *shader)
 out:
for (int i = 0; i  SI_NUM_CONST_BUFFERS; i++)
FREE(si_shader_ctx.constants[i]);
-   FREE(si_shader_ctx.resources);
-   FREE(si_shader_ctx.samplers);
 
return r;
 }

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): r600g,radeonsi: convert TGSI shader type to LLVM shader type

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 43b243236824ce80daaa5cb4af5db94aaca0855e
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=43b243236824ce80daaa5cb4af5db94aaca0855e

Author: Marek Olšák marek.ol...@amd.com
Date:   Tue Sep 23 17:17:01 2014 +0200

r600g,radeonsi: convert TGSI shader type to LLVM shader type

The values are hardcoded in the LLVM backend, but the TGSI definitions are
going to be changed with tessellation, e.g. TGSI_PROCESSOR_COMPUTE will be
increased by 2.

We'll use VS for LS and HS, because there's nothing special about them
from the LLVM backend point of view, even though the hardware side is
different. We do the same for ES.

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeon/radeon_llvm_emit.c |   31 -
 1 file changed, 30 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/radeon_llvm_emit.c 
b/src/gallium/drivers/radeon/radeon_llvm_emit.c
index 53694b7..dc871d7 100644
--- a/src/gallium/drivers/radeon/radeon_llvm_emit.c
+++ b/src/gallium/drivers/radeon/radeon_llvm_emit.c
@@ -41,6 +41,16 @@
 #define TRIPLE_STRING_LEN 7
 
 /**
+ * Shader types for the LLVM backend.
+ */
+enum radeon_llvm_shader_type {
+   RADEON_LLVM_SHADER_PS = 0,
+   RADEON_LLVM_SHADER_VS = 1,
+   RADEON_LLVM_SHADER_GS = 2,
+   RADEON_LLVM_SHADER_CS = 3,
+};
+
+/**
  * Set the shader type we want to compile
  *
  * @param type shader type to set
@@ -48,7 +58,26 @@
 void radeon_llvm_shader_type(LLVMValueRef F, unsigned type)
 {
char Str[2];
-   sprintf(Str, %1d, type);
+   enum radeon_llvm_shader_type llvm_type;
+
+   switch (type) {
+   case TGSI_PROCESSOR_VERTEX:
+   llvm_type = RADEON_LLVM_SHADER_VS;
+   break;
+   case TGSI_PROCESSOR_GEOMETRY:
+   llvm_type = RADEON_LLVM_SHADER_GS;
+   break;
+   case TGSI_PROCESSOR_FRAGMENT:
+   llvm_type = RADEON_LLVM_SHADER_PS;
+   break;
+   case TGSI_PROCESSOR_COMPUTE:
+   llvm_type = RADEON_LLVM_SHADER_CS;
+   break;
+   default:
+   assert(0);
+   }
+
+   sprintf(Str, %1d, llvm_type);
 
LLVMAddTargetDependentFunctionAttr(F, ShaderType, Str);
 

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): st/mesa: add ST_DEBUG= wf option which enables wireframe rendering

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: e8764a46731aaa20d6c7bc98d227e1a94fafbf5b
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e8764a46731aaa20d6c7bc98d227e1a94fafbf5b

Author: Marek Olšák marek.ol...@amd.com
Date:   Sun Oct  5 18:55:47 2014 +0200

st/mesa: add ST_DEBUG=wf option which enables wireframe rendering

Useful for tessellation.

---

 src/mesa/state_tracker/st_atom_rasterizer.c |   11 +--
 src/mesa/state_tracker/st_debug.c   |1 +
 src/mesa/state_tracker/st_debug.h   |1 +
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/mesa/state_tracker/st_atom_rasterizer.c 
b/src/mesa/state_tracker/st_atom_rasterizer.c
index a228538..dfa728b 100644
--- a/src/mesa/state_tracker/st_atom_rasterizer.c
+++ b/src/mesa/state_tracker/st_atom_rasterizer.c
@@ -33,6 +33,7 @@
 #include main/macros.h
 #include st_context.h
 #include st_atom.h
+#include st_debug.h
 #include st_program.h
 #include pipe/p_context.h
 #include pipe/p_defines.h
@@ -119,8 +120,14 @@ static void update_raster_state( struct st_context *st )
/* _NEW_POLYGON
 */
{
-  raster-fill_front = translate_fill( ctx-Polygon.FrontMode );
-  raster-fill_back = translate_fill( ctx-Polygon.BackMode );
+  if (ST_DEBUG  DEBUG_WIREFRAME) {
+ raster-fill_front = PIPE_POLYGON_MODE_LINE;
+ raster-fill_back = PIPE_POLYGON_MODE_LINE;
+  }
+  else {
+ raster-fill_front = translate_fill( ctx-Polygon.FrontMode );
+ raster-fill_back = translate_fill( ctx-Polygon.BackMode );
+  }
 
   /* Simplify when culling is active:
*/
diff --git a/src/mesa/state_tracker/st_debug.c 
b/src/mesa/state_tracker/st_debug.c
index 8c15e18..de3e3a9 100644
--- a/src/mesa/state_tracker/st_debug.c
+++ b/src/mesa/state_tracker/st_debug.c
@@ -55,6 +55,7 @@ static const struct debug_named_value st_debug_flags[] = {
{ query,DEBUG_QUERY, NULL },
{ draw, DEBUG_DRAW, NULL },
{ buffer,   DEBUG_BUFFER, NULL },
+   { wf,   DEBUG_WIREFRAME, NULL },
DEBUG_NAMED_VALUE_END
 };
 
diff --git a/src/mesa/state_tracker/st_debug.h 
b/src/mesa/state_tracker/st_debug.h
index c1c4825..49b916f 100644
--- a/src/mesa/state_tracker/st_debug.h
+++ b/src/mesa/state_tracker/st_debug.h
@@ -46,6 +46,7 @@ st_print_current(void);
 #define DEBUG_SCREEN0x80
 #define DEBUG_DRAW  0x100
 #define DEBUG_BUFFER0x200
+#define DEBUG_WIREFRAME 0x400
 
 #ifdef DEBUG
 extern int ST_DEBUG;

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): radeonsi: make pm4 state generation for shaders independent of the context

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: c94af8f0d717c1079327c51d8983b57c09aa2d1b
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c94af8f0d717c1079327c51d8983b57c09aa2d1b

Author: Marek Olšák marek.ol...@amd.com
Date:   Tue Oct 14 17:36:30 2014 +0200

radeonsi: make pm4 state generation for shaders independent of the context

The si_pm4_delete_state calls became useless, because the pm4 state is
always generated only once.

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_state_draw.c |   26 +-
 1 file changed, 9 insertions(+), 17 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_state_draw.c 
b/src/gallium/drivers/radeonsi/si_state_draw.c
index 2b27007..eb7ed40 100644
--- a/src/gallium/drivers/radeonsi/si_state_draw.c
+++ b/src/gallium/drivers/radeonsi/si_state_draw.c
@@ -39,15 +39,13 @@
  * Shaders
  */
 
-static void si_shader_es(struct pipe_context *ctx, struct si_shader *shader)
+static void si_shader_es(struct si_shader *shader)
 {
-   struct si_context *sctx = (struct si_context *)ctx;
struct si_pm4_state *pm4;
unsigned num_sgprs, num_user_sgprs;
unsigned vgpr_comp_cnt;
uint64_t va;
 
-   si_pm4_delete_state(sctx, es, shader-pm4);
pm4 = shader-pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
@@ -77,9 +75,8 @@ static void si_shader_es(struct pipe_context *ctx, struct 
si_shader *shader)
   S_00B32C_USER_SGPR(num_user_sgprs));
 }
 
-static void si_shader_gs(struct pipe_context *ctx, struct si_shader *shader)
+static void si_shader_gs(struct si_shader *shader)
 {
-   struct si_context *sctx = (struct si_context *)ctx;
unsigned gs_vert_itemsize = shader-selector-info.num_outputs * (16  
2);
unsigned gs_max_vert_out = shader-selector-gs_max_out_vertices;
unsigned gsvs_itemsize = gs_vert_itemsize * gs_max_vert_out;
@@ -91,7 +88,6 @@ static void si_shader_gs(struct pipe_context *ctx, struct 
si_shader *shader)
/* The GSVS_RING_ITEMSIZE register takes 15 bits */
assert(gsvs_itemsize  (1  15));
 
-   si_pm4_delete_state(sctx, gs, shader-pm4);
pm4 = shader-pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
@@ -147,16 +143,14 @@ static void si_shader_gs(struct pipe_context *ctx, struct 
si_shader *shader)
   S_00B22C_USER_SGPR(num_user_sgprs));
 }
 
-static void si_shader_vs(struct pipe_context *ctx, struct si_shader *shader)
+static void si_shader_vs(struct si_shader *shader)
 {
-   struct si_context *sctx = (struct si_context *)ctx;
struct tgsi_shader_info *info = shader-selector-info;
struct si_pm4_state *pm4;
unsigned num_sgprs, num_user_sgprs;
unsigned nparams, i, vgpr_comp_cnt;
uint64_t va;
 
-   si_pm4_delete_state(sctx, vs, shader-pm4);
pm4 = shader-pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
@@ -226,9 +220,8 @@ static void si_shader_vs(struct pipe_context *ctx, struct 
si_shader *shader)
   S_00B12C_SO_EN(!!shader-selector-so.num_outputs));
 }
 
-static void si_shader_ps(struct pipe_context *ctx, struct si_shader *shader)
+static void si_shader_ps(struct si_shader *shader)
 {
-   struct si_context *sctx = (struct si_context *)ctx;
struct tgsi_shader_info *info = shader-selector-info;
struct si_pm4_state *pm4;
unsigned i, spi_ps_in_control;
@@ -236,7 +229,6 @@ static void si_shader_ps(struct pipe_context *ctx, struct 
si_shader *shader)
unsigned spi_baryc_cntl = 0, spi_ps_input_ena;
uint64_t va;
 
-   si_pm4_delete_state(sctx, ps, shader-pm4);
pm4 = shader-pm4 = CALLOC_STRUCT(si_pm4_state);
 
if (pm4 == NULL)
@@ -608,8 +600,8 @@ static void si_update_derived_state(struct si_context *sctx)
si_shader_select(ctx, sctx-gs_shader);
 
if (!sctx-gs_shader-current-pm4) {
-   si_shader_gs(ctx, sctx-gs_shader-current);
-   si_shader_vs(ctx, 
sctx-gs_shader-current-gs_copy_shader);
+   si_shader_gs(sctx-gs_shader-current);
+   si_shader_vs(sctx-gs_shader-current-gs_copy_shader);
}
 
si_pm4_bind_state(sctx, gs, sctx-gs_shader-current-pm4);
@@ -620,7 +612,7 @@ static void si_update_derived_state(struct si_context *sctx)
si_shader_select(ctx, sctx-vs_shader);
 
if (!sctx-vs_shader-current-pm4)
-   si_shader_es(ctx, sctx-vs_shader-current);
+   si_shader_es(sctx-vs_shader-current);
 
si_pm4_bind_state(sctx, es, sctx-vs_shader-current-pm4);
 
@@ -649,7 +641,7 @@ static void si_update_derived_state(struct si_context *sctx)
si_shader_select(ctx, sctx-vs_shader);
 
if (!sctx-vs_shader-current-pm4)
-   si_shader_vs(ctx, sctx-vs_shader-current);
+ 

Mesa (master): radeonsi: load ring resource descriptors only once

2014-10-21 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: fc3b3354d7d69b324b63d787cbd925e6a34d5f56
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=fc3b3354d7d69b324b63d787cbd925e6a34d5f56

Author: Marek Olšák marek.ol...@amd.com
Date:   Sun Oct  5 13:33:40 2014 +0200

radeonsi: load ring resource descriptors only once

v2: document the new functions

Reviewed-by: Michel Dänzer michel.daen...@amd.com

---

 src/gallium/drivers/radeonsi/si_shader.c |   77 --
 1 file changed, 42 insertions(+), 35 deletions(-)

diff --git a/src/gallium/drivers/radeonsi/si_shader.c 
b/src/gallium/drivers/radeonsi/si_shader.c
index 276c27e..f8e9fbe 100644
--- a/src/gallium/drivers/radeonsi/si_shader.c
+++ b/src/gallium/drivers/radeonsi/si_shader.c
@@ -71,6 +71,8 @@ struct si_shader_context
LLVMValueRef resources[SI_NUM_SAMPLER_VIEWS];
LLVMValueRef samplers[SI_NUM_SAMPLER_STATES];
LLVMValueRef so_buffers[4];
+   LLVMValueRef esgs_ring;
+   LLVMValueRef gsvs_ring;
LLVMValueRef gs_next_vertex;
 };
 
@@ -312,8 +314,6 @@ static LLVMValueRef fetch_input_gs(
struct gallivm_state *gallivm = base-gallivm;
LLVMTypeRef i32 = LLVMInt32TypeInContext(gallivm-context);
LLVMValueRef vtx_offset;
-   LLVMValueRef t_list_ptr;
-   LLVMValueRef t_list;
LLVMValueRef args[9];
unsigned vtx_offset_param;
struct tgsi_shader_info *info = shader-selector-info;
@@ -354,13 +354,7 @@ static LLVMValueRef fetch_input_gs(
   vtx_offset_param),
  4);
 
-   /* Load the ESGS ring resource descriptor */
-   t_list_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn,
- SI_PARAM_RW_BUFFERS);
-   t_list = build_indexed_load_const(si_shader_ctx, t_list_ptr,
-   lp_build_const_int32(gallivm, 
SI_RING_ESGS));
-
-   args[0] = t_list;
+   args[0] = si_shader_ctx-esgs_ring;
args[1] = vtx_offset;
args[2] = lp_build_const_int32(gallivm,
   (get_param_index(semantic_name, 
semantic_index,
@@ -1240,17 +1234,9 @@ static void si_llvm_emit_es_epilogue(struct 
lp_build_tgsi_context * bld_base)
LLVMTypeRef i32 = LLVMInt32TypeInContext(gallivm-context);
LLVMValueRef soffset = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn,
SI_PARAM_ES2GS_OFFSET);
-   LLVMValueRef t_list_ptr;
-   LLVMValueRef t_list;
unsigned chan;
int i;
 
-   /* Load the ESGS ring resource descriptor */
-   t_list_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn,
- SI_PARAM_RW_BUFFERS);
-   t_list = build_indexed_load_const(si_shader_ctx, t_list_ptr,
-   lp_build_const_int32(gallivm, 
SI_RING_ESGS));
-
for (i = 0; i  info-num_outputs; i++) {
LLVMValueRef *out_ptr =
si_shader_ctx-radeon_bld.soa.outputs[i];
@@ -1265,7 +1251,9 @@ static void si_llvm_emit_es_epilogue(struct 
lp_build_tgsi_context * bld_base)
LLVMValueRef out_val = LLVMBuildLoad(gallivm-builder, 
out_ptr[chan], );
out_val = LLVMBuildBitCast(gallivm-builder, out_val, 
i32, );
 
-   build_tbuffer_store(si_shader_ctx, t_list, out_val, 1,
+   build_tbuffer_store(si_shader_ctx,
+   si_shader_ctx-esgs_ring,
+   out_val, 1,
LLVMGetUndef(i32), soffset,
(4 * param_index + chan) * 4,
V_008F0C_BUF_DATA_FORMAT_32,
@@ -2150,18 +2138,10 @@ static void si_llvm_emit_vertex(
SI_PARAM_GS2VS_OFFSET);
LLVMValueRef gs_next_vertex;
LLVMValueRef can_emit, kill;
-   LLVMValueRef t_list_ptr;
-   LLVMValueRef t_list;
LLVMValueRef args[2];
unsigned chan;
int i;
 
-   /* Load the GSVS ring resource descriptor */
-   t_list_ptr = LLVMGetParam(si_shader_ctx-radeon_bld.main_fn,
- SI_PARAM_RW_BUFFERS);
-   t_list = build_indexed_load_const(si_shader_ctx, t_list_ptr,
-   lp_build_const_int32(gallivm, 
SI_RING_GSVS));
-
/* Write vertex attribute values to GSVS ring */
gs_next_vertex = LLVMBuildLoad(gallivm-builder, 
si_shader_ctx-gs_next_vertex, );
 
@@ -2194,7 +2174,9 @@ static void si_llvm_emit_vertex(
 
out_val = LLVMBuildBitCast(gallivm-builder, out_val, 
i32, );
 
-   build_tbuffer_store(si_shader_ctx, t_list, out_val, 1,
+   build_tbuffer_store(si_shader_ctx,
+   

Mesa (master): clover: Fix build error with LLVM 3.4.

2014-10-21 Thread Vinson Lee
Module: Mesa
Branch: master
Commit: 1ab6543431b5a4eaf589cdabf2227088dd62ce6f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1ab6543431b5a4eaf589cdabf2227088dd62ce6f

Author: Vinson Lee v...@freedesktop.org
Date:   Sun Oct 19 00:13:33 2014 -0700

clover: Fix build error with LLVM 3.4.

DataLayoutPass was added in LLVM 3.5 r202168, commit
57edc9d4ff1648568a5dd7e9958649065b260dca Make DataLayout a plain
object, not a pass..

This patch fixes this build error with LLVM 3.4.

  CXX  llvm/libclllvm_la-invocation.lo
llvm/invocation.cpp: In function 'void {anonymous}::optimize(llvm::Module*, 
unsigned int, const std::vectorllvm::Function*)':
llvm/invocation.cpp:324:18: error: expected type-specifier
   PM.add(new llvm::DataLayoutPass(mod));
  ^

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=85189
Signed-off-by: Vinson Lee v...@freedesktop.org
Reviewed-by: Tom Stellard thomas.stell...@amd.com

---

 src/gallium/state_trackers/clover/llvm/invocation.cpp |4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp 
b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 507daa0..7c31008 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -344,7 +344,9 @@ namespace {
  llvm::Function *kernel = *I;
  export_list.push_back(kernel-getName().data());
   }
-#if HAVE_LLVM  0x0306
+#if HAVE_LLVM  0x0305
+  PM.add(new llvm::DataLayout(mod));
+#elif HAVE_LLVM  0x0306
   PM.add(new llvm::DataLayoutPass(mod));
 #else
   PM.add(new llvm::DataLayoutPass());

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/a3xx: fix depth/stencil restore format

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 36310d9d56510ef50318bbb370f6c3d27ba09ebd
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=36310d9d56510ef50318bbb370f6c3d27ba09ebd

Author: Rob Clark robcl...@freedesktop.org
Date:   Tue Oct 21 17:08:10 2014 -0400

freedreno/a3xx: fix depth/stencil restore format

Also fix z16 restore format which was completely wrong.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a3xx/fd3_util.c |6 +-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_util.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_util.c
index c83f65a..f443349 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_util.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_util.c
@@ -264,6 +264,9 @@ fd3_pipe2tex(enum pipe_format format)
case PIPE_FORMAT_I8_UNORM:
return TFMT_NORM_UINT_8;
 
+   case PIPE_FORMAT_R8G8_UNORM:
+   return TFMT_NORM_UINT_8_8;
+
case PIPE_FORMAT_B8G8R8A8_UNORM:
case PIPE_FORMAT_B8G8R8X8_UNORM:
case PIPE_FORMAT_R8G8B8A8_UNORM:
@@ -378,8 +381,9 @@ fd3_gmem_restore_format(enum pipe_format format)
switch (format) {
case PIPE_FORMAT_Z24X8_UNORM:
case PIPE_FORMAT_Z24_UNORM_S8_UINT:
+   return PIPE_FORMAT_R8G8B8A8_UNORM;
case PIPE_FORMAT_Z16_UNORM:
-   return PIPE_FORMAT_B8G8R8A8_UNORM;
+   return PIPE_FORMAT_R8G8_UNORM;
default:
return format;
}

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno/a3xx: fix viewport state during clear

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 2bc2ab66d9c06477cdec6799c24733fbd2d4db3f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2bc2ab66d9c06477cdec6799c24733fbd2d4db3f

Author: Rob Clark robcl...@freedesktop.org
Date:   Tue Oct 21 12:25:28 2014 -0400

freedreno/a3xx: fix viewport state during clear

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a3xx/fd3_draw.c |   20 +++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
index e168d97..0fb0625 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_draw.c
@@ -158,6 +158,22 @@ fd3_draw(struct fd_context *ctx, const struct 
pipe_draw_info *info)
draw_impl(ctx, ctx-ring, emit);
 }
 
+/* clear operations ignore viewport state, so we need to reset it
+ * based on framebuffer state:
+ */
+static void
+reset_viewport(struct fd_ringbuffer *ring, struct pipe_framebuffer_state *pfb)
+{
+   float half_width = pfb-width * 0.5f;
+   float half_height = pfb-height * 0.5f;
+
+   OUT_PKT0(ring, REG_A3XX_GRAS_CL_VPORT_XOFFSET, 4);
+   OUT_RING(ring, A3XX_GRAS_CL_VPORT_XOFFSET(half_width - 0.5));
+   OUT_RING(ring, A3XX_GRAS_CL_VPORT_XSCALE(half_width));
+   OUT_RING(ring, A3XX_GRAS_CL_VPORT_YOFFSET(half_height - 0.5));
+   OUT_RING(ring, A3XX_GRAS_CL_VPORT_YSCALE(-half_height));
+}
+
 /* binning pass cmds for a clear:
  * NOTE: newer blob drivers don't use binning for clear, which is probably
  * preferable since it is low vtx count.  However that doesn't seem to
@@ -183,6 +199,7 @@ fd3_clear_binning(struct fd_context *ctx, unsigned dirty)
 
fd3_emit_state(ctx, ring, emit);
fd3_emit_vertex_bufs(ring, emit);
+   reset_viewport(ring, ctx-framebuffer);
 
OUT_PKT0(ring, REG_A3XX_PC_PRIM_VTX_CNTL, 1);
OUT_RING(ring, A3XX_PC_PRIM_VTX_CNTL_STRIDE_IN_VPC(0) |
@@ -219,7 +236,7 @@ fd3_clear(struct fd_context *ctx, unsigned buffers,
},
};
 
-   dirty = FD_DIRTY_VIEWPORT | FD_DIRTY_FRAMEBUFFER | FD_DIRTY_SCISSOR;
+   dirty = FD_DIRTY_FRAMEBUFFER | FD_DIRTY_SCISSOR;
dirty |= FD_DIRTY_PROG;
emit.dirty = dirty;
 
@@ -227,6 +244,7 @@ fd3_clear(struct fd_context *ctx, unsigned buffers,
 
/* emit generic state now: */
fd3_emit_state(ctx, ring, emit);
+   reset_viewport(ring, ctx-framebuffer);
 
OUT_PKT0(ring, REG_A3XX_RB_BLEND_ALPHA, 1);
OUT_RING(ring, A3XX_RB_BLEND_ALPHA_UINT(0xff) |

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno: mark scissor state dirty when enable bit changes

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 3eb8289aa4cb599e9297ee1a1b5cfbae35ee562a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3eb8289aa4cb599e9297ee1a1b5cfbae35ee562a

Author: Rob Clark robcl...@freedesktop.org
Date:   Tue Oct 21 11:28:53 2014 -0400

freedreno: mark scissor state dirty when enable bit changes

We don't have a scissor enable bit in hw, so when a raster state change
results in scissor enable bit changing, we need to also mark scissor
state as dirty.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/freedreno_state.c |   10 ++
 1 file changed, 10 insertions(+)

diff --git a/src/gallium/drivers/freedreno/freedreno_state.c 
b/src/gallium/drivers/freedreno/freedreno_state.c
index 2786929..6293f43 100644
--- a/src/gallium/drivers/freedreno/freedreno_state.c
+++ b/src/gallium/drivers/freedreno/freedreno_state.c
@@ -237,8 +237,18 @@ static void
 fd_rasterizer_state_bind(struct pipe_context *pctx, void *hwcso)
 {
struct fd_context *ctx = fd_context(pctx);
+   struct pipe_scissor_state *old_scissor = fd_context_get_scissor(ctx);
+
ctx-rasterizer = hwcso;
ctx-dirty |= FD_DIRTY_RASTERIZER;
+
+   /* if scissor enable bit changed we need to mark scissor
+* state as dirty as well:
+* NOTE: we can do a shallow compare, since we only care
+* if it changed to/from ctx-disable_scissor
+*/
+   if (old_scissor != fd_context_get_scissor(ctx))
+   ctx-dirty |= FD_DIRTY_SCISSOR;
 }
 
 static void

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): freedreno: clear vs scissor

2014-10-21 Thread Rob Clark
Module: Mesa
Branch: master
Commit: 01b757e2b0fb97a146b0ef278b449cecab0d15e8
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=01b757e2b0fb97a146b0ef278b449cecab0d15e8

Author: Rob Clark robcl...@freedesktop.org
Date:   Tue Oct 21 10:30:49 2014 -0400

freedreno: clear vs scissor

The optimization of avoiding restore (mem2gmem) if there was a clear
falls down a bit if you don't have a fullscreen scissor.  We need to
make the decision logic a bit more clever to keep track of *what* was
cleared, so that we can (a) completely skip mem2gmem if entire buffer
was cleared, or (b) skip mem2gmem on a per-tile basis for tiles that
were completely cleared.

Signed-off-by: Rob Clark robcl...@freedesktop.org

---

 src/gallium/drivers/freedreno/a2xx/fd2_gmem.c |4 +-
 src/gallium/drivers/freedreno/a3xx/fd3_gmem.c |4 +-
 src/gallium/drivers/freedreno/freedreno_context.c |4 +-
 src/gallium/drivers/freedreno/freedreno_context.h |   14 +-
 src/gallium/drivers/freedreno/freedreno_draw.c|   28 ++--
 src/gallium/drivers/freedreno/freedreno_gmem.c|   48 -
 src/gallium/drivers/freedreno/freedreno_gmem.h|7 ++-
 7 files changed, 96 insertions(+), 13 deletions(-)

diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c 
b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c
index 274b614..e0aae1c 100644
--- a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c
+++ b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c
@@ -317,10 +317,10 @@ fd2_emit_tile_mem2gmem(struct fd_context *ctx, struct 
fd_tile *tile)
OUT_RING(ring, CP_REG(REG_A2XX_PA_CL_CLIP_CNTL));
OUT_RING(ring, 0x);
 
-   if (ctx-restore  (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL))
+   if (fd_gmem_needs_restore(ctx, tile, FD_BUFFER_DEPTH | 
FD_BUFFER_STENCIL))
emit_mem2gmem_surf(ctx, bin_w * bin_h, pfb-zsbuf);
 
-   if (ctx-restore  FD_BUFFER_COLOR)
+   if (fd_gmem_needs_restore(ctx, tile, FD_BUFFER_COLOR))
emit_mem2gmem_surf(ctx, 0, pfb-cbufs[0]);
 
/* TODO blob driver seems to toss in a CACHE_FLUSH after each 
DRAW_INDX.. */
diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c 
b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
index 2eefa91..f454db2 100644
--- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
+++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c
@@ -566,10 +566,10 @@ fd3_emit_tile_mem2gmem(struct fd_context *ctx, struct 
fd_tile *tile)
bin_w = gmem-bin_w;
bin_h = gmem-bin_h;
 
-   if (ctx-restore  (FD_BUFFER_DEPTH | FD_BUFFER_STENCIL))
+   if (fd_gmem_needs_restore(ctx, tile, FD_BUFFER_DEPTH | 
FD_BUFFER_STENCIL))
emit_mem2gmem_surf(ctx, depth_base(ctx), pfb-zsbuf, bin_w);
 
-   if (ctx-restore  FD_BUFFER_COLOR)
+   if (fd_gmem_needs_restore(ctx, tile, FD_BUFFER_COLOR))
emit_mem2gmem_surf(ctx, 0, pfb-cbufs[0], bin_w);
 
OUT_PKT0(ring, REG_A3XX_GRAS_SC_CONTROL, 1);
diff --git a/src/gallium/drivers/freedreno/freedreno_context.c 
b/src/gallium/drivers/freedreno/freedreno_context.c
index 3a8545f..f7e63fd 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.c
+++ b/src/gallium/drivers/freedreno/freedreno_context.c
@@ -100,7 +100,7 @@ fd_context_render(struct pipe_context *pctx)
if (!ctx-needs_flush)
return;
 
-   fd_gmem_render_tiles(pctx);
+   fd_gmem_render_tiles(ctx);
 
DBG(%p/%p/%p, ctx-ring-start, ctx-ring-cur, ctx-ring-end);
 
@@ -111,7 +111,7 @@ fd_context_render(struct pipe_context *pctx)
fd_context_next_rb(pctx);
 
ctx-needs_flush = false;
-   ctx-cleared = ctx-restore = ctx-resolve = 0;
+   ctx-cleared = ctx-partial_cleared = ctx-restore = ctx-resolve = 0;
ctx-gmem_reason = 0;
ctx-num_draws = 0;
 
diff --git a/src/gallium/drivers/freedreno/freedreno_context.h 
b/src/gallium/drivers/freedreno/freedreno_context.h
index be2c263..22d950c 100644
--- a/src/gallium/drivers/freedreno/freedreno_context.h
+++ b/src/gallium/drivers/freedreno/freedreno_context.h
@@ -182,6 +182,10 @@ struct fd_context {
 * there was a glClear() that invalidated the entire previous buffer
 * contents.  Keep track of which buffer(s) are cleared, or needs
 * restore.  Masks of PIPE_CLEAR_*
+*
+* The 'cleared' bits will be set for buffers which are *entirely*
+* cleared, and 'partial_cleared' bits will be set if you must
+* check cleared_scissor.
 */
enum {
/* align bitmask values w/ PIPE_CLEAR_*.. since that is 
convenient.. */
@@ -189,7 +193,7 @@ struct fd_context {
FD_BUFFER_DEPTH   = PIPE_CLEAR_DEPTH,
FD_BUFFER_STENCIL = PIPE_CLEAR_STENCIL,
FD_BUFFER_ALL = FD_BUFFER_COLOR | FD_BUFFER_DEPTH | 
FD_BUFFER_STENCIL,
-   } cleared, restore, resolve;
+   } cleared, partial_cleared, restore, resolve;
 
bool needs_flush;
 
@@ -276,6 

Mesa (master): glsl: Delete unused gl_uniform_driver_format enum values.

2014-10-21 Thread Kenneth Graunke
Module: Mesa
Branch: master
Commit: 32364a1fe58a09914daf4eef96674969167665d7
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=32364a1fe58a09914daf4eef96674969167665d7

Author: Kenneth Graunke kenn...@whitecape.org
Date:   Thu Oct 16 09:28:42 2014 -0700

glsl: Delete unused gl_uniform_driver_format enum values.

A while back, Matt made the uniform upload functions simply upload
ctx-Const.UniformBooleanTrue for boolean values instead of 0/1, which
removed the need to convert it later.  We also set UniformBooleanTrue to
1.0f for drivers which want to treat booleans as 0.0/1.0f.

Nothing ever sets these, so they are dead.

Signed-off-by: Kenneth Graunke kenn...@whitecape.org
Reviewed-by: Tapani Pälli tapani.pa...@intel.com
Reviewed-by: Matt Turner matts...@gmail.com
Reviewed-by: Ian Romanick ian.d.roman...@intel.com

---

 src/glsl/ir_uniform.h   |   11 ---
 src/mesa/main/uniform_query.cpp |   27 ++-
 2 files changed, 2 insertions(+), 36 deletions(-)

diff --git a/src/glsl/ir_uniform.h b/src/glsl/ir_uniform.h
index 2f73528..b9ecf7c 100644
--- a/src/glsl/ir_uniform.h
+++ b/src/glsl/ir_uniform.h
@@ -45,17 +45,6 @@ extern C {
 enum PACKED gl_uniform_driver_format {
uniform_native = 0,  /** Store data in the native format. */
uniform_int_float,   /** Store integer data as floats. */
-   uniform_bool_float,  /** Store boolean data as floats. */
-
-   /**
-* Store boolean data as integer using 1 for \c true.
-*/
-   uniform_bool_int_0_1,
-
-   /**
-* Store boolean data as integer using ~0 for \c true.
-*/
-   uniform_bool_int_0_not0
 };
 
 struct gl_uniform_driver_storage {
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index c2776c0..db97d3d 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -533,8 +533,7 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
gl_uniform_storage *uni,
   dst += array_index * store-element_stride;
 
   switch (store-format) {
-  case uniform_native:
-  case uniform_bool_int_0_1: {
+  case uniform_native: {
 unsigned j;
 unsigned v;
 
@@ -550,8 +549,7 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
gl_uniform_storage *uni,
 break;
   }
 
-  case uniform_int_float:
-  case uniform_bool_float: {
+  case uniform_int_float: {
 const int *isrc = (const int *) src;
 unsigned j;
 unsigned v;
@@ -572,27 +570,6 @@ _mesa_propagate_uniforms_to_driver_storage(struct 
gl_uniform_storage *uni,
 break;
   }
 
-  case uniform_bool_int_0_not0: {
-const int *isrc = (const int *) src;
-unsigned j;
-unsigned v;
-unsigned c;
-
-for (j = 0; j  count; j++) {
-   for (v = 0; v  vectors; v++) {
-  for (c = 0; c  components; c++) {
- ((int *) dst)[c] = *isrc == 0 ? 0 : ~0;
- isrc++;
-  }
-
-  dst += store-vector_stride;
-   }
-
-   dst += extra_stride;
-}
-break;
-  }
-
   default:
 assert(!Should not get here.);
 break;

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): i965/vec4: Generate better code for ir_triop_csel.

2014-10-21 Thread Kenneth Graunke
Module: Mesa
Branch: master
Commit: 6dc6e6e0d979aa666e2934ae40477195e4d37ceb
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6dc6e6e0d979aa666e2934ae40477195e4d37ceb

Author: Kenneth Graunke kenn...@whitecape.org
Date:   Wed Oct 15 18:57:07 2014 -0700

i965/vec4: Generate better code for ir_triop_csel.

Previously, we generated an extra CMP instruction:

   cmp.ge.f0(8)g61D  g10,4,1F  0F
   cmp.nz.f0(8)nullg64,4,1D  0D
   (+f0) sel(8)g51F  g1.40,4,1Fg20,4,1F

The first operand is always a boolean, and we want to predicate the SEL
on that.  Rather than producing a boolean value and comparing it against
zero, we can just produce a condition code in the flag register.

Now we generate:

   cmp.ge.f0(8)nullg10,4,1F  0F
   (+f0) sel(8)g51F  g1.40,4,1Fg20,4,1F

No difference in shader-db.

v2: Remember to delete the old code (thanks Matt).

Signed-off-by: Kenneth Graunke kenn...@whitecape.org
Reviewed-by: Matt Turner matts...@gmail.com

---

 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |   18 +++---
 1 file changed, 15 insertions(+), 3 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp 
b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index d0587cd..b46879b 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1277,6 +1277,20 @@ vec4_visitor::visit(ir_expression *ir)
dst_reg result_dst(this, ir-type);
src_reg result_src(result_dst);
 
+   if (ir-operation == ir_triop_csel) {
+  ir-operands[1]-accept(this);
+  op[1] = this-result;
+  ir-operands[2]-accept(this);
+  op[2] = this-result;
+
+  enum brw_predicate predicate;
+  emit_bool_to_cond_code(ir-operands[0], predicate);
+  inst = emit(BRW_OPCODE_SEL, result_dst, op[1], op[2]);
+  inst-predicate = predicate;
+  this-result = result_src;
+  return;
+   }
+
for (operand = 0; operand  ir-get_num_operands(); operand++) {
   this-result.file = BAD_FILE;
   ir-operands[operand]-accept(this);
@@ -1780,9 +1794,7 @@ vec4_visitor::visit(ir_expression *ir)
   break;
 
case ir_triop_csel:
-  emit(CMP(dst_null_d(), op[0], src_reg(0), BRW_CONDITIONAL_NZ));
-  inst = emit(BRW_OPCODE_SEL, result_dst, op[1], op[2]);
-  inst-predicate = BRW_PREDICATE_NORMAL;
+  unreachable(already handled above);
   break;
 
case ir_triop_bfi:

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit


Mesa (master): i965/vec4: Simplify visit(ir_expression *)'s result_src/ dst setup.

2014-10-21 Thread Kenneth Graunke
Module: Mesa
Branch: master
Commit: f5c3f095b97dc5d8997ca448bca67b3db4d5
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f5c3f095b97dc5d8997ca448bca67b3db4d5

Author: Kenneth Graunke kenn...@whitecape.org
Date:   Wed Oct 15 19:17:21 2014 -0700

i965/vec4: Simplify visit(ir_expression *)'s result_src/dst setup.

Using dst_reg(this, ir-type) automatically sets the writemask to the
proper size for the type; src_reg(dst_reg) preserves that.  This should
be equivalent, but less code.

Note that src_reg(dst_reg) either uses SWIZZLE_ or SWIZZLE_XYZW, so
the old code did need the manual writemask adjustment, since it
constructed the registers the other way around.

Signed-off-by: Kenneth Graunke kenn...@whitecape.org
Reviewed-by: Matt Turner matts...@gmail.com

---

 src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp |   19 ++-
 1 file changed, 6 insertions(+), 13 deletions(-)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp 
b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
index 0b2b9ca..d0587cd 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp
@@ -1259,8 +1259,6 @@ vec4_visitor::visit(ir_expression *ir)
 {
unsigned int operand;
src_reg op[Elements(ir-operands)];
-   src_reg result_src;
-   dst_reg result_dst;
vec4_instruction *inst;
 
if (ir-operation == ir_binop_add) {
@@ -1273,6 +1271,12 @@ vec4_visitor::visit(ir_expression *ir)
 return;
}
 
+   /* Storage for our result.  Ideally for an assignment we'd be using
+* the actual storage for the result here, instead.
+*/
+   dst_reg result_dst(this, ir-type);
+   src_reg result_src(result_dst);
+
for (operand = 0; operand  ir-get_num_operands(); operand++) {
   this-result.file = BAD_FILE;
   ir-operands[operand]-accept(this);
@@ -1289,19 +1293,8 @@ vec4_visitor::visit(ir_expression *ir)
   assert(!ir-operands[operand]-type-is_matrix());
}
 
-   /* Storage for our result.  Ideally for an assignment we'd be using
-* the actual storage for the result here, instead.
-*/
-   result_src = src_reg(this, ir-type);
-   /* convenience for the emit functions below. */
-   result_dst = dst_reg(result_src);
/* If nothing special happens, this is the result. */
this-result = result_src;
-   /* Limit writes to the channels that will be used by result_src later.
-* This does limit this temp's use as a temporary for multi-instruction
-* sequences.
-*/
-   result_dst.writemask = (1  ir-type-vector_elements) - 1;
 
switch (ir-operation) {
case ir_unop_logic_not:

___
mesa-commit mailing list
mesa-commit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-commit