Mesa (master): mesa: Use SSE prefetch instructions rather than 3DNow instructions

2016-02-04 Thread Timothy Arceri
Module: Mesa
Branch: master
Commit: 9c78cfd547a69f6f45d7acaa8ade681640caee95
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9c78cfd547a69f6f45d7acaa8ade681640caee95

Author: Patrick Baggett 
Date:   Thu Feb  4 08:05:54 2016 +1100

mesa: Use SSE prefetch instructions rather than 3DNow instructions

64-bit Pentium 4 CPUs don't have the 3DNow prefetch instructions
which results in an Illegal instruction crash.

Cc: "11.0 11.1" 
Reviewed-by: Roland Scheidegger 
Tested-by: Timothy Arceri 
https://bugs.freedesktop.org/show_bug.cgi?id=27512

---

 src/mesa/x86-64/xform4.S | 40 
 1 file changed, 20 insertions(+), 20 deletions(-)

diff --git a/src/mesa/x86-64/xform4.S b/src/mesa/x86-64/xform4.S
index c185f62..b0aca19 100644
--- a/src/mesa/x86-64/xform4.S
+++ b/src/mesa/x86-64/xform4.S
@@ -69,7 +69,7 @@ _mesa_x86_64_transform_points4_general:
movq V4F_START(%rdx), %rdx  /* ptr to first src vertex */
movq V4F_START(%rdi), %rdi  /* ptr to first dest vertex */
 
-   prefetch 16(%rdx)
+   prefetcht1 16(%rdx)
 
movaps 0(%rsi), %xmm4   /* m3  | m2  | m1  | m0  */
movaps 16(%rsi), %xmm5  /* m7  | m6  | m5  | m4  */
@@ -80,7 +80,7 @@ _mesa_x86_64_transform_points4_general:
 p4_general_loop:
 
movups (%rdx), %xmm8/* ox | oy | oz | ow */
-   prefetchw 16(%rdi)
+   prefetcht1 16(%rdi)
 
pshufd $0x00, %xmm8, %xmm0  /* ox | ox | ox | ox */
addq %rax, %rdx
@@ -93,7 +93,7 @@ p4_general_loop:
addps %xmm1, %xmm0  /* ox*m3+oy*m7 | ... */
mulps %xmm7, %xmm3  /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */
addps %xmm2, %xmm0  /* ox*m3+oy*m7+oz*m11 | ... */
-   prefetch 16(%rdx)
+   prefetcht1 16(%rdx)
addps %xmm3, %xmm0  /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */
 
movaps %xmm0, (%rdi)/* ->D(3) | ->D(2) | ->D(1) | ->D(0) */
@@ -150,7 +150,7 @@ _mesa_x86_64_transform_points4_3d:
movq V4F_START(%rdx), %rdx  /* ptr to first src vertex */
movq V4F_START(%rdi), %rdi  /* ptr to first dest vertex */
 
-   prefetch 16(%rdx)
+   prefetcht1 16(%rdx)
 
movaps 0(%rsi), %xmm4   /* m3  | m2  | m1  | m0  */
movaps 16(%rsi), %xmm5  /* m7  | m6  | m5  | m4  */
@@ -166,7 +166,7 @@ _mesa_x86_64_transform_points4_3d:
 p4_3d_loop:
 
movups (%rdx), %xmm8/* ox | oy | oz | ow */
-   prefetchw 16(%rdi)
+   prefetcht1 16(%rdi)
 
pshufd $0x00, %xmm8, %xmm0  /* ox | ox | ox | ox */
addq %rax, %rdx
@@ -179,7 +179,7 @@ p4_3d_loop:
addps %xmm1, %xmm0  /* ox*m3+oy*m7 | ... */
mulps %xmm7, %xmm3  /* ow*m15 | ow*m14 | ow*m13 | ow*m12 */
addps %xmm2, %xmm0  /* ox*m3+oy*m7+oz*m11 | ... */
-   prefetch 16(%rdx)
+   prefetcht1 16(%rdx)
addps %xmm3, %xmm0  /* ox*m3+oy*m7+oz*m11+ow*m15 | ... */
 
movaps %xmm0, (%rdi)/* ->D(3) | ->D(2) | ->D(1) | ->D(0) */
@@ -210,8 +210,8 @@ _mesa_x86_64_transform_points4_identity:
 
movq V4F_START(%rdx), %rsi  /* ptr to first src vertex */
movq V4F_START(%rdi), %rdi  /* ptr to first dest vertex */
-   prefetch 64(%rsi)
-   prefetchw 64(%rdi)
+   prefetcht1 64(%rsi)
+   prefetcht1 64(%rdi)
 
add %ecx, %ecx
 
@@ -242,7 +242,7 @@ _mesa_3dnow_transform_points4_3d_no_rot:
movq V4F_START(%rdx), %rdx  /* ptr to first src vertex */
movq V4F_START(%rdi), %rdi  /* ptr to first dest vertex */
 
-   prefetch (%rdx)
+   prefetcht1 (%rdx)

movd (%rsi), %mm0   /* | m00 */
.byte 0x66, 0x66, 0x90  /* manual align += 3 */
@@ -255,7 +255,7 @@ _mesa_3dnow_transform_points4_3d_no_rot:
 
 p4_3d_no_rot_loop:
 
-   prefetchw 32(%rdi)
+   prefetcht1 32(%rdi)

movq  (%rdx), %mm4  /* x1  | x0  */
movq  8(%rdx), %mm5 /* x3  | x2  */
@@ -279,7 +279,7 @@ p4_3d_no_rot_loop:
addq $16, %rdi

decl %ecx
-   prefetch 32(%rdx)
+   prefetcht1 32(%rdx)
jnz p4_3d_no_rot_loop
 
 p4_3d_no_rot_done:
@@ -311,7 +311,7 @@ _mesa_3dnow_transform_points4_perspective:
punpckldq 20(%rsi), %mm0/* m11 | m00 */

movq 32(%rsi), %mm2 /* m21 | m20 */
-   prefetch (%rdx)
+   prefetcht1 (%rdx)

movd 40(%rsi), %mm1 /* | m22 */
 
@@ -321,7 +321,7 @@ _mesa_3dnow_transform_points4_perspective:
 
 p4_perspective_loop:
 
-   prefetchw 32(%rdi)  /* prefetch 2 vertices ahead 

Mesa (master): 46 new commits

2016-02-04 Thread Axel Davy
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=94d91c67077a5efd13b9505fe01a3c80ccb37bc9
Author: Axel Davy 
Date:   Thu Jan 28 22:32:43 2016 +0100

st/nine: Use align_free when needed

Use align_free to free memory allocated
with align_malloc.

Signed-off-by: Axel Davy 
Reviewed-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=6b12fe77ea7bbd8f159c0902a7c1d4ab22d4629c
Author: Axel Davy 
Date:   Tue Jan 26 16:40:30 2016 +0100

st/nine: Disallow non-argb cursors

Only argb cursors are allowed.

Signed-off-by: Axel Davy 
Reviewed-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=24ddadbba9ddfde579cc4cc65f58b063122b8d02
Author: Axel Davy 
Date:   Sat Jan 9 14:16:15 2016 +0100

st/nine: Enforce centroid for color input when multisampling is on

The color inputs must automatically use centroid whether
multisampling is used or not.

Signed-off-by: Axel Davy 
Reviewed-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=d5389bb92d5dfa1676cf28a80392f0fcb0eb8dc8
Author: Axel Davy 
Date:   Thu Jan 28 22:44:42 2016 +0100

st/nine: Fix centroid flag

sem.reg.mod & NINED3DSPDM_CENTROID is worth 4 when
centroid is requested, whereas
TGSI_INTERPOLATE_LOC_CENTROID is worth 1.

Signed-off-by: Axel Davy 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=ee31f0fed4bd97e3c9a0c4547ad908d55607f532
Author: Axel Davy 
Date:   Mon Jan 4 16:15:18 2016 +0100

st/nine: Use fast clears more often for MRTs

This enables to use fast clears in the following
case:

pixel shader renders to 1 RT
4 RT bound
clear
new pixel shader bound that renders to 4 RTs

Previously the fast clear path wouldn't be hit,
because when trying the fast clear path,
the framebuffer state would be configured for 1 RT,
instead of 4.

Signed-off-by: Axel Davy 
Reviewed-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e85ef7d8e501b3f0a94d8e53fbd3372ba24b89ec
Author: Axel Davy 
Date:   Mon Jan 4 16:13:07 2016 +0100

st/nine: Use linear filtering for shadow mapping

Some docs say linear filtering is always used when
app does shadow mapping.

Signed-off-by: Axel Davy 
Reviewed-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=0b35da59deff0d6671649a6aedc10b3c81aeb8a7
Author: Patrick Rudolph 
Date:   Thu Oct 22 15:46:16 2015 +0200

st/nine: Respect block alignment on surface lock

Respect block alignment for ATI1/ATI2 format when trying to lock a
surface using LockRect().
Fixes failing WINE tests device.c test_surface_blocks() tests.

Signed-off-by: Patrick Rudolph 
Reviewed-by: Axel Davy 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=56b4222b299ff08da4eda63fcc608dc77fc585f1
Author: Axel Davy 
Date:   Sat May 16 14:28:41 2015 +0200

st/nine: Add Render state validation layer

Testing Win behaviour seems to show wrong states
are accepted, but then depending on the states
some specific 'good' behaviours happen.

This adds some validation to catch invalid
states and have these 'good' behaviours
when it happens.

Also reorders SetRenderState to match the expected
optimisation:
(Value == previous Value) => return immediately,
which affects D3D9 hacks too.

Signed-off-by: Axel Davy 
Signed-off-by: Patrick Rudolph 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7132617436dda072f874f6f206847e62038ce39e
Author: Patrick Rudolph 
Date:   Mon May 25 13:06:58 2015 +0200

DRI_CONFIG: Add option to override vendor id

Add config option override_vendorid to report a fake card in d3dadapter9 
drm.

Signed-off-by: Patrick Rudolph 
Reviewed-by: Axel Davy 

URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1a893ac8869a0be08582f3b224d1a92ff37fc400
Author: Patrick Rudolph 
Date:   Wed Sep 30 16:42:10 2015 +0200

st/nine: Implement NineDevice9_GetAvailableTextureMem

Implement a device private memory counter similar to Win 7.

Only textures and surfaces increment vidmem and may return
ERR_OUTOFVIDEOMEMORY. Vertexbuffers and indexbuffers creation always
succeedes, even when out of video memory.

Fixes "Vampire: The Masquerade - 

Mesa (master): glsl: simplify setting of image access qualifiers

2016-02-04 Thread Timothy Arceri
Module: Mesa
Branch: master
Commit: 23e24e27ac6044a6f669531a3ebf31ff25ae4a1e
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=23e24e27ac6044a6f669531a3ebf31ff25ae4a1e

Author: Timothy Arceri 
Date:   Thu Feb  4 11:08:43 2016 +1100

glsl: simplify setting of image access qualifiers

Cc: Francisco Jerez 
Reviewed-by: Iago Toral Quiroga 

---

 src/compiler/glsl/link_uniforms.cpp | 84 ++---
 1 file changed, 21 insertions(+), 63 deletions(-)

diff --git a/src/compiler/glsl/link_uniforms.cpp 
b/src/compiler/glsl/link_uniforms.cpp
index 33b2d4c..7072c16 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -471,10 +471,11 @@ private:
  */
 class parcel_out_uniform_storage : public program_resource_visitor {
 public:
-   parcel_out_uniform_storage(struct string_to_uint_map *map,
+   parcel_out_uniform_storage(struct gl_shader_program *prog,
+  struct string_to_uint_map *map,
  struct gl_uniform_storage *uniforms,
  union gl_constant_value *values)
-  : map(map), uniforms(uniforms), values(values)
+  : prog(prog), map(map), uniforms(uniforms), values(values)
{
}
 
@@ -492,8 +493,7 @@ public:
   memset(this->targets, 0, sizeof(this->targets));
}
 
-   void set_and_process(struct gl_shader_program *prog,
-   ir_variable *var)
+   void set_and_process(ir_variable *var)
{
   current_var = var;
   field_counter = 0;
@@ -643,6 +643,16 @@ private:
  uniform->opaque[shader_type].index = this->next_image;
  uniform->opaque[shader_type].active = true;
 
+ /* Set image access qualifiers */
+ const GLenum access =
+(current_var->data.image_read_only ? GL_READ_ONLY :
+ current_var->data.image_write_only ? GL_WRITE_ONLY :
+GL_READ_WRITE);
+
+ for (unsigned j = 0; j < MAX2(1, uniform->array_elements); ++j)
+prog->_LinkedShaders[shader_type]->
+   ImageAccess[this->next_image + j] = access;
+
  /* Increment the image index by 1 for non-arrays and by the
   * number of array elements for arrays.
   */
@@ -844,6 +854,11 @@ private:
   this->values += values_for_type(type);
}
 
+   /**
+* Current program being processed.
+*/
+   struct gl_shader_program *prog;
+
struct string_to_uint_map *map;
 
struct gl_uniform_storage *uniforms;
@@ -1007,40 +1022,6 @@ link_update_uniform_buffer_variables(struct gl_shader 
*shader)
}
 }
 
-static void
-link_set_image_access_qualifiers(struct gl_shader_program *prog,
- gl_shader *sh, unsigned shader_stage,
- ir_variable *var, const glsl_type *type,
- char **name, size_t name_length)
-{
-   /* Handle arrays of arrays */
-   if (type->is_array() && type->fields.array->is_array()) {
-  for (unsigned i = 0; i < type->length; i++) {
-size_t new_length = name_length;
-
-/* Append the subscript to the current variable name */
-ralloc_asprintf_rewrite_tail(name, _length, "[%u]", i);
-
- link_set_image_access_qualifiers(prog, sh, shader_stage, var,
-  type->fields.array, name,
-  new_length);
-  }
-   } else {
-  unsigned id = 0;
-  bool found = prog->UniformHash->get(id, *name);
-  assert(found);
-  (void) found;
-  const gl_uniform_storage *storage = >UniformStorage[id];
-  const unsigned index = storage->opaque[shader_stage].index;
-  const GLenum access = (var->data.image_read_only ? GL_READ_ONLY :
- var->data.image_write_only ? GL_WRITE_ONLY :
- GL_READ_WRITE);
-
-  for (unsigned j = 0; j < MAX2(1, storage->array_elements); ++j)
- sh->ImageAccess[index + j] = access;
-   }
-}
-
 /**
  * Combine the hidden uniform hash map with the uniform hash map so that the
  * hidden uniforms will be given indicies at the end of the uniform storage
@@ -1148,7 +1129,7 @@ link_assign_uniform_locations(struct gl_shader_program 
*prog,
union gl_constant_value *data_end = [num_data_slots];
 #endif
 
-   parcel_out_uniform_storage parcel(prog->UniformHash, uniforms, data);
+   parcel_out_uniform_storage parcel(prog, prog->UniformHash, uniforms, data);
 
for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
   if (prog->_LinkedShaders[i] == NULL)
@@ -1163,7 +1144,7 @@ link_assign_uniform_locations(struct gl_shader_program 
*prog,
var->data.mode != ir_var_shader_storage))
continue;
 
-parcel.set_and_process(prog, var);
+parcel.set_and_process(var);
   }
 
   prog->_LinkedShaders[i]->active_samplers = 

Mesa (master): mesa: remove dead program parameter functions

2016-02-04 Thread Timothy Arceri
Module: Mesa
Branch: master
Commit: 815929bd157503b149d429bc494d1dad92c902e6
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=815929bd157503b149d429bc494d1dad92c902e6

Author: Timothy Arceri 
Date:   Thu Feb  4 21:50:39 2016 +1100

mesa: remove dead program parameter functions

Reviewed-by: Iago Toral Quiroga 

---

 src/mesa/program/prog_parameter.c | 70 ---
 src/mesa/program/prog_parameter.h |  7 
 2 files changed, 77 deletions(-)

diff --git a/src/mesa/program/prog_parameter.c 
b/src/mesa/program/prog_parameter.c
index e98946b..34183d4 100644
--- a/src/mesa/program/prog_parameter.c
+++ b/src/mesa/program/prog_parameter.c
@@ -454,73 +454,3 @@ _mesa_lookup_parameter_constant(const struct 
gl_program_parameter_list *list,
*posOut = -1;
return GL_FALSE;
 }
-
-
-struct gl_program_parameter_list *
-_mesa_clone_parameter_list(const struct gl_program_parameter_list *list)
-{
-   struct gl_program_parameter_list *clone;
-   GLuint i;
-
-   clone = _mesa_new_parameter_list();
-   if (!clone)
-  return NULL;
-
-   /** Not too efficient, but correct */
-   for (i = 0; i < list->NumParameters; i++) {
-  struct gl_program_parameter *p = list->Parameters + i;
-  struct gl_program_parameter *pCopy;
-  GLuint size = MIN2(p->Size, 4);
-  GLint j = _mesa_add_parameter(clone, p->Type, p->Name, size, p->DataType,
-list->ParameterValues[i], NULL);
-  assert(j >= 0);
-  pCopy = clone->Parameters + j;
-  /* copy state indexes */
-  if (p->Type == PROGRAM_STATE_VAR) {
- GLint k;
- for (k = 0; k < STATE_LENGTH; k++) {
-pCopy->StateIndexes[k] = p->StateIndexes[k];
- }
-  }
-  else {
- clone->Parameters[j].Size = p->Size;
-  }
-  
-   }
-
-   clone->StateFlags = list->StateFlags;
-
-   return clone;
-}
-
-
-/**
- * Return a new parameter list which is listA + listB.
- */
-struct gl_program_parameter_list *
-_mesa_combine_parameter_lists(const struct gl_program_parameter_list *listA,
-  const struct gl_program_parameter_list *listB)
-{
-   struct gl_program_parameter_list *list;
-
-   if (listA) {
-  list = _mesa_clone_parameter_list(listA);
-  if (list && listB) {
- GLuint i;
- for (i = 0; i < listB->NumParameters; i++) {
-struct gl_program_parameter *param = listB->Parameters + i;
-_mesa_add_parameter(list, param->Type, param->Name, param->Size,
-param->DataType,
-listB->ParameterValues[i],
-param->StateIndexes);
- }
-  }
-   }
-   else if (listB) {
-  list = _mesa_clone_parameter_list(listB);
-   }
-   else {
-  list = NULL;
-   }
-   return list;
-}
diff --git a/src/mesa/program/prog_parameter.h 
b/src/mesa/program/prog_parameter.h
index 44700b7..c04d7a2 100644
--- a/src/mesa/program/prog_parameter.h
+++ b/src/mesa/program/prog_parameter.h
@@ -99,13 +99,6 @@ _mesa_new_parameter_list_sized(unsigned size);
 extern void
 _mesa_free_parameter_list(struct gl_program_parameter_list *paramList);
 
-extern struct gl_program_parameter_list *
-_mesa_clone_parameter_list(const struct gl_program_parameter_list *list);
-
-extern struct gl_program_parameter_list *
-_mesa_combine_parameter_lists(const struct gl_program_parameter_list *a,
-  const struct gl_program_parameter_list *b);
-
 static inline GLuint
 _mesa_num_parameters(const struct gl_program_parameter_list *list)
 {

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


Mesa (master): mesa: Add QueryBuffer to context

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 2d0ec0c272d7b05c782802d32ff1993e8532307f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2d0ec0c272d7b05c782802d32ff1993e8532307f

Author: Rafal Mielniczuk 
Date:   Thu Mar 27 21:59:04 2014 +0100

mesa: Add QueryBuffer to context

Add QueryBuffer and initialise it to NullBufferObj on start

Signed-off-by: Rafal Mielniczuk 
[imirkin: also release QueryBuffer on free]
Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/main/bufferobj.c | 14 ++
 src/mesa/main/mtypes.h|  2 ++
 2 files changed, 16 insertions(+)

diff --git a/src/mesa/main/bufferobj.c b/src/mesa/main/bufferobj.c
index dba6934..de1aba4 100644
--- a/src/mesa/main/bufferobj.c
+++ b/src/mesa/main/bufferobj.c
@@ -121,6 +121,10 @@ get_buffer_target(struct gl_context *ctx, GLenum target)
   return >CopyReadBuffer;
case GL_COPY_WRITE_BUFFER:
   return >CopyWriteBuffer;
+   case GL_QUERY_BUFFER:
+  if (_mesa_has_ARB_query_buffer_object(ctx))
+ return >QueryBuffer;
+  break;
case GL_DRAW_INDIRECT_BUFFER:
   if ((ctx->API == API_OPENGL_CORE &&
ctx->Extensions.ARB_draw_indirect) ||
@@ -900,6 +904,9 @@ _mesa_init_buffer_objects( struct gl_context *ctx )
_mesa_reference_buffer_object(ctx, >DispatchIndirectBuffer,
 ctx->Shared->NullBufferObj);
 
+   _mesa_reference_buffer_object(ctx, >QueryBuffer,
+ ctx->Shared->NullBufferObj);
+
for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
   _mesa_reference_buffer_object(ctx,
>UniformBufferBindings[i].BufferObject,
@@ -948,6 +955,8 @@ _mesa_free_buffer_objects( struct gl_context *ctx )
 
_mesa_reference_buffer_object(ctx, >DispatchIndirectBuffer, NULL);
 
+   _mesa_reference_buffer_object(ctx, >QueryBuffer, NULL);
+
for (i = 0; i < MAX_COMBINED_UNIFORM_BUFFERS; i++) {
   _mesa_reference_buffer_object(ctx,
>UniformBufferBindings[i].BufferObject,
@@ -1380,6 +1389,11 @@ _mesa_DeleteBuffers(GLsizei n, const GLuint *ids)
 _mesa_BindBuffer(GL_EXTERNAL_VIRTUAL_MEMORY_BUFFER_AMD, 0);
  }
 
+ /* unbind query buffer binding point */
+ if (ctx->QueryBuffer == bufObj) {
+_mesa_BindBuffer(GL_QUERY_BUFFER, 0);
+ }
+
  /* The ID is immediately freed for re-use */
  _mesa_HashRemove(ctx->Shared->BufferObjects, ids[i]);
  /* Make sure we do not run into the classic ABA problem on bind.
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index fc2f6f7..0a42bfb 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -4441,6 +4441,8 @@ struct gl_context
struct gl_buffer_object *CopyReadBuffer; /**< GL_ARB_copy_buffer */
struct gl_buffer_object *CopyWriteBuffer; /**< GL_ARB_copy_buffer */
 
+   struct gl_buffer_object *QueryBuffer; /**< GL_ARB_query_buffer_object */
+
/**
 * Current GL_ARB_uniform_buffer_object binding referenced by
 * GL_UNIFORM_BUFFER target for glBufferData, glMapBuffer, etc.

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


Mesa (master): mesa: Handle QUERY_BUFFER_BINDING in GetIntegerv

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 3efcd4df014a6a083d48a22cb1fe03828abdf1bc
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=3efcd4df014a6a083d48a22cb1fe03828abdf1bc

Author: Rafal Mielniczuk 
Date:   Thu Mar 27 21:59:05 2014 +0100

mesa: Handle QUERY_BUFFER_BINDING in GetIntegerv

Signed-off-by: Rafal Mielniczuk 
[imirkin: move to GL/GL_CORE section]
Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/main/get.c  | 5 +
 src/mesa/main/get_hash_params.py | 3 +++
 2 files changed, 8 insertions(+)

diff --git a/src/mesa/main/get.c b/src/mesa/main/get.c
index 0434836..f78a98b 100644
--- a/src/mesa/main/get.c
+++ b/src/mesa/main/get.c
@@ -439,6 +439,7 @@ EXTRA_EXT(ARB_shader_image_load_store);
 EXTRA_EXT(ARB_viewport_array);
 EXTRA_EXT(ARB_compute_shader);
 EXTRA_EXT(ARB_gpu_shader5);
+EXTRA_EXT(ARB_query_buffer_object);
 EXTRA_EXT2(ARB_transform_feedback3, ARB_gpu_shader5);
 EXTRA_EXT(INTEL_performance_query);
 EXTRA_EXT(ARB_explicit_uniform_location);
@@ -1037,6 +1038,10 @@ find_custom_value(struct gl_context *ctx, const struct 
value_desc *d, union valu
case GL_SHADER_STORAGE_BUFFER_BINDING:
   v->value_int = ctx->ShaderStorageBuffer->Name;
   break;
+   /* GL_ARB_query_buffer_object */
+   case GL_QUERY_BUFFER_BINDING:
+  v->value_int = ctx->QueryBuffer->Name;
+  break;
/* GL_ARB_timer_query */
case GL_TIMESTAMP:
   if (ctx->Driver.GetTimestamp) {
diff --git a/src/mesa/main/get_hash_params.py b/src/mesa/main/get_hash_params.py
index 04aec03..fa07ee3 100644
--- a/src/mesa/main/get_hash_params.py
+++ b/src/mesa/main/get_hash_params.py
@@ -847,6 +847,9 @@ descriptor=[
 # GL_ARB_shader_storage_buffer_object
   [ "MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS", 
"CONTEXT_INT(Const.Program[MESA_SHADER_TESS_CTRL].MaxShaderStorageBlocks), 
extra_ARB_shader_storage_buffer_object" ],
   [ "MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS", 
"CONTEXT_INT(Const.Program[MESA_SHADER_TESS_EVAL].MaxShaderStorageBlocks), 
extra_ARB_shader_storage_buffer_object" ],
+
+# GL_ARB_query_buffer_object
+  [ "QUERY_BUFFER_BINDING", "LOC_CUSTOM, TYPE_INT, 0, 
extra_ARB_query_buffer_object" ],
 ]},
 
 # Enums restricted to OpenGL Core profile

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


Mesa (master): nvc0: add support for ARB_query_buffer_object

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 2fed18b8a54319f22888e3761a6ed5cd85f9688c
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2fed18b8a54319f22888e3761a6ed5cd85f9688c

Author: Ilia Mirkin 
Date:   Sun Jan 31 15:18:23 2016 -0500

nvc0: add support for ARB_query_buffer_object

Signed-off-by: Ilia Mirkin 

---

 docs/GL3.txt   |   2 +-
 docs/relnotes/11.2.0.html  |   1 +
 src/gallium/drivers/nouveau/nvc0/mme/com9097.mme   |  49 
 src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h |  33 ++
 src/gallium/drivers/nouveau/nvc0/nvc0_context.c|  13 +--
 src/gallium/drivers/nouveau/nvc0/nvc0_macros.h |   2 +
 src/gallium/drivers/nouveau/nvc0/nvc0_query.c  |  21 +++-
 src/gallium/drivers/nouveau/nvc0/nvc0_query.h  |   7 ++
 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c   | 123 -
 src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.h   |   2 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c |   5 +-
 .../drivers/nouveau/nvc0/nvc0_shader_state.c   |   2 +-
 src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c|   2 +-
 13 files changed, 241 insertions(+), 21 deletions(-)

diff --git a/docs/GL3.txt b/docs/GL3.txt
index 7623ada..257fc73 100644
--- a/docs/GL3.txt
+++ b/docs/GL3.txt
@@ -186,7 +186,7 @@ GL 4.4, GLSL 4.40:
   - specified transform/feedback layoutin progress
   - input/output block locations   DONE
   GL_ARB_multi_bindDONE (all drivers)
-  GL_ARB_query_buffer_object   not started
+  GL_ARB_query_buffer_object   DONE (nvc0)
   GL_ARB_texture_mirror_clamp_to_edge  DONE (i965, nv50, nvc0, 
r600, radeonsi, llvmpipe, softpipe)
   GL_ARB_texture_stencil8  DONE (nv50, nvc0, r600, 
radeonsi, llvmpipe, softpipe)
   GL_ARB_vertex_type_10f_11f_11f_rev   DONE (i965, nv50, nvc0, 
r600, radeonsi, llvmpipe, softpipe)
diff --git a/docs/relnotes/11.2.0.html b/docs/relnotes/11.2.0.html
index 404e293..c35ee9a 100644
--- a/docs/relnotes/11.2.0.html
+++ b/docs/relnotes/11.2.0.html
@@ -48,6 +48,7 @@ Note: some of the new features are only available with 
certain drivers.
 GL_ARB_compute_shader on i965
 GL_ARB_copy_image on r600
 GL_ARB_indirect_parameters on nvc0
+GL_ARB_query_buffer_object on nvc0
 GL_ARB_shader_atomic_counters on nvc0
 GL_ARB_shader_draw_parameters on i965, nvc0
 GL_ARB_shader_storage_buffer_object on nvc0
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme 
b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme
index 4daa57d..7f76ec6 100644
--- a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme
+++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme
@@ -491,3 +491,52 @@ daic_runout:
 daic_runout_check:
branz annul $r7 #daic_runout
bra annul #daic_restore
+
+/* NVC0_3D_MACRO_QUERY_BUFFER_WRITE:
+ *
+ * This is a combination macro for all of our query buffer object needs.
+ * It has the option to clamp results to a configurable amount, as well as
+ * to write out one or two words.
+ *
+ * We use the query engine to write out the values, and expect the query
+ * address to point to the right place.
+ *
+ * arg = clamp value (0 means unclamped). clamped means just 1 written value.
+ * parm[0] = LSB of end value
+ * parm[1] = MSB of end value
+ * parm[2] = LSB of start value
+ * parm[3] = MSB of start value
+ * parm[4] = desired sequence
+ * parm[5] = actual sequence
+ */
+.section #mme9097_query_buffer_write
+   parm $r2
+   parm $r3
+   parm $r4
+   parm $r5 maddr 0x16c2 /* QUERY_SEQUENCE */
+   parm $r6
+   parm $r7
+   mov $r6 (sub $r7 $r6) /* actual - desired */
+   mov $r6 (sbb 0x0 0x0) /* if there was underflow, not reached yet */
+   braz annul $r6 #qbw_ready
+   exit
+qbw_ready:
+   mov $r2 (sub $r2 $r4)
+   braz $r1 #qbw_postclamp
+   mov $r3 (sbb $r3 $r5)
+   branz annul $r3 #qbw_clamp
+   mov $r4 (sub $r1 $r2)
+   mov $r4 (sbb 0x0 0x0)
+   braz annul $r4 #qbw_postclamp
+qbw_clamp:
+   mov $r2 $r1
+qbw_postclamp:
+   send $r2
+   mov $r4 0x1000
+   branz annul $r1 #qbw_done
+   send (extrinsrt 0x0 $r4 0x0 0x10 0x10)
+   maddr 0x16c2 /* QUERY_SEQUENCE */
+   send $r3
+qbw_done:
+   exit send (extrinsrt 0x0 $r4 0x0 0x10 0x10)
+   nop
diff --git a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h 
b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h
index bf8625e..ecadf7e 100644
--- a/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h
+++ b/src/gallium/drivers/nouveau/nvc0/mme/com9097.mme.h
@@ -332,3 +332,36 @@ uint32_t mme9097_draw_arrays_indirect_count[] = {
0xfffef837,
0xfffdc027,
 };
+
+uint32_t mme9097_query_buffer_write[] = {
+   0x0201,
+   0x0301,
+/* 0x000a: qbw_ready */
+   0x0401,
+   0x05b08551,
+/* 0x0011: qbw_clamp */
+/* 0x0012: qbw_postclamp */
+   0x0601,
+   0x0701,
+/* 0x0018: 

Mesa (master): st/mesa: add query buffer support

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 9cd5bb9f9f5838e2e6e205a61a931971bef713e3
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=9cd5bb9f9f5838e2e6e205a61a931971bef713e3

Author: Ilia Mirkin 
Date:   Sat May  9 12:31:48 2015 -0400

st/mesa: add query buffer support

Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/state_tracker/st_cb_bufferobjects.c  |  3 +
 src/mesa/state_tracker/st_cb_queryobj.c   | 97 ++-
 src/mesa/state_tracker/st_cb_texturebarrier.c |  3 +
 src/mesa/state_tracker/st_extensions.c|  1 +
 4 files changed, 103 insertions(+), 1 deletion(-)

diff --git a/src/mesa/state_tracker/st_cb_bufferobjects.c 
b/src/mesa/state_tracker/st_cb_bufferobjects.c
index 1951366..202b4ee 100644
--- a/src/mesa/state_tracker/st_cb_bufferobjects.c
+++ b/src/mesa/state_tracker/st_cb_bufferobjects.c
@@ -241,6 +241,9 @@ st_bufferobj_data(struct gl_context *ctx,
case GL_SHADER_STORAGE_BUFFER:
   bind = PIPE_BIND_SHADER_BUFFER;
   break;
+   case GL_QUERY_BUFFER:
+  bind = PIPE_BIND_QUERY_BUFFER;
+  break;
default:
   bind = 0;
}
diff --git a/src/mesa/state_tracker/st_cb_queryobj.c 
b/src/mesa/state_tracker/st_cb_queryobj.c
index aafae16..fc239bc 100644
--- a/src/mesa/state_tracker/st_cb_queryobj.c
+++ b/src/mesa/state_tracker/st_cb_queryobj.c
@@ -39,9 +39,11 @@
 #include "pipe/p_context.h"
 #include "pipe/p_defines.h"
 #include "pipe/p_screen.h"
+#include "util/u_inlines.h"
 #include "st_context.h"
 #include "st_cb_queryobj.h"
 #include "st_cb_bitmap.h"
+#include "st_cb_bufferobjects.h"
 
 
 static struct gl_query_object *
@@ -271,7 +273,7 @@ st_WaitQuery(struct gl_context *ctx, struct gl_query_object 
*q)
{
   /* nothing */
}
-   
+
q->Ready = GL_TRUE;
 }
 
@@ -303,6 +305,98 @@ st_GetTimestamp(struct gl_context *ctx)
}
 }
 
+static void
+st_StoreQueryResult(struct gl_context *ctx, struct gl_query_object *q,
+struct gl_buffer_object *buf, intptr_t offset,
+GLenum pname, GLenum ptype)
+{
+   struct pipe_context *pipe = st_context(ctx)->pipe;
+   struct st_query_object *stq = st_query_object(q);
+   struct st_buffer_object *stObj = st_buffer_object(buf);
+   boolean wait = pname == GL_QUERY_RESULT;
+   enum pipe_query_value_type result_type;
+   int index;
+
+   /* GL_QUERY_TARGET is a bit of an extension since it has nothing to
+* do with the GPU end of the query. Write it in "by hand".
+*/
+   if (pname == GL_QUERY_TARGET) {
+  /* Assume that the data must be LE. The endianness situation wrt CPU and
+   * GPU is incredibly confusing, but the vast majority of GPUs are
+   * LE. When a BE one comes along, this needs some form of resolution.
+   */
+  unsigned data[2] = { CPU_TO_LE32(q->Target), 0 };
+  pipe_buffer_write(pipe, stObj->buffer, offset,
+(ptype == GL_INT64_ARB ||
+ ptype == GL_UNSIGNED_INT64_ARB) ? 8 : 4,
+data);
+  return;
+   }
+
+   switch (ptype) {
+   case GL_INT:
+  result_type = PIPE_QUERY_TYPE_I32;
+  break;
+   case GL_UNSIGNED_INT:
+  result_type = PIPE_QUERY_TYPE_U32;
+  break;
+   case GL_INT64_ARB:
+  result_type = PIPE_QUERY_TYPE_I64;
+  break;
+   case GL_UNSIGNED_INT64_ARB:
+  result_type = PIPE_QUERY_TYPE_U64;
+  break;
+   default:
+  unreachable("Unexpected result type");
+   }
+
+   if (pname == GL_QUERY_RESULT_AVAILABLE) {
+  index = -1;
+   } else if (stq->type == PIPE_QUERY_PIPELINE_STATISTICS) {
+  switch (q->Target) {
+  case GL_VERTICES_SUBMITTED_ARB:
+ index = 0;
+ break;
+  case GL_PRIMITIVES_SUBMITTED_ARB:
+ index = 1;
+ break;
+  case GL_VERTEX_SHADER_INVOCATIONS_ARB:
+ index = 2;
+ break;
+  case GL_GEOMETRY_SHADER_INVOCATIONS:
+ index = 3;
+ break;
+  case GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB:
+ index = 4;
+ break;
+  case GL_CLIPPING_INPUT_PRIMITIVES_ARB:
+ index = 5;
+ break;
+  case GL_CLIPPING_OUTPUT_PRIMITIVES_ARB:
+ index = 6;
+ break;
+  case GL_FRAGMENT_SHADER_INVOCATIONS_ARB:
+ index = 7;
+ break;
+  case GL_TESS_CONTROL_SHADER_PATCHES_ARB:
+ index = 8;
+ break;
+  case GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB:
+ index = 9;
+ break;
+  case GL_COMPUTE_SHADER_INVOCATIONS_ARB:
+ index = 10;
+ break;
+  default:
+ unreachable("Unexpected target");
+  }
+   } else {
+  index = 0;
+   }
+
+   pipe->get_query_result_resource(pipe, stq->pq, wait, result_type, index,
+   stObj->buffer, offset);
+}
 
 void st_init_query_functions(struct dd_function_table *functions)
 {
@@ -313,4 +407,5 @@ void 

Mesa (master): mesa: Add ARB_query_buffer_object extension flag

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: c5bab061dadea5627e8535a651ac5318bde9dad1
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=c5bab061dadea5627e8535a651ac5318bde9dad1

Author: Rafal Mielniczuk 
Date:   Thu Mar 27 21:59:03 2014 +0100

mesa: Add ARB_query_buffer_object extension flag

Signed-off-by: Rafal Mielniczuk 
[imirkin: add string to extensions.c]
Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/main/extensions_table.h | 1 +
 src/mesa/main/mtypes.h   | 1 +
 2 files changed, 2 insertions(+)

diff --git a/src/mesa/main/extensions_table.h b/src/mesa/main/extensions_table.h
index ad5dc60..07e0cab 100644
--- a/src/mesa/main/extensions_table.h
+++ b/src/mesa/main/extensions_table.h
@@ -88,6 +88,7 @@ EXT(ARB_point_parameters, 
EXT_point_parameters
 EXT(ARB_point_sprite, ARB_point_sprite 
  , GLL, GLC,  x ,  x , 2003)
 EXT(ARB_program_interface_query , dummy_true   
  , GLL, GLC,  x ,  x , 2012)
 EXT(ARB_provoking_vertex, EXT_provoking_vertex 
  , GLL, GLC,  x ,  x , 2009)
+EXT(ARB_query_buffer_object , ARB_query_buffer_object  
  , GLL, GLC,  x ,  x , 2013)
 EXT(ARB_robustness  , dummy_true   
  , GLL, GLC,  x ,  x , 2010)
 EXT(ARB_sample_shading  , ARB_sample_shading   
  , GLL, GLC,  x ,  x , 2009)
 EXT(ARB_sampler_objects , dummy_true   
  , GLL, GLC,  x ,  x , 2009)
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 58064aa..fc2f6f7 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -3791,6 +3791,7 @@ struct gl_extensions
GLboolean ARB_occlusion_query2;
GLboolean ARB_pipeline_statistics_query;
GLboolean ARB_point_sprite;
+   GLboolean ARB_query_buffer_object;
GLboolean ARB_sample_shading;
GLboolean ARB_seamless_cube_map;
GLboolean ARB_shader_atomic_counters;

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


Mesa (master): glapi: Add xml infrastructure for ARB_query_buffer_object

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 4913d381a02415cffc9062723fe875a44a1b1a5a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=4913d381a02415cffc9062723fe875a44a1b1a5a

Author: Rafal Mielniczuk 
Date:   Thu Mar 27 21:59:02 2014 +0100

glapi: Add xml infrastructure for ARB_query_buffer_object

Signed-off-by: Rafal Mielniczuk 
[imirkin: move definition to gl_API.xml as it is very short]
Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mapi/glapi/gen/gl_API.xml | 9 -
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/mapi/glapi/gen/gl_API.xml b/src/mapi/glapi/gen/gl_API.xml
index d7ab3bf..b917f81 100644
--- a/src/mapi/glapi/gen/gl_API.xml
+++ b/src/mapi/glapi/gen/gl_API.xml
@@ -8247,7 +8247,14 @@
 
 http://www.w3.org/2001/XInclude"/>
 
-
+
+
+
+
+
+
+
+
 
 http://www.w3.org/2001/XInclude"/>
 

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


Mesa (master): mesa: add driver interface for writing query results to buffers

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 7c3f4b2fd8630aafef491aa7d068f65f05a38285
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=7c3f4b2fd8630aafef491aa7d068f65f05a38285

Author: Ilia Mirkin 
Date:   Tue May  5 22:57:41 2015 -0400

mesa: add driver interface for writing query results to buffers

Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/main/dd.h | 9 +
 1 file changed, 9 insertions(+)

diff --git a/src/mesa/main/dd.h b/src/mesa/main/dd.h
index d4378e5..cfe0a82 100644
--- a/src/mesa/main/dd.h
+++ b/src/mesa/main/dd.h
@@ -726,6 +726,15 @@ struct dd_function_table {
void (*EndQuery)(struct gl_context *ctx, struct gl_query_object *q);
void (*CheckQuery)(struct gl_context *ctx, struct gl_query_object *q);
void (*WaitQuery)(struct gl_context *ctx, struct gl_query_object *q);
+   /*
+* \pname the value requested to be written (GL_QUERY_RESULT, etc)
+* \ptype the type of the value requested to be written:
+*GL_UNSIGNED_INT, GL_UNSIGNED_INT64_ARB,
+*GL_INT, GL_INT64_ARB
+*/
+   void (*StoreQueryResult)(struct gl_context *ctx, struct gl_query_object *q,
+struct gl_buffer_object *buf, intptr_t offset,
+GLenum pname, GLenum ptype);
/*@}*/
 
/**

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


Mesa (master): mesa: add core implementation of ARB_query_buffer_object

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 386a9ec77b7113c1e0c29c30b981a50175ac16e8
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=386a9ec77b7113c1e0c29c30b981a50175ac16e8

Author: Ilia Mirkin 
Date:   Tue May  5 22:58:12 2015 -0400

mesa: add core implementation of ARB_query_buffer_object

Forwards query result writes to drivers.

Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/mesa/main/queryobj.c | 285 +++
 1 file changed, 138 insertions(+), 147 deletions(-)

diff --git a/src/mesa/main/queryobj.c b/src/mesa/main/queryobj.c
index 9836685..b86692a 100644
--- a/src/mesa/main/queryobj.c
+++ b/src/mesa/main/queryobj.c
@@ -23,6 +23,7 @@
  */
 
 
+#include "bufferobj.h"
 #include "glheader.h"
 #include "context.h"
 #include "enums.h"
@@ -732,14 +733,16 @@ _mesa_GetQueryiv(GLenum target, GLenum pname, GLint 
*params)
_mesa_GetQueryIndexediv(target, 0, pname, params);
 }
 
-void GLAPIENTRY
-_mesa_GetQueryObjectiv(GLuint id, GLenum pname, GLint *params)
+static void
+get_query_object(struct gl_context *ctx, const char *func,
+ GLuint id, GLenum pname, GLenum ptype,
+ struct gl_buffer_object *buf, intptr_t offset)
 {
struct gl_query_object *q = NULL;
-   GET_CURRENT_CONTEXT(ctx);
+   uint64_t value;
 
if (MESA_VERBOSE & VERBOSE_API)
-  _mesa_debug(ctx, "glGetQueryObjectiv(%u, %s)\n", id,
+  _mesa_debug(ctx, "%s(%u, %s)\n", func, id,
   _mesa_enum_to_string(pname));
 
if (id)
@@ -747,96 +750,114 @@ _mesa_GetQueryObjectiv(GLuint id, GLenum pname, GLint 
*params)
 
if (!q || q->Active || !q->EverBound) {
   _mesa_error(ctx, GL_INVALID_OPERATION,
-  "glGetQueryObjectivARB(id=%d is invalid or active)", id);
+  "%s(id=%d is invalid or active)", func, id);
   return;
}
 
-   switch (pname) {
-  case GL_QUERY_RESULT_ARB:
- if (!q->Ready)
-ctx->Driver.WaitQuery(ctx, q);
- /* if result is too large for returned type, clamp to max value */
- if (q->Target == GL_ANY_SAMPLES_PASSED
- || q->Target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE) {
-if (q->Result)
-   *params = GL_TRUE;
-else
-   *params = GL_FALSE;
- } else {
-if (q->Result > 0x7fff) {
-   *params = 0x7fff;
-}
-else {
-   *params = (GLint)q->Result;
-}
- }
- break;
-  case GL_QUERY_RESULT_AVAILABLE_ARB:
- if (!q->Ready)
-ctx->Driver.CheckQuery( ctx, q );
- *params = q->Ready;
- break;
+   if (buf && buf != ctx->Shared->NullBufferObj) {
+  bool is_64bit = ptype == GL_INT64_ARB ||
+ ptype == GL_UNSIGNED_INT64_ARB;
+  if (!ctx->Extensions.ARB_query_buffer_object) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(not supported)", func);
+ return;
+  }
+  if (buf->Size < offset + 4 * (is_64bit ? 2 : 1)) {
+ _mesa_error(ctx, GL_INVALID_OPERATION, "%s(out of bounds)", func);
+ return;
+  }
+
+  switch (pname) {
+  case GL_QUERY_RESULT:
+  case GL_QUERY_RESULT_NO_WAIT:
+  case GL_QUERY_RESULT_AVAILABLE:
   case GL_QUERY_TARGET:
- *params = q->Target;
- break;
-  default:
- _mesa_error(ctx, GL_INVALID_ENUM, "glGetQueryObjectivARB(pname)");
+ ctx->Driver.StoreQueryResult(ctx, q, buf, offset, pname, ptype);
  return;
+  }
+
+  /* fall through to get error below */
}
-}
 
+   switch (pname) {
+   case GL_QUERY_RESULT:
+  if (!q->Ready)
+ ctx->Driver.WaitQuery(ctx, q);
+  value = q->Result;
+  break;
+   case GL_QUERY_RESULT_NO_WAIT:
+  if (!ctx->Extensions.ARB_query_buffer_object)
+ goto invalid_enum;
+  ctx->Driver.CheckQuery(ctx, q);
+  if (!q->Ready)
+ return;
+  value = q->Result;
+  break;
+   case GL_QUERY_RESULT_AVAILABLE:
+  if (!q->Ready)
+ ctx->Driver.CheckQuery(ctx, q);
+  value = q->Ready;
+  break;
+   case GL_QUERY_TARGET:
+  value = q->Target;
+  break;
+   default:
+invalid_enum:
+  _mesa_error(ctx, GL_INVALID_ENUM, "%s(pname=%s)",
+  func, _mesa_enum_to_string(pname));
+  return;
+   }
+
+   /* TODO: Have the driver be required to handle this fixup. */
+   if (q->Target == GL_ANY_SAMPLES_PASSED ||
+   q->Target == GL_ANY_SAMPLES_PASSED_CONSERVATIVE)
+  value = !!value;
+
+   switch (ptype) {
+   case GL_INT: {
+  GLint *param = (GLint *)offset;
+  if (value > 0x7fff)
+ *param = 0x7fff;
+  else
+ *param = value;
+  break;
+   }
+   case GL_UNSIGNED_INT: {
+  GLuint *param = (GLuint *)offset;
+  if (value > 0x)
+ *param = 0x;
+  else
+ *param = value;
+

Mesa (master): gallium: add a way to store query result into buffer

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 40d7f02c67ed16f4894137757683475f837a3b4f
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=40d7f02c67ed16f4894137757683475f837a3b4f

Author: Ilia Mirkin 
Date:   Sat May  2 20:28:11 2015 -0400

gallium: add a way to store query result into buffer

Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/gallium/docs/source/context.rst  |  5 +
 src/gallium/include/pipe/p_context.h | 22 ++
 src/gallium/include/pipe/p_defines.h | 10 ++
 3 files changed, 37 insertions(+)

diff --git a/src/gallium/docs/source/context.rst 
b/src/gallium/docs/source/context.rst
index 4c03e00..904e1ff 100644
--- a/src/gallium/docs/source/context.rst
+++ b/src/gallium/docs/source/context.rst
@@ -325,6 +325,11 @@ returned).  Otherwise, if the ``wait`` parameter is FALSE, 
the call
 will not block and the return value will be TRUE if the query has
 completed or FALSE otherwise.
 
+``get_query_result_resource`` is used to store the result of a query into
+a resource without synchronizing with the CPU. This write will optionally
+wait for the query to complete, and will optionally write whether the value
+is available instead of the value itself.
+
 The interface currently includes the following types of queries:
 
 ``PIPE_QUERY_OCCLUSION_COUNTER`` counts the number of fragments which
diff --git a/src/gallium/include/pipe/p_context.h 
b/src/gallium/include/pipe/p_context.h
index f69a75b..6c95b7b 100644
--- a/src/gallium/include/pipe/p_context.h
+++ b/src/gallium/include/pipe/p_context.h
@@ -150,6 +150,28 @@ struct pipe_context {
struct pipe_query *q,
boolean wait,
union pipe_query_result *result);
+
+   /**
+* Get results of a query, storing into resource. Note that this may not
+* be used with batch queries.
+*
+* \param wait  if true, this query will block until the result is ready
+* \param result_type  the type of the value being stored:
+* \param index  for queries that return multiple pieces of data, which
+*   item of that data to store (e.g. for
+*   PIPE_QUERY_PIPELINE_STATISTICS).
+*   When the index is -1, instead of the value of the query
+*   the driver should instead write a 1/0 to the appropriate
+*   location with 1 meaning that the query result is available.
+*/
+   void (*get_query_result_resource)(struct pipe_context *pipe,
+ struct pipe_query *q,
+ boolean wait,
+ enum pipe_query_value_type result_type,
+ int index,
+ struct pipe_resource *resource,
+ unsigned offset);
+
/*@}*/
 
/**
diff --git a/src/gallium/include/pipe/p_defines.h 
b/src/gallium/include/pipe/p_defines.h
index a96c06f..fb84552 100644
--- a/src/gallium/include/pipe/p_defines.h
+++ b/src/gallium/include/pipe/p_defines.h
@@ -353,6 +353,7 @@ enum pipe_flush_flags
  */
 #define PIPE_BARRIER_MAPPED_BUFFER (1 << 0)
 #define PIPE_BARRIER_SHADER_BUFFER (1 << 1)
+#define PIPE_BARRIER_QUERY_BUFFER  (1 << 2)
 
 /**
  * Resource binding flags -- state tracker must specify in advance all
@@ -376,6 +377,7 @@ enum pipe_flush_flags
 #define PIPE_BIND_SHADER_IMAGE (1 << 15) /* set_shader_images */
 #define PIPE_BIND_COMPUTE_RESOURCE (1 << 16) /* set_compute_resources */
 #define PIPE_BIND_COMMAND_ARGS_BUFFER  (1 << 17) /* pipe_draw_info.indirect */
+#define PIPE_BIND_QUERY_BUFFER (1 << 18) /* get_query_result_resource 
*/
 
 /**
  * The first two flags above were previously part of the amorphous
@@ -840,6 +842,14 @@ union pipe_query_result
union pipe_numeric_type_union batch[1];
 };
 
+enum pipe_query_value_type
+{
+   PIPE_QUERY_TYPE_I32,
+   PIPE_QUERY_TYPE_U32,
+   PIPE_QUERY_TYPE_I64,
+   PIPE_QUERY_TYPE_U64,
+};
+
 union pipe_color_union
 {
float f[4];

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


Mesa (master): gallium: add PIPE_CAP_QUERY_BUFFER_OBJECT

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: f9e6f46335be94b19b01be21ca872d9cc93c82e9
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=f9e6f46335be94b19b01be21ca872d9cc93c82e9

Author: Ilia Mirkin 
Date:   Sat Jan  9 23:30:16 2016 -0500

gallium: add PIPE_CAP_QUERY_BUFFER_OBJECT

Signed-off-by: Ilia Mirkin 
Reviewed-by: Marek Olšák 

---

 src/gallium/docs/source/screen.rst   | 2 ++
 src/gallium/drivers/freedreno/freedreno_screen.c | 1 +
 src/gallium/drivers/ilo/ilo_screen.c | 1 +
 src/gallium/drivers/llvmpipe/lp_screen.c | 1 +
 src/gallium/drivers/nouveau/nv30/nv30_screen.c   | 1 +
 src/gallium/drivers/nouveau/nv50/nv50_screen.c   | 1 +
 src/gallium/drivers/nouveau/nvc0/nvc0_screen.c   | 1 +
 src/gallium/drivers/r300/r300_screen.c   | 1 +
 src/gallium/drivers/r600/r600_pipe.c | 1 +
 src/gallium/drivers/radeonsi/si_pipe.c   | 1 +
 src/gallium/drivers/softpipe/sp_screen.c | 1 +
 src/gallium/drivers/svga/svga_screen.c   | 1 +
 src/gallium/drivers/vc4/vc4_screen.c | 1 +
 src/gallium/drivers/virgl/virgl_screen.c | 1 +
 src/gallium/include/pipe/p_defines.h | 1 +
 15 files changed, 16 insertions(+)

diff --git a/src/gallium/docs/source/screen.rst 
b/src/gallium/docs/source/screen.rst
index c95136f..3324bcc 100644
--- a/src/gallium/docs/source/screen.rst
+++ b/src/gallium/docs/source/screen.rst
@@ -317,6 +317,8 @@ The integer capabilities:
   non-compressed surface whose texels are the same number of bits as the
   compressed blocks, and vice versa. The width and height of the surface is
   adjusted appropriately.
+* ``PIPE_CAP_QUERY_BUFFER_OBJECT``: Driver supports
+  context::get_query_result_resource callback.
 
 
 .. _pipe_capf:
diff --git a/src/gallium/drivers/freedreno/freedreno_screen.c 
b/src/gallium/drivers/freedreno/freedreno_screen.c
index e4352b1..f67c160 100644
--- a/src/gallium/drivers/freedreno/freedreno_screen.c
+++ b/src/gallium/drivers/freedreno/freedreno_screen.c
@@ -299,6 +299,7 @@ fd_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
/* Queries. */
case PIPE_CAP_QUERY_TIME_ELAPSED:
case PIPE_CAP_QUERY_TIMESTAMP:
+   case PIPE_CAP_QUERY_BUFFER_OBJECT:
return 0;
case PIPE_CAP_OCCLUSION_QUERY:
return is_a3xx(screen) || is_a4xx(screen);
diff --git a/src/gallium/drivers/ilo/ilo_screen.c 
b/src/gallium/drivers/ilo/ilo_screen.c
index b81057b..7c77197 100644
--- a/src/gallium/drivers/ilo/ilo_screen.c
+++ b/src/gallium/drivers/ilo/ilo_screen.c
@@ -489,6 +489,7 @@ ilo_get_param(struct pipe_screen *screen, enum pipe_cap 
param)
case PIPE_CAP_GENERATE_MIPMAP:
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
+   case PIPE_CAP_QUERY_BUFFER_OBJECT:
   return 0;
 
case PIPE_CAP_VENDOR_ID:
diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c 
b/src/gallium/drivers/llvmpipe/lp_screen.c
index 1d08abd..1731681 100644
--- a/src/gallium/drivers/llvmpipe/lp_screen.c
+++ b/src/gallium/drivers/llvmpipe/lp_screen.c
@@ -313,6 +313,7 @@ llvmpipe_get_param(struct pipe_screen *screen, enum 
pipe_cap param)
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
+   case PIPE_CAP_QUERY_BUFFER_OBJECT:
   return 0;
}
/* should only get here on unhandled cases */
diff --git a/src/gallium/drivers/nouveau/nv30/nv30_screen.c 
b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
index 851b7b9..4f09b74 100644
--- a/src/gallium/drivers/nouveau/nv30/nv30_screen.c
+++ b/src/gallium/drivers/nouveau/nv30/nv30_screen.c
@@ -186,6 +186,7 @@ nv30_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
+   case PIPE_CAP_QUERY_BUFFER_OBJECT:
   return 0;
 
case PIPE_CAP_VENDOR_ID:
diff --git a/src/gallium/drivers/nouveau/nv50/nv50_screen.c 
b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
index c74df23..e0b93b7 100644
--- a/src/gallium/drivers/nouveau/nv50/nv50_screen.c
+++ b/src/gallium/drivers/nouveau/nv50/nv50_screen.c
@@ -229,6 +229,7 @@ nv50_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_STRING_MARKER:
case PIPE_CAP_BUFFER_SAMPLER_VIEW_RGBA_ONLY:
case PIPE_CAP_SURFACE_REINTERPRET_BLOCKS:
+   case PIPE_CAP_QUERY_BUFFER_OBJECT:
   return 0;
 
case PIPE_CAP_VENDOR_ID:
diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
index a9bde27..17ea943 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_screen.c
@@ -219,6 +219,7 @@ nvc0_screen_get_param(struct pipe_screen *pscreen, enum 
pipe_cap param)
case PIPE_CAP_STRING_MARKER:
case 

Mesa (master): nvc0: avoid negatives in PUSH_SPACE argument

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 2065e380b2edafd6e38aa5bb0ff222dc1f6f5ad8
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=2065e380b2edafd6e38aa5bb0ff222dc1f6f5ad8

Author: Ilia Mirkin 
Date:   Fri Feb  5 00:47:03 2016 -0500

nvc0: avoid negatives in PUSH_SPACE argument

Fixup to commit 03b3eb90d - the number of buffers could be larger than
the number of elements, in which case we'd pass a negative argument to
PUSH_SPACE, which would be bad. While we're at it, merge it with the
other PUSH_SPACE at the top of the function.

Signed-off-by: Ilia Mirkin 
Cc: mesa-sta...@lists.freedesktop.org

---

 src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
index f7769da..44aed1a 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
@@ -382,7 +382,7 @@ nvc0_validate_vertex_buffers_shared(struct nvc0_context 
*nvc0)
unsigned b;
const uint32_t mask = nvc0->vbo_user;
 
-   PUSH_SPACE(push, nvc0->num_vtxbufs * 8);
+   PUSH_SPACE(push, nvc0->num_vtxbufs * 8 + nvc0->vertex->num_elements);
for (b = 0; b < nvc0->num_vtxbufs; ++b) {
   struct pipe_vertex_buffer *vb = >vtxbuf[b];
   struct nv04_resource *buf;
@@ -417,7 +417,6 @@ nvc0_validate_vertex_buffers_shared(struct nvc0_context 
*nvc0)
/* If there are more elements than buffers, we might not have unset
 * fetching on the later elements.
 */
-   PUSH_SPACE(push, nvc0->vertex->num_elements - b);
for (; b < nvc0->vertex->num_elements; ++b)
   IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(b)), 0);
 

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


Mesa (master): nvc0/ir: fix converting between predicate and gpr

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 1a0fde1f52c59e0dbada03f387c8e25d9475ebbe
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=1a0fde1f52c59e0dbada03f387c8e25d9475ebbe

Author: Ilia Mirkin 
Date:   Thu Feb  4 22:58:48 2016 -0500

nvc0/ir: fix converting between predicate and gpr

The spill logic will insert convert ops when moving between files. It
seems like the emission logic wasn't quite ready for these converts.

Tested on fermi, and visually looked at nvdisasm output for maxwell.

Signed-off-by: Ilia Mirkin 
Cc: mesa-sta...@lists.freedesktop.org

---

 .../drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp |  8 -
 .../drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp | 36 --
 .../drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp  |  8 -
 3 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
index 17cb484..0c7cd1d 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gk110.cpp
@@ -1947,10 +1947,16 @@ CodeEmitterGK110::emitInstruction(Instruction *insn)
case OP_CEIL:
case OP_FLOOR:
case OP_TRUNC:
-   case OP_CVT:
case OP_SAT:
   emitCVT(insn);
   break;
+   case OP_CVT:
+  if (insn->def(0).getFile() == FILE_PREDICATE ||
+  insn->src(0).getFile() == FILE_PREDICATE)
+ emitMOV(insn);
+  else
+ emitCVT(insn);
+  break;
case OP_RSQ:
   emitSFnOp(insn, 5 + 2 * insn->subOp);
   break;
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
index 1fa0eb6..dee2622 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_gm107.cpp
@@ -673,7 +673,12 @@ CodeEmitterGM107::emitMOV()
(insn->sType != TYPE_F32 && !longIMMD(insn->src(0 {
   switch (insn->src(0).getFile()) {
   case FILE_GPR:
- emitInsn(0x5c98);
+ if (insn->def(0).getFile() == FILE_PREDICATE) {
+emitInsn(0x5b6a);
+emitGPR (0x08);
+ } else {
+emitInsn(0x5c98);
+ }
  emitGPR (0x14, insn->src(0));
  break;
   case FILE_MEMORY_CONST:
@@ -684,18 +689,32 @@ CodeEmitterGM107::emitMOV()
  emitInsn(0x3898);
  emitIMMD(0x14, 19, insn->src(0));
  break;
+  case FILE_PREDICATE:
+ emitInsn(0x5088);
+ emitPRED(0x0c, insn->src(0));
+ emitPRED(0x1d);
+ emitPRED(0x27);
+ break;
   default:
  assert(!"bad src file");
  break;
   }
-  emitField(0x27, 4, insn->lanes);
+  if (insn->def(0).getFile() != FILE_PREDICATE &&
+  insn->src(0).getFile() != FILE_PREDICATE)
+ emitField(0x27, 4, insn->lanes);
} else {
   emitInsn (0x0100);
   emitIMMD (0x14, 32, insn->src(0));
   emitField(0x0c, 4, insn->lanes);
}
 
-   emitGPR(0x00, insn->def(0));
+   if (insn->def(0).getFile() == FILE_PREDICATE) {
+  emitPRED(0x27);
+  emitPRED(0x03, insn->def(0));
+  emitPRED(0x00);
+   } else {
+  emitGPR(0x00, insn->def(0));
+   }
 }
 
 void
@@ -2684,11 +2703,7 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
   emitRAM();
   break;
case OP_MOV:
-  if (insn->def(0).getFile() == FILE_GPR &&
-  insn->src(0).getFile() != FILE_PREDICATE)
- emitMOV();
-  else
- assert(!"R2P/P2R");
+  emitMOV();
   break;
case OP_RDSV:
   emitS2R();
@@ -2700,7 +2715,10 @@ CodeEmitterGM107::emitInstruction(Instruction *i)
case OP_CEIL:
case OP_TRUNC:
case OP_CVT:
-  if (isFloatType(insn->dType)) {
+  if (insn->op == OP_CVT && (insn->def(0).getFile() == FILE_PREDICATE ||
+ insn->src(0).getFile() == FILE_PREDICATE)) {
+ emitMOV();
+  } else if (isFloatType(insn->dType)) {
  if (isFloatType(insn->sType))
 emitF2F();
  else
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp 
b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
index 6cf69e5..8637db9 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_emit_nvc0.cpp
@@ -2435,10 +2435,16 @@ CodeEmitterNVC0::emitInstruction(Instruction *insn)
case OP_CEIL:
case OP_FLOOR:
case OP_TRUNC:
-   case OP_CVT:
case OP_SAT:
   emitCVT(insn);
   break;
+   case OP_CVT:
+  if (insn->def(0).getFile() == FILE_PREDICATE ||
+  insn->src(0).getFile() == FILE_PREDICATE)
+ emitMOV(insn);
+  else
+ emitCVT(insn);
+  break;
case OP_RSQ:
   emitSFnOp(insn, 5 + 2 * insn->subOp);
   break;


Mesa (master): nvc0: add some missing PUSH_SPACE's

2016-02-04 Thread Ilia Mirkin
Module: Mesa
Branch: master
Commit: 03b3eb90d7e0ca90a75eda97eefa8c99aacdf4d9
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=03b3eb90d7e0ca90a75eda97eefa8c99aacdf4d9

Author: Ilia Mirkin 
Date:   Fri Feb  5 00:36:03 2016 -0500

nvc0: add some missing PUSH_SPACE's

nvc0_vbo has explicit push space checking enabled, so we must run
PUSH_SPACE by hand. A few spots missed that.

Signed-off-by: Ilia Mirkin 
Cc: mesa-sta...@lists.freedesktop.org

---

 src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c | 10 +-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c 
b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
index 65ecc7f..f7769da 100644
--- a/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
+++ b/src/gallium/drivers/nouveau/nvc0/nvc0_vbo.c
@@ -417,6 +417,7 @@ nvc0_validate_vertex_buffers_shared(struct nvc0_context 
*nvc0)
/* If there are more elements than buffers, we might not have unset
 * fetching on the later elements.
 */
+   PUSH_SPACE(push, nvc0->vertex->num_elements - b);
for (; b < nvc0->vertex->num_elements; ++b)
   IMMED_NVC0(push, NVC0_3D(VERTEX_ARRAY_FETCH(b)), 0);
 
@@ -690,7 +691,7 @@ nvc0_draw_elements_inline_u32_short(struct nouveau_pushbuf 
*push,
 
if (count & 1) {
   count--;
-  PUSH_SPACE(push, 1);
+  PUSH_SPACE(push, 2);
   BEGIN_NVC0(push, NVC0_3D(VB_ELEMENT_U32), 1);
   PUSH_DATA (push, *map++);
}
@@ -821,6 +822,8 @@ nvc0_draw_indirect(struct nvc0_context *nvc0, const struct 
pipe_draw_info *info)
unsigned size, macro, count = info->indirect_count, drawid = info->drawid;
uint32_t offset = buf->offset + info->indirect_offset;
 
+   PUSH_SPACE(push, 7);
+
/* must make FIFO wait for engines idle before continuing to process */
if ((buf->fence_wr && !nouveau_fence_signalled(buf->fence_wr)) ||
(buf_count && buf_count->fence_wr &&
@@ -961,6 +964,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct 
pipe_draw_info *info)
if (info->mode == PIPE_PRIM_PATCHES &&
nvc0->state.patch_vertices != info->vertices_per_patch) {
   nvc0->state.patch_vertices = info->vertices_per_patch;
+  PUSH_SPACE(push, 1);
   IMMED_NVC0(push, NVC0_3D(PATCH_VERTICES), nvc0->state.patch_vertices);
}
 
@@ -968,6 +972,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct 
pipe_draw_info *info)
nvc0_state_validate(nvc0, ~0, 8);
 
if (nvc0->vertprog->vp.need_draw_parameters) {
+  PUSH_SPACE(push, 9);
   BEGIN_NVC0(push, NVC0_3D(CB_SIZE), 3);
   PUSH_DATA (push, 512);
   PUSH_DATAh(push, nvc0->screen->uniform_bo->offset + (5 << 16) + (0 << 
9));
@@ -989,6 +994,7 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct 
pipe_draw_info *info)
}
 
if (nvc0->cb_dirty) {
+  PUSH_SPACE(push, 1);
   IMMED_NVC0(push, NVC0_3D(MEM_BARRIER), 0x1011);
   nvc0->cb_dirty = false;
}
@@ -997,6 +1003,8 @@ nvc0_draw_vbo(struct pipe_context *pipe, const struct 
pipe_draw_info *info)
   if (!nvc0->textures_coherent[s])
  continue;
 
+  PUSH_SPACE(push, nvc0->num_textures[s] * 2);
+
   for (int i = 0; i < nvc0->num_textures[s]; ++i) {
  struct nv50_tic_entry *tic = nv50_tic_entry(nvc0->textures[s][i]);
  if (!(nvc0->textures_coherent[s] & (1 << i)))

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


Mesa (master): glsl: Ensure glsl/ exists before making the lexer/parser.

2016-02-04 Thread Matt Turner
Module: Mesa
Branch: master
Commit: 973ba3f4d4b73f67568ab2b0b6a4447c40bb9dcf
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=973ba3f4d4b73f67568ab2b0b6a4447c40bb9dcf

Author: Matt Turner 
Date:   Wed Feb  3 12:03:13 2016 -0800

glsl: Ensure glsl/ exists before making the lexer/parser.

Reported-by: Jan Ziak <0xe2.0x9a.0...@gmail.com>
Reviewed-by: Tapani Pälli 
Reviewed-by: Iago Toral Quiroga 
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=93989

---

 src/compiler/Makefile.am | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/compiler/Makefile.am b/src/compiler/Makefile.am
index 0bc8e48..f218af1 100644
--- a/src/compiler/Makefile.am
+++ b/src/compiler/Makefile.am
@@ -211,9 +211,11 @@ YACC_GEN = $(AM_V_YACC)$(YACC) $(YFLAGS)
 LEX_GEN = $(AM_V_LEX)$(LEX) $(LFLAGS)
 
 glsl/glsl_parser.cpp glsl/glsl_parser.h: glsl/glsl_parser.yy
+   $(MKDIR_GEN)
$(YACC_GEN) -o $@ -p "_mesa_glsl_" 
--defines=$(builddir)/glsl/glsl_parser.h $(srcdir)/glsl/glsl_parser.yy
 
 glsl/glsl_lexer.cpp: glsl/glsl_lexer.ll
+   $(MKDIR_GEN)
$(LEX_GEN) -o $@ $(srcdir)/glsl/glsl_lexer.ll
 
 glsl/glcpp/glcpp-parse.c glsl/glcpp/glcpp-parse.h: glsl/glcpp/glcpp-parse.y

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


Mesa (master): i965/fs: Allocate single register at a time for constants.

2016-02-04 Thread Matt Turner
Module: Mesa
Branch: master
Commit: 8c7a42b3e880804e201ee9582a0a73763cdd2a01
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8c7a42b3e880804e201ee9582a0a73763cdd2a01

Author: Matt Turner 
Date:   Mon Feb  1 11:14:01 2016 -0800

i965/fs: Allocate single register at a time for constants.

No instruction counts changed, but:

  total cycles in shared programs: 64834502 -> 64781530 (-0.08%)
  cycles in affected programs: 16331544 -> 16278572 (-0.32%)
  helped: 4757
  HURT: 4288

  GAINED: 66
  LOST:   20

I remember trying this when I first wrote the pass, but it wasn't
helpful at the time.

Reviewed-by: Francisco Jerez 

---

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

diff --git a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp 
b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
index 994c699..d7a1456 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_combine_constants.cpp
@@ -268,7 +268,7 @@ fs_visitor::opt_combine_constants()
   qsort(table.imm, table.len, sizeof(struct imm), compare);
 
/* Insert MOVs to load the constant values into GRFs. */
-   fs_reg reg(VGRF, alloc.allocate(dispatch_width / 8));
+   fs_reg reg(VGRF, alloc.allocate(1));
reg.stride = 0;
for (int i = 0; i < table.len; i++) {
   struct imm *imm = [i];
@@ -284,8 +284,8 @@ fs_visitor::opt_combine_constants()
   imm->subreg_offset = reg.subreg_offset;
 
   reg.subreg_offset += sizeof(float);
-  if ((unsigned)reg.subreg_offset == dispatch_width * sizeof(float)) {
- reg.nr = alloc.allocate(dispatch_width / 8);
+  if ((unsigned)reg.subreg_offset == 8 * sizeof(float)) {
+ reg.nr = alloc.allocate(1);
  reg.subreg_offset = 0;
   }
}

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


Mesa (master): radeonsi: fix Hyper-Z on Stoney

2016-02-04 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: 8ec24678ac0f459af4acb4b40a70d7802906e41a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=8ec24678ac0f459af4acb4b40a70d7802906e41a

Author: Marek Olšák 
Date:   Thu Jan 28 01:35:52 2016 +0100

radeonsi: fix Hyper-Z on Stoney

Cc: 11.0 11.1 
Reviewed-by: Nicolai Hähnle 

---

 src/gallium/drivers/radeon/r600_texture.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/src/gallium/drivers/radeon/r600_texture.c 
b/src/gallium/drivers/radeon/r600_texture.c
index 09318e0..ebafe3e 100644
--- a/src/gallium/drivers/radeon/r600_texture.c
+++ b/src/gallium/drivers/radeon/r600_texture.c
@@ -533,6 +533,10 @@ static unsigned r600_texture_get_htile_size(struct 
r600_common_screen *rscreen,
rscreen->info.drm_major == 2 && rscreen->info.drm_minor < 38)
return 0;
 
+   /* Overalign HTILE on Stoney to fix 
piglit/depthstencil-render-miplevels 585. */
+   if (rscreen->family == CHIP_STONEY)
+   num_pipes = 4;
+
switch (num_pipes) {
case 1:
cl_width = 32;

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


Mesa (master): radeonsi: implement PK2H and UP2H opcodes

2016-02-04 Thread Marek Olšák
Module: Mesa
Branch: master
Commit: bff640b3e09f845ddb5b23136c8f0796098dc23a
URL:
http://cgit.freedesktop.org/mesa/mesa/commit/?id=bff640b3e09f845ddb5b23136c8f0796098dc23a

Author: Marek Olšák 
Date:   Sat Jan 30 00:30:02 2016 +0100

radeonsi: implement PK2H and UP2H opcodes

Based on a gallivm patch by Ilia Mirkin.

+8 piglit regressions due to precision issues (I blame the tests)

The benefit is that we'll get v_cvt_f32_f16 and v_cvt_f16_f32 instead
of emulation with integer instructions. They are GLSL 4.00 intrinsics.

Reviewed-by: Michel Dänzer 

---

 .../drivers/radeon/radeon_setup_tgsi_llvm.c| 72 ++
 src/gallium/drivers/radeonsi/si_pipe.c |  4 +-
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c 
b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
index 76be376..d8e05ce 100644
--- a/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
+++ b/src/gallium/drivers/radeon/radeon_setup_tgsi_llvm.c
@@ -1452,6 +1452,74 @@ static void emit_minmax_int(const struct 
lp_build_tgsi_action *action,
emit_data->args[1], "");
 }
 
+static void pk2h_fetch_args(struct lp_build_tgsi_context * bld_base,
+   struct lp_build_emit_data * emit_data)
+{
+   emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
+0, TGSI_CHAN_X);
+   emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
+0, TGSI_CHAN_Y);
+}
+
+static void emit_pk2h(const struct lp_build_tgsi_action *action,
+ struct lp_build_tgsi_context *bld_base,
+ struct lp_build_emit_data *emit_data)
+{
+   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+   LLVMContextRef context = bld_base->base.gallivm->context;
+   struct lp_build_context *uint_bld = _base->uint_bld;
+   LLVMTypeRef fp16, i16;
+   LLVMValueRef const16, comp[2];
+   unsigned i;
+
+   fp16 = LLVMHalfTypeInContext(context);
+   i16 = LLVMInt16TypeInContext(context);
+   const16 = lp_build_const_int32(uint_bld->gallivm, 16);
+
+   for (i = 0; i < 2; i++) {
+   comp[i] = LLVMBuildFPTrunc(builder, emit_data->args[i], fp16, 
"");
+   comp[i] = LLVMBuildBitCast(builder, comp[i], i16, "");
+   comp[i] = LLVMBuildZExt(builder, comp[i], uint_bld->elem_type, 
"");
+   }
+
+   comp[1] = LLVMBuildShl(builder, comp[1], const16, "");
+   comp[0] = LLVMBuildOr(builder, comp[0], comp[1], "");
+
+   emit_data->output[emit_data->chan] = comp[0];
+}
+
+static void up2h_fetch_args(struct lp_build_tgsi_context * bld_base,
+   struct lp_build_emit_data * emit_data)
+{
+   emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
+0, TGSI_CHAN_X);
+}
+
+static void emit_up2h(const struct lp_build_tgsi_action *action,
+ struct lp_build_tgsi_context *bld_base,
+ struct lp_build_emit_data *emit_data)
+{
+   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
+   LLVMContextRef context = bld_base->base.gallivm->context;
+   struct lp_build_context *uint_bld = _base->uint_bld;
+   LLVMTypeRef fp16, i16;
+   LLVMValueRef const16, input, val;
+   unsigned i;
+
+   fp16 = LLVMHalfTypeInContext(context);
+   i16 = LLVMInt16TypeInContext(context);
+   const16 = lp_build_const_int32(uint_bld->gallivm, 16);
+   input = emit_data->args[0];
+
+   for (i = 0; i < 2; i++) {
+   val = i == 1 ? LLVMBuildLShr(builder, input, const16, "") : 
input;
+   val = LLVMBuildTrunc(builder, val, i16, "");
+   val = LLVMBuildBitCast(builder, val, fp16, "");
+   emit_data->output[i] =
+   LLVMBuildFPExt(builder, val, bld_base->base.elem_type, 
"");
+   }
+}
+
 void radeon_llvm_context_init(struct radeon_llvm_context * ctx)
 {
struct lp_type type;
@@ -1581,6 +1649,8 @@ void radeon_llvm_context_init(struct radeon_llvm_context 
* ctx)
bld_base->op_actions[TGSI_OPCODE_UMSB].emit = emit_umsb;
bld_base->op_actions[TGSI_OPCODE_NOT].emit = emit_not;
bld_base->op_actions[TGSI_OPCODE_OR].emit = emit_or;
+   bld_base->op_actions[TGSI_OPCODE_PK2H].fetch_args = pk2h_fetch_args;
+   bld_base->op_actions[TGSI_OPCODE_PK2H].emit = emit_pk2h;
bld_base->op_actions[TGSI_OPCODE_POPC].emit = 
build_tgsi_intrinsic_nomem;
bld_base->op_actions[TGSI_OPCODE_POPC].intr_name = "llvm.ctpop.i32";
bld_base->op_actions[TGSI_OPCODE_POW].emit = build_tgsi_intrinsic_nomem;
@@ -1618,6 +1688,8 @@ void radeon_llvm_context_init(struct radeon_llvm_context 
* ctx)
bld_base->op_actions[TGSI_OPCODE_U2F].emit