Re: [Mesa-dev] GLSL IR & TGSI on-disk shader cache

2017-02-06 Thread Timothy Arceri
On Tue, 7 Feb 2017 15:50:28 +0900
Michel Dänzer  wrote:

> On 07/02/17 12:42 PM, Timothy Arceri wrote:
> > 
> > This series does not include the patch that adds cache support
> > to the radeonsi backend, the main reason for this is that llvm
> > currently doesn't allow the version to be queried at runtime
> > (as far as I'm aware) although it seems like other are interested
> > in this feature [1] so I will follow up on that.
> > 
> > The reason we don't just use the build time like radv is that we
> > will want something consistent accross distros to enable 
> > distribution of precompiled shaders.
> 
> I'm not sure that's realistic. Consider e.g.
> 
> https://bugs.freedesktop.org/show_bug.cgi?id=99078
> 
> which is a regression in LLVM 3.9.1 caused by backporting a fix from
> trunk. Since there are no plans for an LLVM 3.9.2 release, distros
> have to revert the change in their 3.9.1 packages. Mesa can't tell the
> difference from the version number, but the generated code can be very
> different depending on whether the change in question is present or
> not.

I wonder how problematic that really is, it just means the bug will be
in the cached version and it won't get replaced. It looks like other
users of llvm might be looking to rely on the version number so maybe
distros will need to bump the version themselves if llvm won't do a
release, not sure what to do about this.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] [RFC] radv: enable transfer queues on CIK using SDMA engine.

2017-02-06 Thread Nicolai Hähnle
It may be time to start thinking about whether CS emit functions can be 
shared between radv and the gallium winsys. This code has seen a lot of 
subtle bug fixes over time, so duplication is not very nice.


Nicolai

On 07.02.2017 07:01, Dave Airlie wrote:

From: Dave Airlie 

This enables a transfer queue using the SDMA engine on
CIK/VI/Polaris GPUs.

TODO:
decide what to do with HW limitations from radeonsi
(fail to record?)
add linear bounds check to the buffer->image copies

dEQP-VK.synchronization.op.multi_queue.fence.*:
 Passed:1294/2688 (48.1%)
 Failed:0/2688 (0.0%)
 Not supported: 1394/2688 (51.9%)
 Warnings:  0/2688 (0.0%)

Signed-off-by: Dave Airlie 
---
 src/amd/vulkan/Makefile.sources   |   1 +
 src/amd/vulkan/radv_cik_sdma.c| 747 ++
 src/amd/vulkan/radv_cmd_buffer.c  |   7 +
 src/amd/vulkan/radv_device.c  |  20 +
 src/amd/vulkan/radv_meta_buffer.c |  42 +-
 src/amd/vulkan/radv_meta_copy.c   |  19 +
 src/amd/vulkan/radv_private.h |  38 ++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c |  12 +-
 8 files changed, 877 insertions(+), 9 deletions(-)
 create mode 100644 src/amd/vulkan/radv_cik_sdma.c

diff --git a/src/amd/vulkan/Makefile.sources b/src/amd/vulkan/Makefile.sources
index 425a00f..6cd9621 100644
--- a/src/amd/vulkan/Makefile.sources
+++ b/src/amd/vulkan/Makefile.sources
@@ -31,6 +31,7 @@ RADV_WS_AMDGPU_FILES := \
winsys/amdgpu/radv_amdgpu_winsys_public.h

 VULKAN_FILES := \
+   radv_cik_sdma.c \
radv_cmd_buffer.c \
radv_cs.h \
radv_device.c \
diff --git a/src/amd/vulkan/radv_cik_sdma.c b/src/amd/vulkan/radv_cik_sdma.c
new file mode 100644
index 000..1229d9c
--- /dev/null
+++ b/src/amd/vulkan/radv_cik_sdma.c
@@ -0,0 +1,747 @@
+/*
+ * Copyright © 2016 Red Hat.
+ *
+ * based on cik_sdma.c:
+ * Copyright 2014,2015 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#include "radv_private.h"
+#include "sid.h"
+#include "vk_format.h"
+#include "radv_cs.h"
+
+static VkFormat get_format_from_aspect_mask(VkImageAspectFlags aspectMask,
+   VkFormat format)
+{
+   if (aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT)
+   format = vk_format_depth_only(format);
+   else if (aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)
+   format = vk_format_stencil_only(format);
+   return format;
+}
+
+static unsigned minify_as_blocks(unsigned width, unsigned level, unsigned 
blk_w)
+{
+   width = radv_minify(width, level);
+   return DIV_ROUND_UP(width, blk_w);
+}
+
+static const struct radeon_surf_level *get_base_level_info(const struct 
radv_image *img,
+  VkImageAspectFlags 
aspectMask, int base_mip_level)
+{
+   if (aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT)
+   return >surface.stencil_level[base_mip_level];
+   return >surface.level[base_mip_level];
+}
+
+static void get_image_info(struct radv_cmd_buffer *cmd_buffer,
+  const struct radv_image *img,
+  const VkImageSubresourceLayers *subres,
+  uint64_t *va_p, uint32_t *bpp_p, uint32_t *pitch, 
uint32_t *slice_pitch)
+{
+   const struct radeon_surf_level *base_level = get_base_level_info(img, 
subres->aspectMask,
+
subres->mipLevel);
+   VkFormat format = get_format_from_aspect_mask(subres->aspectMask, 
img->vk_format);
+   uint32_t bpp = vk_format_get_blocksize(format);
+   uint64_t va = cmd_buffer->device->ws->buffer_get_va(img->bo);
+
+   va += img->offset;
+   *pitch = base_level->nblk_x;
+   *slice_pitch = base_level->slice_size / 

[Mesa-dev] [Bug 99701] loader.c:353:8: error: implicit declaration of function 'geteuid' is invalid in C99 [-Werror, -Wimplicit-function-declaration]

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99701

--- Comment #1 from Nicolai Hähnle  ---
Created attachment 129378
  --> https://bugs.freedesktop.org/attachment.cgi?id=129378=edit
always include unistd.h

The attached patch might fix this.

Out of curiosity, what kind of configuration are you building for?

-- 
You are receiving this mail because:
You are the assignee for the bug.
You are the QA Contact for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] spirv: Add more asserts in vtn_vector_construct

2017-02-06 Thread Samuel Iglesias Gonsálvez
Reviewed-by: Samuel Iglesias Gonsálvez 

On Mon, 2017-02-06 at 21:20 -0800, Jason Ekstrand wrote:
> On Mon, Feb 6, 2017 at 9:18 PM, Jason Ekstrand 
> wrote:
> > These are currently getting hit by the Skia Vulkan back-end
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99465
>  
> > ---
> >  src/compiler/spirv/spirv_to_nir.c | 15 +++
> >  1 file changed, 15 insertions(+)
> > 
> > diff --git a/src/compiler/spirv/spirv_to_nir.c
> > b/src/compiler/spirv/spirv_to_nir.c
> > index 9f0b8fd..416e12a 100644
> > --- a/src/compiler/spirv/spirv_to_nir.c
> > +++ b/src/compiler/spirv/spirv_to_nir.c
> > @@ -2334,9 +2334,17 @@ vtn_vector_construct(struct vtn_builder *b,
> > unsigned num_components,
> >     nir_alu_instr *vec = create_vec(b->shader, num_components,
> >                                     srcs[0]->bit_size);
> > 
> > +   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
> > +    *
> > +    *    "When constructing a vector, there must be at least two
> > Constituent
> > +    *    operands."
> > +    */
> > +   assert(num_srcs >= 2);
> > +
> >     unsigned dest_idx = 0;
> >     for (unsigned i = 0; i < num_srcs; i++) {
> >        nir_ssa_def *src = srcs[i];
> > +      assert(dest_idx + src->num_components <= num_components);
> >        for (unsigned j = 0; j < src->num_components; j++) {
> >           vec->src[dest_idx].src = nir_src_for_ssa(src);
> >           vec->src[dest_idx].swizzle[0] = j;
> > @@ -2344,6 +2352,13 @@ vtn_vector_construct(struct vtn_builder *b,
> > unsigned num_components,
> >        }
> >     }
> > 
> > +   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
> > +    *
> > +    *    "When constructing a vector, the total number of
> > components in all
> > +    *    the operands must equal the number of components in
> > Result Type."
> > +    */
> > +   assert(dest_idx == num_components);
> > +
> >     nir_builder_instr_insert(>nb, >instr);
> > 
> >     return >dest.dest.ssa;
> > --
> > 2.5.0.400.gff86faf
> > 
> > 
> 
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev

signature.asc
Description: This is a digitally signed message part
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] i965/fs: don't lower different type size conversions on opt_peephole_sel()

2017-02-06 Thread Samuel Iglesias Gonsálvez
Gentle reminder :)

Sam

On Wed, 2017-01-25 at 11:20 +0100, Samuel Iglesias Gonsálvez wrote:
> Don't lower a type conversion between different type sizes
> because SEL does't support them, SEL without conditional modifier
> just do a raw move.
> 
> Signed-off-by: Samuel Iglesias Gonsálvez 
> ---
>  src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
> b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
> index 8cd897f72e0..8a9f6e67a14 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_sel_peephole.cpp
> @@ -167,6 +167,8 @@ fs_visitor::opt_peephole_sel()
>   then_mov[i]->force_writemask_all != else_mov[i]-
> >force_writemask_all ||
>   then_mov[i]->is_partial_write() ||
>   else_mov[i]->is_partial_write() ||
> + type_sz(then_mov[i]->dst.type) != type_sz(then_mov[i]-
> >src[0].type) ||
> + type_sz(else_mov[i]->dst.type) != type_sz(else_mov[i]-
> >src[0].type) ||
>   then_mov[i]->conditional_mod != BRW_CONDITIONAL_NONE ||
>   else_mov[i]->conditional_mod != BRW_CONDITIONAL_NONE) {
>  movs = i;
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] GLSL IR & TGSI on-disk shader cache

2017-02-06 Thread Michel Dänzer
On 07/02/17 12:42 PM, Timothy Arceri wrote:
> 
> This series does not include the patch that adds cache support
> to the radeonsi backend, the main reason for this is that llvm
> currently doesn't allow the version to be queried at runtime
> (as far as I'm aware) although it seems like other are interested
> in this feature [1] so I will follow up on that.
> 
> The reason we don't just use the build time like radv is that we
> will want something consistent accross distros to enable 
> distribution of precompiled shaders.

I'm not sure that's realistic. Consider e.g.

https://bugs.freedesktop.org/show_bug.cgi?id=99078

which is a regression in LLVM 3.9.1 caused by backporting a fix from
trunk. Since there are no plans for an LLVM 3.9.2 release, distros have
to revert the change in their 3.9.1 packages. Mesa can't tell the
difference from the version number, but the generated code can be very
different depending on whether the change in question is present or not.


-- 
Earthling Michel Dänzer   |   http://www.amd.com
Libre software enthusiast | Mesa and X developer
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 97967] glsl/tests/cache-test regression

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=97967

--- Comment #15 from Vinson Lee  ---
Here is make check failure with the debug statements from attachment 129357.

FAIL: glsl/tests/cache-test
===

Failed to create ./cache-test-tmp/xdg-cache-home for shader cache (No such file
or directory)---disabling.
Failed to create ./cache-test-tmp/mesa-glsl-cache-dir for shader cache (No such
file or directory)---disabling.
_mesa_sha1_compute ca db d9 c9 9c d7 e1 b4 e0 a5 6f cf 25 8e 83 b5 9f 74 5a 56
disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/ca/dbd9c99cd7e1b4e0a56fcf258e83b59f745a56".
NOTE the directory name wrt sha1[0].

_mesa_sha1_compute 4d 78 cc 97 5b 41 97 6b b e3 58 2c 90 bf bd 6 26 a f4 d8
disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/4d/78cc975b41976b0be3582c90bfbd06260af4d8".
NOTE the directory name wrt sha1[0].

_mesa_sha1_compute 60 ca cb f3 d7 2e 1e 78 34 20 3d a6 8 3 7b 1b f8 3b 40 e8
test_put_and_get: Adjusting the first byte of one_KB_key[] the to 0xca.
This is to ensure that the correct folder is picked "ca/" for the eviction that
follows.
disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/ca/cacbf3d72e1e7834203da608037b1bf83b40e8".
NOTE the directory name wrt sha1[0].

Error: Test 'disk_cache_put eviction with MAX_SIZE=1K' failed: Expected=1,
Actual=2
disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/ca/dbd9c99cd7e1b4e0a56fcf258e83b59f745a56".
NOTE the directory name wrt sha1[0].

disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/4d/78cc975b41976b0be3582c90bfbd06260af4d8".
NOTE the directory name wrt sha1[0].

_mesa_sha1_compute 3b 71 f4 3f f3 f 4b 15 b5 cd 85 dd 9e 95 eb c7 e8 4e b5 a3
disk_cache_put: get_cache_file() returned
"./cache-test-tmp/mesa-glsl-cache-dir/ca/71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3".
NOTE the directory name wrt sha1[0].

Error: Test 'eviction after overflow with MAX_SIZE=1M' failed: Expected=2,
Actual=3

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 99246] [d3dadapter+radeonsi & bisect] EVE-Online : hang on wormhole sight

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99246

Mathieu Belanger  changed:

   What|Removed |Added

 Resolution|--- |NOTOURBUG
 Status|NEW |RESOLVED

--- Comment #5 from Mathieu Belanger  ---
Look like compiling the latest Wine version fixed that. Closing.

-- 
You are receiving this mail because:
You are the assignee for the bug.
You are the QA Contact for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] [RFC] radv: enable transfer queues on CIK using SDMA engine.

2017-02-06 Thread Dave Airlie
From: Dave Airlie 

This enables a transfer queue using the SDMA engine on
CIK/VI/Polaris GPUs.

TODO:
decide what to do with HW limitations from radeonsi
(fail to record?)
add linear bounds check to the buffer->image copies

dEQP-VK.synchronization.op.multi_queue.fence.*:
 Passed:1294/2688 (48.1%)
 Failed:0/2688 (0.0%)
 Not supported: 1394/2688 (51.9%)
 Warnings:  0/2688 (0.0%)

Signed-off-by: Dave Airlie 
---
 src/amd/vulkan/Makefile.sources   |   1 +
 src/amd/vulkan/radv_cik_sdma.c| 747 ++
 src/amd/vulkan/radv_cmd_buffer.c  |   7 +
 src/amd/vulkan/radv_device.c  |  20 +
 src/amd/vulkan/radv_meta_buffer.c |  42 +-
 src/amd/vulkan/radv_meta_copy.c   |  19 +
 src/amd/vulkan/radv_private.h |  38 ++
 src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c |  12 +-
 8 files changed, 877 insertions(+), 9 deletions(-)
 create mode 100644 src/amd/vulkan/radv_cik_sdma.c

diff --git a/src/amd/vulkan/Makefile.sources b/src/amd/vulkan/Makefile.sources
index 425a00f..6cd9621 100644
--- a/src/amd/vulkan/Makefile.sources
+++ b/src/amd/vulkan/Makefile.sources
@@ -31,6 +31,7 @@ RADV_WS_AMDGPU_FILES := \
winsys/amdgpu/radv_amdgpu_winsys_public.h
 
 VULKAN_FILES := \
+   radv_cik_sdma.c \
radv_cmd_buffer.c \
radv_cs.h \
radv_device.c \
diff --git a/src/amd/vulkan/radv_cik_sdma.c b/src/amd/vulkan/radv_cik_sdma.c
new file mode 100644
index 000..1229d9c
--- /dev/null
+++ b/src/amd/vulkan/radv_cik_sdma.c
@@ -0,0 +1,747 @@
+/*
+ * Copyright © 2016 Red Hat.
+ *
+ * based on cik_sdma.c:
+ * Copyright 2014,2015 Advanced Micro Devices, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#include "radv_private.h"
+#include "sid.h"
+#include "vk_format.h"
+#include "radv_cs.h"
+
+static VkFormat get_format_from_aspect_mask(VkImageAspectFlags aspectMask,
+   VkFormat format)
+{
+   if (aspectMask & VK_IMAGE_ASPECT_DEPTH_BIT)
+   format = vk_format_depth_only(format);
+   else if (aspectMask & VK_IMAGE_ASPECT_STENCIL_BIT)
+   format = vk_format_stencil_only(format);
+   return format;
+}
+
+static unsigned minify_as_blocks(unsigned width, unsigned level, unsigned 
blk_w)
+{
+   width = radv_minify(width, level);
+   return DIV_ROUND_UP(width, blk_w);
+}
+
+static const struct radeon_surf_level *get_base_level_info(const struct 
radv_image *img,
+  VkImageAspectFlags 
aspectMask, int base_mip_level)
+{
+   if (aspectMask == VK_IMAGE_ASPECT_STENCIL_BIT)
+   return >surface.stencil_level[base_mip_level];
+   return >surface.level[base_mip_level];
+}
+
+static void get_image_info(struct radv_cmd_buffer *cmd_buffer,
+  const struct radv_image *img,
+  const VkImageSubresourceLayers *subres,
+  uint64_t *va_p, uint32_t *bpp_p, uint32_t *pitch, 
uint32_t *slice_pitch)
+{
+   const struct radeon_surf_level *base_level = get_base_level_info(img, 
subres->aspectMask,
+
subres->mipLevel);
+   VkFormat format = get_format_from_aspect_mask(subres->aspectMask, 
img->vk_format);
+   uint32_t bpp = vk_format_get_blocksize(format);
+   uint64_t va = cmd_buffer->device->ws->buffer_get_va(img->bo);
+
+   va += img->offset;
+   *pitch = base_level->nblk_x;
+   *slice_pitch = base_level->slice_size / bpp;
+   if (bpp_p)
+   *bpp_p = bpp;
+   *va_p = va;
+}
+
+static unsigned encode_tile_info(struct radv_cmd_buffer *cmd_buffer,
+struct radv_image *image, unsigned level,
+bool 

Re: [Mesa-dev] [PATCH] spirv: Add more asserts in vtn_vector_construct

2017-02-06 Thread Jason Ekstrand
On Mon, Feb 6, 2017 at 9:18 PM, Jason Ekstrand  wrote:

> These are currently getting hit by the Skia Vulkan back-end
>

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99465


> ---
>  src/compiler/spirv/spirv_to_nir.c | 15 +++
>  1 file changed, 15 insertions(+)
>
> diff --git a/src/compiler/spirv/spirv_to_nir.c
> b/src/compiler/spirv/spirv_to_nir.c
> index 9f0b8fd..416e12a 100644
> --- a/src/compiler/spirv/spirv_to_nir.c
> +++ b/src/compiler/spirv/spirv_to_nir.c
> @@ -2334,9 +2334,17 @@ vtn_vector_construct(struct vtn_builder *b,
> unsigned num_components,
> nir_alu_instr *vec = create_vec(b->shader, num_components,
> srcs[0]->bit_size);
>
> +   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
> +*
> +*"When constructing a vector, there must be at least two
> Constituent
> +*operands."
> +*/
> +   assert(num_srcs >= 2);
> +
> unsigned dest_idx = 0;
> for (unsigned i = 0; i < num_srcs; i++) {
>nir_ssa_def *src = srcs[i];
> +  assert(dest_idx + src->num_components <= num_components);
>for (unsigned j = 0; j < src->num_components; j++) {
>   vec->src[dest_idx].src = nir_src_for_ssa(src);
>   vec->src[dest_idx].swizzle[0] = j;
> @@ -2344,6 +2352,13 @@ vtn_vector_construct(struct vtn_builder *b,
> unsigned num_components,
>}
> }
>
> +   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
> +*
> +*"When constructing a vector, the total number of components in
> all
> +*the operands must equal the number of components in Result Type."
> +*/
> +   assert(dest_idx == num_components);
> +
> nir_builder_instr_insert(>nb, >instr);
>
> return >dest.dest.ssa;
> --
> 2.5.0.400.gff86faf
>
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] spirv: Add more asserts in vtn_vector_construct

2017-02-06 Thread Jason Ekstrand
These are currently getting hit by the Skia Vulkan back-end
---
 src/compiler/spirv/spirv_to_nir.c | 15 +++
 1 file changed, 15 insertions(+)

diff --git a/src/compiler/spirv/spirv_to_nir.c 
b/src/compiler/spirv/spirv_to_nir.c
index 9f0b8fd..416e12a 100644
--- a/src/compiler/spirv/spirv_to_nir.c
+++ b/src/compiler/spirv/spirv_to_nir.c
@@ -2334,9 +2334,17 @@ vtn_vector_construct(struct vtn_builder *b, unsigned 
num_components,
nir_alu_instr *vec = create_vec(b->shader, num_components,
srcs[0]->bit_size);
 
+   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
+*
+*"When constructing a vector, there must be at least two Constituent
+*operands."
+*/
+   assert(num_srcs >= 2);
+
unsigned dest_idx = 0;
for (unsigned i = 0; i < num_srcs; i++) {
   nir_ssa_def *src = srcs[i];
+  assert(dest_idx + src->num_components <= num_components);
   for (unsigned j = 0; j < src->num_components; j++) {
  vec->src[dest_idx].src = nir_src_for_ssa(src);
  vec->src[dest_idx].swizzle[0] = j;
@@ -2344,6 +2352,13 @@ vtn_vector_construct(struct vtn_builder *b, unsigned 
num_components,
   }
}
 
+   /* From the SPIR-V 1.1 spec for OpCompositeConstruct:
+*
+*"When constructing a vector, the total number of components in all
+*the operands must equal the number of components in Result Type."
+*/
+   assert(dest_idx == num_components);
+
nir_builder_instr_insert(>nb, >instr);
 
return >dest.dest.ssa;
-- 
2.5.0.400.gff86faf

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH V2 01/40] st/mesa/i965: create link status enum

2017-02-06 Thread Timothy Arceri
For the on-disk shader cache we want to be able to differentiate
between a program that was linked and one that was loaded from cache.

V2:
 - don't return the new enum directly to the application when queried,
   instead return GL_TRUE or GL_FALSE as required. Fixes google-chrome
   corruptions when using cache.
---
 src/compiler/glsl/linker.cpp   |  6 +++---
 src/compiler/glsl/standalone.cpp   |  2 +-
 src/mesa/drivers/dri/i965/brw_cs.c |  4 ++--
 src/mesa/drivers/dri/i965/brw_tcs.c|  2 +-
 src/mesa/drivers/dri/i965/brw_tes.c|  2 +-
 src/mesa/drivers/dri/i965/brw_vs.c |  2 +-
 src/mesa/drivers/dri/i965/brw_wm.c |  2 +-
 src/mesa/main/mtypes.h | 13 -
 src/mesa/main/program_resource.c   |  2 +-
 src/mesa/main/shaderapi.c  | 10 +-
 src/mesa/main/uniforms.c   |  2 +-
 src/mesa/program/ir_to_mesa.cpp|  4 ++--
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp |  2 +-
 13 files changed, 32 insertions(+), 21 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index b768a6e..720c22b 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -421,7 +421,7 @@ linker_error(gl_shader_program *prog, const char *fmt, ...)
ralloc_vasprintf_append(>data->InfoLog, fmt, ap);
va_end(ap);
 
-   prog->data->LinkStatus = false;
+   prog->data->LinkStatus = linking_failure;
 }
 
 
@@ -2190,7 +2190,7 @@ link_intrastage_shaders(void *mem_ctx,
  
_mesa_shader_stage_to_program(shader_list[0]->Stage),
  prog->Name, false);
if (!gl_prog) {
-  prog->data->LinkStatus = false;
+  prog->data->LinkStatus = linking_failure;
   _mesa_delete_linked_shader(ctx, linked);
   return NULL;
}
@@ -4629,7 +4629,7 @@ linker_optimisation_loop(struct gl_context *ctx, 
exec_list *ir,
 void
 link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
 {
-   prog->data->LinkStatus = true; /* All error paths will set this to false */
+   prog->data->LinkStatus = linking_success; /* All error paths will set this 
to false */
prog->data->Validated = false;
 
/* Section 7.3 (Program Objects) of the OpenGL 4.5 Core Profile spec says:
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp
index 44f2c0f..7a2d3d2 100644
--- a/src/compiler/glsl/standalone.cpp
+++ b/src/compiler/glsl/standalone.cpp
@@ -509,7 +509,7 @@ standalone_compile_shader(const struct standalone_options 
*_options,
   } else {
  const gl_shader_stage stage = whole_program->Shaders[0]->Stage;
 
- whole_program->data->LinkStatus = GL_TRUE;
+ whole_program->data->LinkStatus = linking_success;
  whole_program->_LinkedShaders[stage] =
 link_intrastage_shaders(whole_program /* mem_ctx */,
 ctx,
diff --git a/src/mesa/drivers/dri/i965/brw_cs.c 
b/src/mesa/drivers/dri/i965/brw_cs.c
index 0f8d4eb..16b7945 100644
--- a/src/mesa/drivers/dri/i965/brw_cs.c
+++ b/src/mesa/drivers/dri/i965/brw_cs.c
@@ -66,7 +66,7 @@ brw_codegen_cs_prog(struct brw_context *brw,
memset(_data, 0, sizeof(prog_data));
 
if (cp->program.info.cs.shared_size > 64 * 1024) {
-  cp->program.sh.data->LinkStatus = false;
+  cp->program.sh.data->LinkStatus = linking_failure;
   const char *error_str =
  "Compute shader used more than 64KB of shared variables";
   ralloc_strcat(>program.sh.data->InfoLog, error_str);
@@ -119,7 +119,7 @@ brw_codegen_cs_prog(struct brw_context *brw,
 _data, cp->program.nir, st_index,
 _size, _str);
if (program == NULL) {
-  cp->program.sh.data->LinkStatus = false;
+  cp->program.sh.data->LinkStatus = linking_failure;
   ralloc_strcat(>program.sh.data->InfoLog, error_str);
   _mesa_problem(NULL, "Failed to compile compute shader: %s\n", error_str);
 
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c 
b/src/mesa/drivers/dri/i965/brw_tcs.c
index 858ecf9..64bfc40 100644
--- a/src/mesa/drivers/dri/i965/brw_tcs.c
+++ b/src/mesa/drivers/dri/i965/brw_tcs.c
@@ -249,7 +249,7 @@ brw_codegen_tcs_prog(struct brw_context *brw, struct 
brw_program *tcp,
   _size, _str);
if (program == NULL) {
   if (tep) {
- tep->program.sh.data->LinkStatus = false;
+ tep->program.sh.data->LinkStatus = linking_failure;
  ralloc_strcat(>program.sh.data->InfoLog, error_str);
   }
 
diff --git a/src/mesa/drivers/dri/i965/brw_tes.c 
b/src/mesa/drivers/dri/i965/brw_tes.c
index cb12b9c..3da5357 100644
--- a/src/mesa/drivers/dri/i965/brw_tes.c
+++ b/src/mesa/drivers/dri/i965/brw_tes.c
@@ -124,7 +124,7 @@ brw_codegen_tes_prog(struct brw_context *brw,
   brw_compile_tes(compiler, brw, mem_ctx, key, _vue_map, _data,
   nir, >program, st_index, _size, _str);
 

Re: [Mesa-dev] [PATCH] glsl: correct compute shader checks for memoryBarrier functions

2017-02-06 Thread Kenneth Graunke
On Monday, February 6, 2017 9:07:30 AM PST Marc Di Luzio wrote:
> As per the spec -
> "The functions memoryBarrierShared() and groupMemoryBarrier() are
> available only in compute shaders; the other functions are available
> in all shader types."
> 
> Conform to this by adding another delegate to check for compute
> shader support instead of only whether the current stage is compute
> 
> This allows some fragment shaders in Dirt Rally to compile
> 
> CC: "17.0" 
> 
> Reviewed-by: Anuj Phogat 

Reviewed-by: Kenneth Graunke 

and pushed:

To ssh://git.freedesktop.org/git/mesa/mesa
   83fb63d31de..21efe2528cd  master -> master

Thanks, Marc!


signature.asc
Description: This is a digitally signed message part.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 99246] [d3dadapter+radeonsi & bisect] EVE-Online : hang on wormhole sight

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99246

--- Comment #4 from Mathieu Belanger  ---
Will do more debugging, was out of time.

Just to let you know, I have updated to latest git and upgraded to a RX480, bug
still present.

-- 
You are receiving this mail because:
You are the assignee for the bug.
You are the QA Contact for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 35/40] util/disk_cache: allow drivers to pass a directory structure

2017-02-06 Thread Timothy Arceri
In order to avoid costly fallback recompiles when cache items are
created with an old version of Mesa or for a different gpu on the
same system we want to create directories that look like this:

./{MESA_VERSION_STRING}/{GPU_ID}

For llvm based drivers we will probably want an additional
{LLVM_VERSION} folder although it looks like there is currently
no support for querying this at runtime.
---
 src/compiler/glsl/tests/cache_test.c | 20 ++--
 src/util/disk_cache.c| 29 +
 src/util/disk_cache.h|  4 ++--
 3 files changed, 37 insertions(+), 16 deletions(-)

diff --git a/src/compiler/glsl/tests/cache_test.c 
b/src/compiler/glsl/tests/cache_test.c
index 8547141..ba56441 100644
--- a/src/compiler/glsl/tests/cache_test.c
+++ b/src/compiler/glsl/tests/cache_test.c
@@ -126,7 +126,7 @@ test_disk_cache_create(void)
 * MESA_GLSL_CACHE_DISABLE set, that disk_cache_create returns NULL.
 */
setenv("MESA_GLSL_CACHE_DISABLE", "1", 1);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_null(cache, "disk_cache_create with MESA_GLSL_CACHE_DISABLE set");
 
unsetenv("MESA_GLSL_CACHE_DISABLE");
@@ -137,19 +137,19 @@ test_disk_cache_create(void)
unsetenv("MESA_GLSL_CACHE_DIR");
unsetenv("XDG_CACHE_HOME");
 
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_non_null(cache, "disk_cache_create with no environment variables");
 
disk_cache_destroy(cache);
 
/* Test with XDG_CACHE_HOME set */
setenv("XDG_CACHE_HOME", CACHE_TEST_TMP "/xdg-cache-home", 1);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_null(cache, "disk_cache_create with XDG_CACHE_HOME set with"
"a non-existing parent directory");
 
mkdir(CACHE_TEST_TMP, 0755);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_non_null(cache, "disk_cache_create with XDG_CACHE_HOME set");
 
disk_cache_destroy(cache);
@@ -159,12 +159,12 @@ test_disk_cache_create(void)
expect_equal(err, 0, "Removing " CACHE_TEST_TMP);
 
setenv("MESA_GLSL_CACHE_DIR", CACHE_TEST_TMP "/mesa-glsl-cache-dir", 1);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_null(cache, "disk_cache_create with MESA_GLSL_CACHE_DIR set with"
"a non-existing parent directory");
 
mkdir(CACHE_TEST_TMP, 0755);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
expect_non_null(cache, "disk_cache_create with MESA_GLSL_CACHE_DIR set");
 
disk_cache_destroy(cache);
@@ -203,7 +203,7 @@ test_put_and_get(void)
uint8_t one_KB_key[20], one_MB_key[20];
int count;
 
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
 
_mesa_sha1_compute(blob, sizeof(blob), blob_key);
 
@@ -235,7 +235,7 @@ test_put_and_get(void)
disk_cache_destroy(cache);
 
setenv("MESA_GLSL_CACHE_MAX_SIZE", "1K", 1);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
 
one_KB = calloc(1, 1024);
 
@@ -287,7 +287,7 @@ test_put_and_get(void)
disk_cache_destroy(cache);
 
setenv("MESA_GLSL_CACHE_MAX_SIZE", "1M", 1);
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
 
disk_cache_put(cache, blob_key, blob, sizeof(blob));
disk_cache_put(cache, string_key, string, sizeof(string));
@@ -343,7 +343,7 @@ test_put_key_and_get_key(void)
 { 0,  1, 42, 43, 44, 45, 46, 47, 48, 49,
  50, 55, 52, 53, 54, 55, 56, 57, 58, 59};
 
-   cache = disk_cache_create();
+   cache = disk_cache_create("test", "make_check");
 
/* First test that disk_cache_has_key returns false before 
disk_cache_put_key */
result = disk_cache_has_key(cache, key_a);
diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 382ac6c..df511e4 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -115,7 +115,7 @@ mkdir_if_needed(char *path)
  *  / cannot be created as a directory
  */
 static char *
-concatenate_and_mkdir(void *ctx, char *path, char *name)
+concatenate_and_mkdir(void *ctx, char *path, const char *name)
 {
char *new_path;
struct stat sb;
@@ -131,8 +131,27 @@ concatenate_and_mkdir(void *ctx, char *path, char *name)
   return NULL;
 }
 
+static char *
+create_mesa_cache_dir(void *mem_ctx, char *path, const char *mesa_version,
+  const char *gpu_name)
+{
+   char *new_path = concatenate_and_mkdir(mem_ctx, path, "mesa");
+   if (new_path == NULL)
+  return NULL;
+
+   new_path = concatenate_and_mkdir(mem_ctx, new_path, mesa_version);
+   if (new_path == NULL)
+  return NULL;
+
+   new_path = concatenate_and_mkdir(mem_ctx, new_path, gpu_name);
+   if (new_path == NULL)
+  return NULL;
+
+   return new_path;
+}
+
 

[Mesa-dev] [PATCH 39/40] mesa: add helper to create cache name string

2017-02-06 Thread Timothy Arceri
---
 src/mesa/main/version.c | 9 +
 src/mesa/main/version.h | 3 +++
 2 files changed, 12 insertions(+)

diff --git a/src/mesa/main/version.c b/src/mesa/main/version.c
index 85ec9de..daf0dcb 100644
--- a/src/mesa/main/version.c
+++ b/src/mesa/main/version.c
@@ -110,6 +110,15 @@ exit:
*compat_context = override[api].compat_suffix;
 }
 
+const char *
+_mesa_create_cache_version_string(void)
+{
+   return "Mesa_" PACKAGE_VERSION
+#ifdef MESA_GIT_SHA1
+  "_" MESA_GIT_SHA1;
+#endif
+}
+
 /**
  * Builds the Mesa version string.
  */
diff --git a/src/mesa/main/version.h b/src/mesa/main/version.h
index ee7cb75..57981a0 100644
--- a/src/mesa/main/version.h
+++ b/src/mesa/main/version.h
@@ -30,6 +30,9 @@
 #include "mtypes.h"
 
 
+const char *
+_mesa_create_cache_version_string(void);
+
 extern GLuint
 _mesa_get_version(const struct gl_extensions *extensions,
   struct gl_constants *consts, gl_api api);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 32/40] glsl: reserve parameter storage on cache restore

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Since we know how big the list will be we can allocate the storage
upfront.
---
 src/compiler/glsl/shader_cache.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 33f903e..44ca5a4 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1109,6 +1109,7 @@ read_shader_parameters(struct blob_reader *metadata,
uint32_t i = 0;
uint32_t num_parameters = blob_read_uint32(metadata);
 
+   _mesa_reserve_parameter_storage(params, num_parameters);
while (i < num_parameters) {
   gl_register_file type = (gl_register_file) blob_read_uint32(metadata);
   const char *name = blob_read_string(metadata);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 34/40] mesa: remove cache creation from _mesa_initialize_context()

2017-02-06 Thread Timothy Arceri
We will change the way we create the cache directory in the following
patches.
---
 src/mesa/main/context.c | 5 -
 1 file changed, 5 deletions(-)

diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
index 16e25a9..bbc13a9 100644
--- a/src/mesa/main/context.c
+++ b/src/mesa/main/context.c
@@ -1230,8 +1230,6 @@ _mesa_initialize_context(struct gl_context *ctx,
memset(>TextureFormatSupported, GL_TRUE,
   sizeof(ctx->TextureFormatSupported));
 
-   ctx->Cache = disk_cache_create();
-
switch (ctx->API) {
case API_OPENGL_COMPAT:
   ctx->BeginEnd = create_beginend_table(ctx);
@@ -1272,7 +1270,6 @@ fail:
free(ctx->BeginEnd);
free(ctx->OutsideBeginEnd);
free(ctx->Save);
-   ralloc_free(ctx->Cache);
return GL_FALSE;
 }
 
@@ -1340,8 +1337,6 @@ _mesa_free_context_data( struct gl_context *ctx )
free(ctx->Save);
free(ctx->ContextLost);
 
-   ralloc_free(ctx->Cache);
-
/* Shared context state (display lists, textures, etc) */
_mesa_reference_shared_state(ctx, >Shared, NULL);
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 40/40] r600/radeonsi: enable glsl/tgsi on-disk cache

2017-02-06 Thread Timothy Arceri
---
 src/gallium/drivers/radeon/r600_pipe_common.c | 17 +
 src/gallium/drivers/radeon/r600_pipe_common.h |  2 ++
 src/gallium/include/pipe/p_screen.h   |  3 +++
 src/mesa/state_tracker/st_context.c   |  6 ++
 4 files changed, 28 insertions(+)

diff --git a/src/gallium/drivers/radeon/r600_pipe_common.c 
b/src/gallium/drivers/radeon/r600_pipe_common.c
index 95a6a48..d7d5362 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.c
+++ b/src/gallium/drivers/radeon/r600_pipe_common.c
@@ -27,6 +27,7 @@
 #include "r600_pipe_common.h"
 #include "r600_cs.h"
 #include "tgsi/tgsi_parse.h"
+#include "util/disk_cache.h"
 #include "util/list.h"
 #include "util/u_draw_quad.h"
 #include "util/u_memory.h"
@@ -772,6 +773,20 @@ static const char* r600_get_chip_name(struct 
r600_common_screen *rscreen)
}
 }
 
+static struct disk_cache* r600_create_disk_cache(struct pipe_screen *pscreen,
+ const char *mesa_version)
+{
+   struct r600_common_screen *rscreen = (struct 
r600_common_screen*)pscreen;
+
+   if (rscreen->disk_shader_cache)
+   return rscreen->disk_shader_cache;
+
+   struct disk_cache *cache = 
disk_cache_create(r600_get_chip_name(rscreen), mesa_version);
+   rscreen->disk_shader_cache = cache;
+
+   return rscreen->disk_shader_cache;
+}
+
 static const char* r600_get_name(struct pipe_screen* pscreen)
 {
struct r600_common_screen *rscreen = (struct 
r600_common_screen*)pscreen;
@@ -1224,6 +1239,7 @@ bool r600_common_screen_init(struct r600_common_screen 
*rscreen,
 rscreen->info.drm_minor, rscreen->info.drm_patchlevel,
 kernel_version, llvm_string);
 
+   rscreen->b.create_disk_cache = r600_create_disk_cache;
rscreen->b.get_name = r600_get_name;
rscreen->b.get_vendor = r600_get_vendor;
rscreen->b.get_device_vendor = r600_get_device_vendor;
@@ -1314,6 +1330,7 @@ void r600_destroy_common_screen(struct r600_common_screen 
*rscreen)
pipe_mutex_destroy(rscreen->gpu_load_mutex);
pipe_mutex_destroy(rscreen->aux_context_lock);
rscreen->aux_context->destroy(rscreen->aux_context);
+   disk_cache_destroy(rscreen->disk_shader_cache);
 
slab_destroy_parent(>pool_transfers);
 
diff --git a/src/gallium/drivers/radeon/r600_pipe_common.h 
b/src/gallium/drivers/radeon/r600_pipe_common.h
index 6eff9aa..72c2df9 100644
--- a/src/gallium/drivers/radeon/r600_pipe_common.h
+++ b/src/gallium/drivers/radeon/r600_pipe_common.h
@@ -400,6 +400,8 @@ struct r600_common_screen {
boolhas_cp_dma;
boolhas_streamout;
 
+   struct disk_cache *disk_shader_cache;
+
struct slab_parent_pool pool_transfers;
 
/* Texture filter settings. */
diff --git a/src/gallium/include/pipe/p_screen.h 
b/src/gallium/include/pipe/p_screen.h
index b6203f1..90f6c93 100644
--- a/src/gallium/include/pipe/p_screen.h
+++ b/src/gallium/include/pipe/p_screen.h
@@ -318,6 +318,9 @@ struct pipe_screen {
const void *(*get_compiler_options)(struct pipe_screen *screen,
   enum pipe_shader_ir ir,
   unsigned shader);
+
+   struct disk_cache *(*create_disk_cache)(struct pipe_screen *screen,
+   const char *mesa_version);
 };
 
 
diff --git a/src/mesa/state_tracker/st_context.c 
b/src/mesa/state_tracker/st_context.c
index 5523734..658faba 100644
--- a/src/mesa/state_tracker/st_context.c
+++ b/src/mesa/state_tracker/st_context.c
@@ -551,6 +551,12 @@ struct st_context *st_create_context(gl_api api, struct 
pipe_context *pipe,
   return NULL;
}
 
+   if (pipe->screen->create_disk_cache) {
+  ctx->Cache =
+ pipe->screen->create_disk_cache(pipe->screen,
+ _mesa_create_cache_version_string());
+   }
+
st_init_driver_flags(>DriverFlags);
 
/* XXX: need a capability bit in gallium to query if the pipe
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 38/40] st/mesa: implement a tgsi on-disk shader cache

2017-02-06 Thread Timothy Arceri
Implements a tgsi cache for the OpenGL state tracker.
---
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 217 +
 src/mesa/state_tracker/st_program.c| 133 +-
 2 files changed, 345 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 5a65f32..452cfdd 100644
--- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
+++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp
@@ -32,6 +32,7 @@
 
 #include "st_glsl_to_tgsi.h"
 
+#include "compiler/glsl/blob.h"
 #include "compiler/glsl/glsl_parser_extras.h"
 #include "compiler/glsl/ir_optimization.h"
 #include "compiler/glsl/program.h"
@@ -47,6 +48,8 @@
 #include "pipe/p_screen.h"
 #include "tgsi/tgsi_ureg.h"
 #include "tgsi/tgsi_info.h"
+#include "util/disk_cache.h"
+#include "util/mesa-sha1.h"
 #include "util/u_math.h"
 #include "util/u_memory.h"
 #include "st_program.h"
@@ -7001,6 +7004,214 @@ has_unsupported_control_flow(exec_list *ir,
return visitor.unsupported;
 }
 
+static void
+read_stream_out_from_cache(struct blob_reader *st_blob,
+   struct pipe_shader_state *tgsi)
+{
+   blob_copy_bytes(st_blob, (uint8_t *) >stream_output,
+sizeof(tgsi->stream_output));
+}
+
+static void
+read_tgsi_from_cache(struct blob_reader *st_blob,
+ struct pipe_shader_state *tgsi)
+{
+   uint32_t num_tokens  = blob_read_uint32(st_blob);
+   unsigned tokens_size = num_tokens * sizeof(struct tgsi_token);
+   tgsi->tokens = (const tgsi_token*) MALLOC(tokens_size);
+   blob_copy_bytes(st_blob, (uint8_t *) tgsi->tokens, tokens_size);
+}
+
+static void
+load_tgsi_from_disk_cache(struct gl_context *ctx,
+  struct gl_shader_program *prog)
+{
+   unsigned char sha1[20];
+   char sha1_buf[41];
+   struct st_context *st = st_context(ctx);
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  if (prog->_LinkedShaders[i] == NULL)
+ continue;
+
+  char *buf = ralloc_strdup(NULL, "tsgi_tokens ");
+  _mesa_sha1_format(sha1_buf,
+prog->_LinkedShaders[i]->Program->sh.data->sha1);
+  ralloc_strcat(, sha1_buf);
+
+  struct gl_program *glprog = prog->_LinkedShaders[i]->Program;
+  switch (glprog->info.stage) {
+  case MESA_SHADER_VERTEX:
+ ralloc_strcat(, " vs");
+ _mesa_sha1_compute(buf, strlen(buf), sha1);
+ break;
+  case MESA_SHADER_TESS_EVAL:
+ ralloc_strcat(, " tes");
+ _mesa_sha1_compute(buf, strlen(buf), sha1);
+ break;
+  case MESA_SHADER_TESS_CTRL:
+ ralloc_strcat(, " tcs");
+ _mesa_sha1_compute(buf, strlen(buf), sha1);
+ break;
+  case MESA_SHADER_GEOMETRY:
+ ralloc_strcat(, " gs");
+ _mesa_sha1_compute(buf, strlen(buf), sha1);
+ break;
+  case MESA_SHADER_FRAGMENT:
+ ralloc_strcat(, " fs");
+ _mesa_sha1_compute(buf, strlen(buf), sha1);
+ break;
+  case MESA_SHADER_COMPUTE:
+ break;
+
+default:
+   unreachable("Unsupported stage");
+  }
+
+  size_t size;
+  const tgsi_token *tgsi_tokens = NULL;
+  uint8_t *buffer = (uint8_t *) disk_cache_get(ctx->Cache, sha1, );
+  if (buffer) {
+ struct blob_reader st_blob;
+ blob_reader_init(_blob, buffer, size);
+
+ switch (glprog->info.stage) {
+ case MESA_SHADER_VERTEX: {
+struct st_vertex_program *stvp =
+   (struct st_vertex_program *) glprog;
+
+st_release_vp_variants(st, stvp);
+
+stvp->num_inputs = blob_read_uint32(_blob);
+blob_copy_bytes(_blob, (uint8_t *) stvp->index_to_input,
+sizeof(stvp->index_to_input));
+blob_copy_bytes(_blob, (uint8_t *) stvp->result_to_output,
+sizeof(stvp->result_to_output));
+
+read_stream_out_from_cache(_blob, >tgsi);
+read_tgsi_from_cache(_blob, >tgsi);
+
+if (st->vp == stvp)
+   st->dirty |= ST_NEW_VERTEX_PROGRAM(st, stvp);
+
+tgsi_tokens = stvp->tgsi.tokens;
+break;
+ }
+ case MESA_SHADER_TESS_EVAL: {
+struct st_tesseval_program *sttep =
+   (struct st_tesseval_program *) glprog;
+
+st_release_basic_variants(st, sttep->Base.Target,
+  >variants, >tgsi);
+
+read_stream_out_from_cache(_blob, >tgsi);
+read_tgsi_from_cache(_blob, >tgsi);
+
+if (st->tep == sttep)
+   st->dirty |= sttep->affected_states;
+
+tgsi_tokens = sttep->tgsi.tokens;
+break;
+ }
+ case MESA_SHADER_TESS_CTRL: {
+struct st_tessctrl_program *sttcp =
+   (struct st_tessctrl_program *) glprog;
+
+st_release_basic_variants(st, sttcp->Base.Target,
+ 

[Mesa-dev] [PATCH 37/40] util/disk_cache: check cache exists before calling munmap()

2017-02-06 Thread Timothy Arceri
---
 src/util/disk_cache.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index da4eb47..a70bd66 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -385,7 +385,8 @@ disk_cache_create(const char *gpu_name, const char 
*mesa_version)
 void
 disk_cache_destroy(struct disk_cache *cache)
 {
-   munmap(cache->index_mmap, cache->index_mmap_size);
+   if (cache)
+  munmap(cache->index_mmap, cache->index_mmap_size);
 
ralloc_free(cache);
 }
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 36/40] util/disk_cache: add support for removing old versions of the cache

2017-02-06 Thread Timothy Arceri
---
 src/util/disk_cache.c | 38 ++
 1 file changed, 38 insertions(+)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index df511e4..da4eb47 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -24,6 +24,7 @@
 #ifdef ENABLE_SHADER_CACHE
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -131,6 +132,40 @@ concatenate_and_mkdir(void *ctx, char *path, const char 
*name)
   return NULL;
 }
 
+static int
+remove_dir(const char *fpath, const struct stat *sb,
+   int typeflag, struct FTW *ftwbuf)
+{
+   if (S_ISREG(sb->st_mode))
+  unlink(fpath);
+   else if (S_ISDIR(sb->st_mode))
+  rmdir(fpath);
+
+   return 0;
+}
+
+static void
+remove_old_cache_directories(void *mem_ctx, char *path,
+ const char *mesa_version)
+{
+   DIR *dir = opendir(path);
+
+   struct dirent* d_entry;
+   while((d_entry = readdir(dir)) != NULL)
+   {
+  struct stat sb;
+  stat(d_entry->d_name, );
+  if (S_ISDIR(sb.st_mode) &&
+  strcmp(d_entry->d_name, mesa_version) != 0 &&
+  strcmp(d_entry->d_name, "..") != 0 &&
+  strcmp(d_entry->d_name, ".") != 0) {
+ char *full_path =
+ralloc_asprintf(mem_ctx, "%s/%s", path, d_entry->d_name);
+ nftw(full_path, remove_dir, 20, FTW_DEPTH);
+  }
+   }
+}
+
 static char *
 create_mesa_cache_dir(void *mem_ctx, char *path, const char *mesa_version,
   const char *gpu_name)
@@ -139,6 +174,9 @@ create_mesa_cache_dir(void *mem_ctx, char *path, const char 
*mesa_version,
if (new_path == NULL)
   return NULL;
 
+   /* Remove cache directories for old Mesa versions */
+   remove_old_cache_directories(mem_ctx, new_path, mesa_version);
+
new_path = concatenate_and_mkdir(mem_ctx, new_path, mesa_version);
if (new_path == NULL)
   return NULL;
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 33/40] glsl: create separate 32bit and 64bit versions of shader cache objects

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Pointers will have different lengths so we simply create a different
sha1 for each platform.

In theory we should be able to share cached shaders as we cache all
pointer as uint64_t however if a pointer is ever added to one of the
structs we write to file with blob_write_bytes() we run the risk of
introducing a bug that would be difficult to reproduce or report from
a user point of veiw. It's also very unlikely that Mesa developers will
regularly regression test the interaction of cache sharing between
platforms.
---
 src/compiler/glsl/shader_cache.cpp | 2 +-
 src/compiler/glsl/shader_cache.h   | 6 ++
 2 files changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 44ca5a4..ddcaeee 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1348,7 +1348,7 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
/* Include bindings when creating sha1. These bindings change the resulting
 * binary so they are just as important as the shader source.
 */
-   char *buf = ralloc_strdup(NULL, "vb: ");
+   char *buf = ralloc_strdup(NULL, CACHED_PROGRAM"\n vb: ");
prog->AttributeBindings->iterate(create_binding_str, );
ralloc_strcat(, "fb: ");
prog->FragDataBindings->iterate(create_binding_str, );
diff --git a/src/compiler/glsl/shader_cache.h b/src/compiler/glsl/shader_cache.h
index 1596c33..2994b66 100644
--- a/src/compiler/glsl/shader_cache.h
+++ b/src/compiler/glsl/shader_cache.h
@@ -27,6 +27,12 @@
 
 #include "util/disk_cache.h"
 
+#if __x86_64__
+#define CACHED_PROGRAM "program64:"
+#else
+#define CACHED_PROGRAM "program32:"
+#endif
+
 static uint64_t inline
 ptr_to_uint64_t(void *ptr)
 {
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 31/40] glsl: don't try to load/store buffer object values in the cache

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Also add an assert to catch buffer overflows.
---
 src/compiler/glsl/shader_cache.cpp | 13 +++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 5180725..33f903e 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -575,6 +575,7 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
   blob_write_uint32(metadata, prog->data->UniformStorage[i].offset);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].array_stride);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].hidden);
+  blob_write_uint32(metadata, 
prog->data->UniformStorage[i].is_shader_storage);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].matrix_stride);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major);
   blob_write_uint32(metadata,
@@ -594,7 +595,9 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
 */
blob_write_uint32(metadata, prog->data->NumHiddenUniforms);
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
-  if (!prog->data->UniformStorage[i].builtin) {
+  if (!prog->data->UniformStorage[i].builtin &&
+  !prog->data->UniformStorage[i].is_shader_storage &&
+  prog->data->UniformStorage[i].block_index == -1) {
  unsigned vec_size =
 values_for_type(prog->data->UniformStorage[i].type) *
 MAX2(prog->data->UniformStorage[i].array_elements, 1);
@@ -636,6 +639,7 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
   uniforms[i].offset = blob_read_uint32(metadata);
   uniforms[i].array_stride = blob_read_uint32(metadata);
   uniforms[i].hidden = blob_read_uint32(metadata);
+  uniforms[i].is_shader_storage = blob_read_uint32(metadata);
   uniforms[i].matrix_stride = blob_read_uint32(metadata);
   uniforms[i].row_major = blob_read_uint32(metadata);
   uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata);
@@ -651,13 +655,18 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
/* Restore uniform values. */
prog->data->NumHiddenUniforms = blob_read_uint32(metadata);
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
-  if (!prog->data->UniformStorage[i].builtin) {
+  if (!prog->data->UniformStorage[i].builtin &&
+  !prog->data->UniformStorage[i].is_shader_storage &&
+  prog->data->UniformStorage[i].block_index == -1) {
  unsigned vec_size =
 values_for_type(prog->data->UniformStorage[i].type) *
 MAX2(prog->data->UniformStorage[i].array_elements, 1);
  blob_copy_bytes(metadata,
  (uint8_t *) prog->data->UniformStorage[i].storage,
  sizeof(union gl_constant_value) * vec_size);
+
+assert(vec_size + prog->data->UniformStorage[i].storage <=
+   data +  prog->data->NumUniformDataSlots);
   }
}
 }
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 29/40] glsl/mesa: make a copy of FragData bindings in case of cache fallback

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

If the shader cache falls back to doing a compile and link we need the
original FragData bindings as they could have changed after the program
was first linked.
---
 src/compiler/glsl/shader_cache.cpp |  8 
 src/mesa/main/mtypes.h |  2 ++
 src/mesa/main/shaderobj.c  | 12 
 3 files changed, 22 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index ddcd530..5180725 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -825,7 +825,11 @@ write_hash_tables(struct blob *metadata, struct 
gl_shader_program *prog)
hash_table_call_foreach(prog->AttributeBindings->ht, copy_hash_entry,
prog->data->FallbackAttributeBindings);
write_hash_table(metadata, prog->FragDataBindings);
+   hash_table_call_foreach(prog->FragDataBindings->ht, copy_hash_entry,
+   prog->data->FallbackFragDataBindings);
write_hash_table(metadata, prog->FragDataIndexBindings);
+   hash_table_call_foreach(prog->FragDataIndexBindings->ht, copy_hash_entry,
+   prog->data->FallbackFragDataIndexBindings);
 }
 
 static void
@@ -835,7 +839,11 @@ read_hash_tables(struct blob_reader *metadata, struct 
gl_shader_program *prog)
hash_table_call_foreach(prog->AttributeBindings->ht, copy_hash_entry,
prog->data->FallbackAttributeBindings);
read_hash_table(metadata, prog->FragDataBindings);
+   hash_table_call_foreach(prog->FragDataBindings->ht, copy_hash_entry,
+   prog->data->FallbackFragDataBindings);
read_hash_table(metadata, prog->FragDataIndexBindings);
+   hash_table_call_foreach(prog->FragDataIndexBindings->ht, copy_hash_entry,
+   prog->data->FallbackFragDataIndexBindings);
 }
 
 static void
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index d1dde0c..7647b09 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2694,6 +2694,8 @@ struct gl_shader_program_data
 * was first linked.
 */
struct string_to_uint_map *FallbackAttributeBindings;
+   struct string_to_uint_map *FallbackFragDataBindings;
+   struct string_to_uint_map *FallbackFragDataIndexBindings;
 
/** List of all active resources after linking. */
struct gl_program_resource *ProgramResourceList;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 245a0b9..e3004f6 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -278,7 +278,9 @@ init_shader_program(struct gl_shader_program *prog)
prog->AttributeBindings = string_to_uint_map_ctor();
prog->data->FallbackAttributeBindings = string_to_uint_map_ctor();
prog->FragDataBindings = string_to_uint_map_ctor();
+   prog->data->FallbackFragDataBindings = string_to_uint_map_ctor();
prog->FragDataIndexBindings = string_to_uint_map_ctor();
+   prog->data->FallbackFragDataIndexBindings = string_to_uint_map_ctor();
 
prog->Geom.UsesEndPrimitive = false;
prog->Geom.UsesStreams = false;
@@ -404,11 +406,21 @@ _mesa_free_shader_program_data(struct gl_context *ctx,
   shProg->FragDataBindings = NULL;
}
 
+   if (shProg->data->FallbackFragDataBindings) {
+  string_to_uint_map_dtor(shProg->data->FallbackFragDataBindings);
+  shProg->data->FallbackFragDataBindings = NULL;
+   }
+
if (shProg->FragDataIndexBindings) {
   string_to_uint_map_dtor(shProg->FragDataIndexBindings);
   shProg->FragDataIndexBindings = NULL;
}
 
+   if (shProg->data->FallbackFragDataIndexBindings) {
+  string_to_uint_map_dtor(shProg->data->FallbackFragDataIndexBindings);
+  shProg->data->FallbackFragDataIndexBindings = NULL;
+   }
+
/* detach shaders */
for (i = 0; i < shProg->NumShaders; i++) {
   _mesa_reference_shader(ctx, >Shaders[i], NULL);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 28/40] glsl/mesa: make a copy of attribute bindings in case of cache fallback

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

If the shader cache falls back to doing a compile and link we need the
original attribute bindings as they could have changed after the program
was first linked.
---
 src/compiler/glsl/shader_cache.cpp | 15 +++
 src/mesa/main/mtypes.h |  7 +++
 src/mesa/main/shaderobj.c  |  6 ++
 3 files changed, 28 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 729dd09..ddcd530 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -808,9 +808,22 @@ read_hash_table(struct blob_reader *metadata, struct 
string_to_uint_map *hash)
 }
 
 static void
+copy_hash_entry(const void *key, void *data, void *closure)
+{
+   struct string_to_uint_map *ht = (struct string_to_uint_map *) closure;
+
+   /* string_to_uint_map increases everything by 1 so we need to allow for
+* this when copying the data directly.
+*/
+   ht->put(((intptr_t) data) - 1, (const char *) key);
+}
+
+static void
 write_hash_tables(struct blob *metadata, struct gl_shader_program *prog)
 {
write_hash_table(metadata, prog->AttributeBindings);
+   hash_table_call_foreach(prog->AttributeBindings->ht, copy_hash_entry,
+   prog->data->FallbackAttributeBindings);
write_hash_table(metadata, prog->FragDataBindings);
write_hash_table(metadata, prog->FragDataIndexBindings);
 }
@@ -819,6 +832,8 @@ static void
 read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog)
 {
read_hash_table(metadata, prog->AttributeBindings);
+   hash_table_call_foreach(prog->AttributeBindings->ht, copy_hash_entry,
+   prog->data->FallbackAttributeBindings);
read_hash_table(metadata, prog->FragDataBindings);
read_hash_table(metadata, prog->FragDataIndexBindings);
 }
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index f65cd76..d1dde0c 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2688,6 +2688,13 @@ struct gl_shader_program_data
GLuint NumFallbackShaders;
struct gl_shader **FallbackShaders; /**< Shaders used for cache fallback */
 
+   /**
+* If the shader cache falls back to doing a compile and link we need the
+* original attribute bindings as they could have changed after the program
+* was first linked.
+*/
+   struct string_to_uint_map *FallbackAttributeBindings;
+
/** List of all active resources after linking. */
struct gl_program_resource *ProgramResourceList;
unsigned NumProgramResourceList;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index ed19a72..245a0b9 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -276,6 +276,7 @@ init_shader_program(struct gl_shader_program *prog)
prog->RefCount = 1;
 
prog->AttributeBindings = string_to_uint_map_ctor();
+   prog->data->FallbackAttributeBindings = string_to_uint_map_ctor();
prog->FragDataBindings = string_to_uint_map_ctor();
prog->FragDataIndexBindings = string_to_uint_map_ctor();
 
@@ -393,6 +394,11 @@ _mesa_free_shader_program_data(struct gl_context *ctx,
   shProg->AttributeBindings = NULL;
}
 
+   if (shProg->data->FallbackAttributeBindings) {
+  string_to_uint_map_dtor(shProg->data->FallbackAttributeBindings);
+  shProg->data->FallbackAttributeBindings = NULL;
+   }
+
if (shProg->FragDataBindings) {
   string_to_uint_map_dtor(shProg->FragDataBindings);
   shProg->FragDataBindings = NULL;
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 30/40] glsl: disable on disk shader cache when running as another user

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/util/disk_cache.c | 4 
 1 file changed, 4 insertions(+)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 7451b08..382ac6c 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -142,6 +142,10 @@ disk_cache_create(void)
struct stat sb;
size_t size;
 
+   /* If running as a users other than the real user disable cache */
+   if (geteuid() != getuid())
+  return NULL;
+
/* A ralloc context for transient data during this invocation. */
local = ralloc_context(NULL);
if (local == NULL)
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 18/40] glsl: make uniform values helper available for use elsewhere

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/link_uniforms.cpp | 2 +-
 src/compiler/glsl/linker.h  | 3 +++
 2 files changed, 4 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/link_uniforms.cpp 
b/src/compiler/glsl/link_uniforms.cpp
index e9a2053..2b27793 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -45,7 +45,7 @@
 /**
  * Count the backing storage requirements for a type
  */
-static unsigned
+unsigned
 values_for_type(const glsl_type *type)
 {
if (type->is_sampler()) {
diff --git a/src/compiler/glsl/linker.h b/src/compiler/glsl/linker.h
index 9841ef0..abcfdb1 100644
--- a/src/compiler/glsl/linker.h
+++ b/src/compiler/glsl/linker.h
@@ -76,6 +76,9 @@ void
 validate_interstage_uniform_blocks(struct gl_shader_program *prog,
gl_linked_shader **stages);
 
+unsigned
+values_for_type(const glsl_type *type);
+
 extern void
 link_assign_atomic_counter_resources(struct gl_context *ctx,
  struct gl_shader_program *prog);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 23/40] glsl: don't reference shader prog data during cache fallback

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

We already have a reference.
---
 src/compiler/glsl/linker.cpp | 3 ++-
 src/mesa/main/shaderobj.c| 3 ++-
 2 files changed, 4 insertions(+), 2 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 62cc2fd..c47b4fe 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -2197,7 +2197,8 @@ link_intrastage_shaders(void *mem_ctx,
   return NULL;
}
 
-   _mesa_reference_shader_program_data(ctx, _prog->sh.data, prog->data);
+   if (!prog->data->cache_fallback)
+  _mesa_reference_shader_program_data(ctx, _prog->sh.data, prog->data);
 
/* Don't use _mesa_reference_program() just take ownership */
linked->Program = gl_prog;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 6ddccd2..a8d3f5a 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -433,7 +433,8 @@ _mesa_delete_shader_program(struct gl_context *ctx,
 struct gl_shader_program *shProg)
 {
_mesa_free_shader_program_data(ctx, shProg);
-   _mesa_reference_shader_program_data(ctx, >data, NULL);
+   if (!shProg->data->cache_fallback)
+  _mesa_reference_shader_program_data(ctx, >data, NULL);
ralloc_free(shProg);
 }
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 25/40] glsl: skip more uniform initialisation when doing fallback linking

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

We already pull these values from the metadata cache so no need to
recreate them.
---
 src/compiler/glsl/linker.cpp | 20 
 src/mesa/main/shaderobj.c|  8 +---
 2 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index c47b4fe..510668d 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -4532,12 +4532,14 @@ link_and_validate_uniforms(struct gl_context *ctx,
update_array_sizes(prog);
link_assign_uniform_locations(prog, ctx);
 
-   link_assign_atomic_counter_resources(ctx, prog);
-   link_calculate_subroutine_compat(prog);
-   check_resources(ctx, prog);
-   check_subroutine_resources(prog);
-   check_image_resources(ctx, prog);
-   link_check_atomic_counter_resources(ctx, prog);
+   if (!prog->data->cache_fallback) {
+  link_assign_atomic_counter_resources(ctx, prog);
+  link_calculate_subroutine_compat(prog);
+  check_resources(ctx, prog);
+  check_subroutine_resources(prog);
+  check_image_resources(ctx, prog);
+  link_check_atomic_counter_resources(ctx, prog);
+   }
 }
 
 static bool
@@ -4834,8 +4836,10 @@ link_shaders(struct gl_context *ctx, struct 
gl_shader_program *prog)
   last = i;
}
 
-   check_explicit_uniform_locations(ctx, prog);
-   link_assign_subroutine_types(prog);
+   if (!prog->data->cache_fallback) {
+  check_explicit_uniform_locations(ctx, prog);
+  link_assign_subroutine_types(prog);
+   }
 
if (!prog->data->LinkStatus)
   goto done;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 4804041..33b9f63 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -358,9 +358,11 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
shProg->data->ShaderStorageBlocks = NULL;
shProg->data->NumShaderStorageBlocks = 0;
 
-   ralloc_free(shProg->data->AtomicBuffers);
-   shProg->data->AtomicBuffers = NULL;
-   shProg->data->NumAtomicBuffers = 0;
+   if (shProg->data->AtomicBuffers && !shProg->data->cache_fallback) {
+  ralloc_free(shProg->data->AtomicBuffers);
+  shProg->data->AtomicBuffers = NULL;
+  shProg->data->NumAtomicBuffers = 0;
+   }
 
if (shProg->data->ProgramResourceList) {
   ralloc_free(shProg->data->ProgramResourceList);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 26/40] glsl: don't reprocess or clear UBOs on cache fallback

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/linker.cpp | 62 +++-
 src/mesa/main/shaderobj.c| 16 +++-
 2 files changed, 42 insertions(+), 36 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 510668d..3f733ce 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -2252,32 +2252,34 @@ link_intrastage_shaders(void *mem_ctx,
v.run(linked->ir);
v.fixup_unnamed_interface_types();
 
-   /* Link up uniform blocks defined within this stage. */
-   link_uniform_blocks(mem_ctx, ctx, prog, linked, _blocks,
-   _ubo_blocks, _blocks, _ssbo_blocks);
-
-   if (!prog->data->LinkStatus) {
-  _mesa_delete_linked_shader(ctx, linked);
-  return NULL;
-   }
+   if (!prog->data->cache_fallback) {
+  /* Link up uniform blocks defined within this stage. */
+  link_uniform_blocks(mem_ctx, ctx, prog, linked, _blocks,
+  _ubo_blocks, _blocks, _ssbo_blocks);
 
-   /* Copy ubo blocks to linked shader list */
-   linked->Program->sh.UniformBlocks =
-  ralloc_array(linked, gl_uniform_block *, num_ubo_blocks);
-   ralloc_steal(linked, ubo_blocks);
-   for (unsigned i = 0; i < num_ubo_blocks; i++) {
-  linked->Program->sh.UniformBlocks[i] = _blocks[i];
-   }
-   linked->Program->info.num_ubos = num_ubo_blocks;
+  if (!prog->data->LinkStatus) {
+ _mesa_delete_linked_shader(ctx, linked);
+ return NULL;
+  }
 
-   /* Copy ssbo blocks to linked shader list */
-   linked->Program->sh.ShaderStorageBlocks =
-  ralloc_array(linked, gl_uniform_block *, num_ssbo_blocks);
-   ralloc_steal(linked, ssbo_blocks);
-   for (unsigned i = 0; i < num_ssbo_blocks; i++) {
-  linked->Program->sh.ShaderStorageBlocks[i] = _blocks[i];
+  /* Copy ubo blocks to linked shader list */
+  linked->Program->sh.UniformBlocks =
+ ralloc_array(linked, gl_uniform_block *, num_ubo_blocks);
+  ralloc_steal(linked, ubo_blocks);
+  for (unsigned i = 0; i < num_ubo_blocks; i++) {
+ linked->Program->sh.UniformBlocks[i] = _blocks[i];
+  }
+  linked->Program->info.num_ubos = num_ubo_blocks;
+
+  /* Copy ssbo blocks to linked shader list */
+  linked->Program->sh.ShaderStorageBlocks =
+ ralloc_array(linked, gl_uniform_block *, num_ssbo_blocks);
+  ralloc_steal(linked, ssbo_blocks);
+  for (unsigned i = 0; i < num_ssbo_blocks; i++) {
+ linked->Program->sh.ShaderStorageBlocks[i] = _blocks[i];
+  }
+  linked->Program->info.num_ssbos = num_ssbo_blocks;
}
-   linked->Program->info.num_ssbos = num_ssbo_blocks;
 
/* At this point linked should contain all of the linked IR, so
 * validate it to make sure nothing went wrong.
@@ -4894,13 +4896,15 @@ link_shaders(struct gl_context *ctx, struct 
gl_shader_program *prog)
if (prog->SeparateShader)
   disable_varying_optimizations_for_sso(prog);
 
-   /* Process UBOs */
-   if (!interstage_cross_validate_uniform_blocks(prog, false))
-  goto done;
+   if (!prog->data->cache_fallback) {
+  /* Process UBOs */
+  if (!interstage_cross_validate_uniform_blocks(prog, false))
+ goto done;
 
-   /* Process SSBOs */
-   if (!interstage_cross_validate_uniform_blocks(prog, true))
-  goto done;
+  /* Process SSBOs */
+  if (!interstage_cross_validate_uniform_blocks(prog, true))
+ goto done;
+   }
 
/* Do common optimization before assigning storage for attributes,
 * uniforms, and varyings.  Later optimization could possibly make
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index 33b9f63..ed19a72 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -350,13 +350,15 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
ralloc_free(shProg->data->InfoLog);
shProg->data->InfoLog = ralloc_strdup(shProg->data, "");
 
-   ralloc_free(shProg->data->UniformBlocks);
-   shProg->data->UniformBlocks = NULL;
-   shProg->data->NumUniformBlocks = 0;
-
-   ralloc_free(shProg->data->ShaderStorageBlocks);
-   shProg->data->ShaderStorageBlocks = NULL;
-   shProg->data->NumShaderStorageBlocks = 0;
+   if (!shProg->data->cache_fallback) {
+  ralloc_free(shProg->data->UniformBlocks);
+  shProg->data->UniformBlocks = NULL;
+  shProg->data->NumUniformBlocks = 0;
+
+  ralloc_free(shProg->data->ShaderStorageBlocks);
+  shProg->data->ShaderStorageBlocks = NULL;
+  shProg->data->NumShaderStorageBlocks = 0;
+   }
 
if (shProg->data->AtomicBuffers && !shProg->data->cache_fallback) {
   ralloc_free(shProg->data->AtomicBuffers);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 24/40] glsl: don't lose uniform values when falling back to full compile

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Here we skip the recreation of uniform storage if we are relinking
after a cache miss. This is improtant because uniform values may
have already been set by the application and we don't want to reset
them.
---
 src/compiler/glsl/link_uniforms.cpp | 31 +++
 src/mesa/main/shaderobj.c   |  4 ++--
 2 files changed, 25 insertions(+), 10 deletions(-)

diff --git a/src/compiler/glsl/link_uniforms.cpp 
b/src/compiler/glsl/link_uniforms.cpp
index 2b27793..c29fbed 100644
--- a/src/compiler/glsl/link_uniforms.cpp
+++ b/src/compiler/glsl/link_uniforms.cpp
@@ -1213,11 +1213,17 @@ link_assign_uniform_storage(struct gl_context *ctx,
 
unsigned int boolean_true = ctx->Const.UniformBooleanTrue;
 
-   prog->data->UniformStorage = rzalloc_array(prog, struct gl_uniform_storage,
-  prog->data->NumUniformStorage);
-   union gl_constant_value *data = rzalloc_array(prog->data->UniformStorage,
- union gl_constant_value,
- num_data_slots);
+   union gl_constant_value *data;
+   if (prog->data->UniformStorage == NULL) {
+  prog->data->UniformStorage = rzalloc_array(prog,
+ struct gl_uniform_storage,
+ 
prog->data->NumUniformStorage);
+  data = rzalloc_array(prog->data->UniformStorage,
+   union gl_constant_value, num_data_slots);
+   } else {
+  data = prog->data->UniformDataSlots;
+   }
+
 #ifndef NDEBUG
union gl_constant_value *data_end = [num_data_slots];
 #endif
@@ -1252,6 +1258,13 @@ link_assign_uniform_storage(struct gl_context *ctx,
  sizeof(prog->_LinkedShaders[i]->Program->sh.SamplerTargets));
}
 
+   /* If this is a fallback compile for a cache miss we already have the
+* correct uniform mappings and we don't want to reinitialise uniforms so
+* just return now.
+*/
+   if (prog->data->cache_fallback)
+  return;
+
 #ifndef NDEBUG
for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
   assert(prog->data->UniformStorage[i].storage != NULL ||
@@ -1276,9 +1289,11 @@ void
 link_assign_uniform_locations(struct gl_shader_program *prog,
   struct gl_context *ctx)
 {
-   ralloc_free(prog->data->UniformStorage);
-   prog->data->UniformStorage = NULL;
-   prog->data->NumUniformStorage = 0;
+   if (!prog->data->cache_fallback) {
+  ralloc_free(prog->data->UniformStorage);
+  prog->data->UniformStorage = NULL;
+  prog->data->NumUniformStorage = 0;
+   }
 
if (prog->UniformHash != NULL) {
   prog->UniformHash->clear();
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index a8d3f5a..4804041 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -326,7 +326,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
 
shProg->data->linked_stages = 0;
 
-   if (shProg->data->UniformStorage) {
+   if (shProg->data->UniformStorage && !shProg->data->cache_fallback) {
   for (unsigned i = 0; i < shProg->data->NumUniformStorage; ++i)
  _mesa_uniform_detach_all_driver_storage(>data->
 UniformStorage[i]);
@@ -335,7 +335,7 @@ _mesa_clear_shader_program_data(struct gl_context *ctx,
   shProg->data->UniformStorage = NULL;
}
 
-   if (shProg->UniformRemapTable) {
+   if (shProg->UniformRemapTable && !shProg->data->cache_fallback) {
   ralloc_free(shProg->UniformRemapTable);
   shProg->NumUniformRemapTable = 0;
   shProg->UniformRemapTable = NULL;
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 27/40] util: make string_to_uint_map hash table public

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This will allow us to make use of the hash_table_call_foreach()
function from outside the object.
---
 src/util/string_to_uint_map.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/util/string_to_uint_map.h b/src/util/string_to_uint_map.h
index e0533ec..18f5166 100644
--- a/src/util/string_to_uint_map.h
+++ b/src/util/string_to_uint_map.h
@@ -150,6 +150,8 @@ public:
  free(dup_key);
}
 
+   struct hash_table *ht;
+
 private:
static void delete_key(const void *key, void *data, void *closure)
{
@@ -169,8 +171,6 @@ private:
 
   wrapper->callback((const char *) key, value, wrapper->closure);
}
-
-   struct hash_table *ht;
 };
 
 #endif /* __cplusplus */
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 21/40] mesa/glsl: add cache_fallback flag to gl_shader_program_data

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This will allow us to skip certain things when falling back to
a full recompile on a cache miss such as avoiding reinitialising
uniforms.

In this chage we use it to avoid reading the program metadata
from the cache and skipping linking during a fallback.
---
 src/compiler/glsl/shader_cache.cpp | 2 +-
 src/mesa/main/mtypes.h | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 320afe1..583db47 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1273,7 +1273,7 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
   return false;
 
struct disk_cache *cache = ctx->Cache;
-   if (!cache)
+   if (!cache || prog->data->cache_fallback)
   return false;
 
for (unsigned i = 0; i < prog->NumShaders; i++) {
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index a845a39..c7ca182 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2684,6 +2684,8 @@ struct gl_shader_program_data
unsigned NumUniformDataSlots;
union gl_constant_value *UniformDataSlots;
 
+   bool cache_fallback;
+
/** List of all active resources after linking. */
struct gl_program_resource *ProgramResourceList;
unsigned NumProgramResourceList;
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 20/40] glsl: track mesa version shader cache items were created with

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Also remove cache item and fallback to full recompile if current Mesa
version differs.

V2: don't leak buffer
---
 src/compiler/glsl/shader_cache.cpp | 13 +
 1 file changed, 13 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index a9d6987..320afe1 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1205,6 +1205,8 @@ shader_cache_write_program_metadata(struct gl_context 
*ctx,
 
struct blob *metadata = blob_create(NULL);
 
+   blob_write_string(metadata, ctx->VersionString);
+
write_uniforms(metadata, prog);
 
write_hash_tables(metadata, prog);
@@ -1333,6 +1335,17 @@ shader_cache_read_program_metadata(struct gl_context 
*ctx,
struct blob_reader metadata;
blob_reader_init(, buffer, size);
 
+   char *version_string = blob_read_string();
+   if (strcmp(ctx->VersionString, version_string) != 0) {
+  /* The cached version of the program was created with a different
+   * version of Mesa so remove it and fallback to full recompile.
+   */
+  disk_cache_remove(cache, prog->data->sha1);
+  compile_shaders(ctx, prog);
+  free(buffer);
+  return false;
+   }
+
assert(prog->data->UniformStorage == NULL);
 
read_uniforms(, prog);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 22/40] glsl: make a copy of the shader source for use with cache fallback

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

A number of things can happen that change the shader source after it is
compiled or linked.

For example:
- Source changed after it is first compiled
- Source changed after linking
- Shader detached after linking

In order to be able to fallback to a full rebuild on a cache miss we
make a copy of the shader source and store it in the new FallbackShaders
field when linking.
---
 src/compiler/glsl/shader_cache.cpp | 29 +
 src/mesa/main/mtypes.h |  2 ++
 src/mesa/main/shaderobj.c  |  4 
 src/mesa/program/ir_to_mesa.cpp|  8 +++-
 4 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 583db47..729dd09 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1276,6 +1276,35 @@ shader_cache_read_program_metadata(struct gl_context 
*ctx,
if (!cache || prog->data->cache_fallback)
   return false;
 
+   /* Free previous fallback information */
+   if (prog->data->FallbackShaders == NULL) {
+  prog->data->NumFallbackShaders = 0;
+  for (unsigned i = 0; i < prog->data->NumFallbackShaders; i++) {
+ ralloc_free(prog->data->FallbackShaders);
+ prog->data->FallbackShaders = NULL;
+  }
+   }
+
+   /* Shaders could be recompiled using different source code after linking,
+* or the shader could be detached from the program so store some
+* information about the shader to be used in case of fallback.
+*/
+   prog->data->NumFallbackShaders = prog->NumShaders;
+   prog->data->FallbackShaders = (struct gl_shader **)
+  reralloc(NULL, prog->data->FallbackShaders, struct gl_shader *,
+   prog->NumShaders);
+   for (unsigned i = 0; i < prog->NumShaders; i++) {
+  prog->data->FallbackShaders[i] = rzalloc(prog->data->FallbackShaders,
+   struct gl_shader);
+  memcpy(prog->data->FallbackShaders[i]->sha1, prog->Shaders[i]->sha1,
+ sizeof(prog->Shaders[i]->sha1));
+  prog->data->FallbackShaders[i]->Stage = prog->Shaders[i]->Stage;
+  prog->data->FallbackShaders[i]->Source =
+ ralloc_strdup(prog->data->FallbackShaders, prog->Shaders[i]->Source);
+  prog->data->FallbackShaders[i]->InfoLog =
+ ralloc_strdup(prog->data->FallbackShaders, "");
+   }
+
for (unsigned i = 0; i < prog->NumShaders; i++) {
   if (prog->Shaders[i]->Stage == MESA_SHADER_COMPUTE) {
  compile_shaders(ctx, prog);
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index c7ca182..f65cd76 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -2685,6 +2685,8 @@ struct gl_shader_program_data
union gl_constant_value *UniformDataSlots;
 
bool cache_fallback;
+   GLuint NumFallbackShaders;
+   struct gl_shader **FallbackShaders; /**< Shaders used for cache fallback */
 
/** List of all active resources after linking. */
struct gl_program_resource *ProgramResourceList;
diff --git a/src/mesa/main/shaderobj.c b/src/mesa/main/shaderobj.c
index b41137f..6ddccd2 100644
--- a/src/mesa/main/shaderobj.c
+++ b/src/mesa/main/shaderobj.c
@@ -404,10 +404,14 @@ _mesa_free_shader_program_data(struct gl_context *ctx,
   _mesa_reference_shader(ctx, >Shaders[i], NULL);
}
shProg->NumShaders = 0;
+   shProg->data->NumFallbackShaders = 0;
 
free(shProg->Shaders);
shProg->Shaders = NULL;
 
+   ralloc_free(shProg->data->FallbackShaders);
+   shProg->data->FallbackShaders = NULL;
+
/* Transform feedback varying vars */
for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) {
   free(shProg->TransformFeedback.VaryingNames[i]);
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index 67c9267..e286408 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -3130,8 +3130,14 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
   }
}
 
-   if (prog->data->LinkStatus)
+   if (prog->data->LinkStatus && !prog->data->cache_fallback) {
+  if (prog->data->FallbackShaders) {
+ prog->data->NumFallbackShaders = 0;
+ ralloc_free(prog->data->FallbackShaders);
+ prog->data->FallbackShaders = NULL;
+  }
   shader_cache_write_program_metadata(ctx, prog);
+   }
 }
 
 } /* extern "C" */
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 15/40] glsl: add shader cache support for buffer blocks

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 163 +
 1 file changed, 163 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index deabc2a..530bdad 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -270,6 +270,141 @@ read_subroutines(struct blob_reader *metadata, struct 
gl_shader_program *prog)
 }
 
 static void
+write_buffer_block(struct blob *metadata, struct gl_uniform_block *b)
+{
+   blob_write_string(metadata, b->Name);
+   blob_write_uint32(metadata, b->NumUniforms);
+   blob_write_uint32(metadata, b->Binding);
+   blob_write_uint32(metadata, b->UniformBufferSize);
+   blob_write_uint32(metadata, b->stageref);
+
+   for (unsigned j = 0; j < b->NumUniforms; j++) {
+  blob_write_string(metadata, b->Uniforms[j].Name);
+  blob_write_string(metadata, b->Uniforms[j].IndexName);
+  encode_type_to_blob(metadata, b->Uniforms[j].Type);
+  blob_write_uint32(metadata, b->Uniforms[j].Offset);
+   }
+}
+
+static void
+write_buffer_blocks(struct blob *metadata, struct gl_shader_program *prog)
+{
+   blob_write_uint32(metadata, prog->data->NumUniformBlocks);
+   blob_write_uint32(metadata, prog->data->NumShaderStorageBlocks);
+
+   for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
+  write_buffer_block(metadata, >data->UniformBlocks[i]);
+   }
+
+   for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
+  write_buffer_block(metadata, >data->ShaderStorageBlocks[i]);
+   }
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (!sh)
+ continue;
+
+  struct gl_program *glprog = sh->Program;
+
+  blob_write_uint32(metadata, glprog->info.num_ubos);
+  blob_write_uint32(metadata, glprog->info.num_ssbos);
+
+  for (unsigned j = 0; j < glprog->info.num_ubos; j++) {
+ uint32_t offset =
+glprog->sh.UniformBlocks[j] - prog->data->UniformBlocks;
+ blob_write_uint32(metadata, offset);
+  }
+
+  for (unsigned j = 0; j < glprog->info.num_ssbos; j++) {
+ uint32_t offset = glprog->sh.ShaderStorageBlocks[j] -
+prog->data->ShaderStorageBlocks;
+ blob_write_uint32(metadata, offset);
+  }
+   }
+}
+
+static void
+read_buffer_block(struct blob_reader *metadata, struct gl_uniform_block *b,
+  struct gl_shader_program *prog)
+{
+  b->Name = ralloc_strdup(prog->data, blob_read_string (metadata));
+  b->NumUniforms = blob_read_uint32(metadata);
+  b->Binding = blob_read_uint32(metadata);
+  b->UniformBufferSize = blob_read_uint32(metadata);
+  b->stageref = blob_read_uint32(metadata);
+
+  b->Uniforms =
+ rzalloc_array(prog->data, struct gl_uniform_buffer_variable,
+   b->NumUniforms);
+  for (unsigned j = 0; j < b->NumUniforms; j++) {
+ b->Uniforms[j].Name = ralloc_strdup(prog->data,
+ blob_read_string (metadata));
+
+ char *index_name = blob_read_string(metadata);
+ if (strcmp(b->Uniforms[j].Name, index_name) == 0) {
+b->Uniforms[j].IndexName = b->Uniforms[j].Name;
+ } else {
+b->Uniforms[j].IndexName = ralloc_strdup(prog->data, index_name);
+ }
+
+ b->Uniforms[j].Type = decode_type_from_blob(metadata);
+ b->Uniforms[j].Offset = blob_read_uint32(metadata);
+  }
+}
+
+static void
+read_buffer_blocks(struct blob_reader *metadata,
+   struct gl_shader_program *prog)
+{
+   prog->data->NumUniformBlocks = blob_read_uint32(metadata);
+   prog->data->NumShaderStorageBlocks = blob_read_uint32(metadata);
+
+   prog->data->UniformBlocks =
+  rzalloc_array(prog->data, struct gl_uniform_block,
+prog->data->NumUniformBlocks);
+
+   prog->data->ShaderStorageBlocks =
+  rzalloc_array(prog->data, struct gl_uniform_block,
+prog->data->NumShaderStorageBlocks);
+
+   for (unsigned i = 0; i < prog->data->NumUniformBlocks; i++) {
+  read_buffer_block(metadata, >data->UniformBlocks[i], prog);
+   }
+
+   for (unsigned i = 0; i < prog->data->NumShaderStorageBlocks; i++) {
+  read_buffer_block(metadata, >data->ShaderStorageBlocks[i], prog);
+   }
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (!sh)
+ continue;
+
+  struct gl_program *glprog = sh->Program;
+
+  glprog->info.num_ubos = blob_read_uint32(metadata);
+  glprog->info.num_ssbos = blob_read_uint32(metadata);
+
+  glprog->sh.UniformBlocks =
+ rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ubos);
+  glprog->sh.ShaderStorageBlocks =
+ rzalloc_array(glprog, gl_uniform_block *, glprog->info.num_ssbos);
+
+  for 

[Mesa-dev] [PATCH 17/40] glsl: cache some more image metadata

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index e75717c..6225dea 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -1080,6 +1080,11 @@ write_shader_metadata(struct blob *metadata, 
gl_linked_shader *shader)
 sizeof(glprog->sh.SamplerTargets));
blob_write_uint32(metadata, glprog->ShadowSamplers);
 
+   blob_write_bytes(metadata, glprog->sh.ImageAccess,
+sizeof(glprog->sh.ImageAccess));
+   blob_write_bytes(metadata, glprog->sh.ImageUnits,
+sizeof(glprog->sh.ImageUnits));
+
write_shader_parameters(metadata, glprog->Parameters);
 }
 
@@ -1098,6 +1103,11 @@ read_shader_metadata(struct blob_reader *metadata,
sizeof(glprog->sh.SamplerTargets));
glprog->ShadowSamplers = blob_read_uint32(metadata);
 
+   blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageAccess,
+   sizeof(glprog->sh.ImageAccess));
+   blob_copy_bytes(metadata, (uint8_t *) glprog->sh.ImageUnits,
+   sizeof(glprog->sh.ImageUnits));
+
glprog->Parameters = _mesa_new_parameter_list();
read_shader_parameters(metadata, glprog->Parameters);
 }
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 13/40] glsl: add support for caching subroutines

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 107 +
 1 file changed, 107 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 4c43fc3..7d651bc 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -208,6 +208,68 @@ decode_type_from_blob(struct blob_reader *blob)
 }
 
 static void
+write_subroutines(struct blob *metadata, struct gl_shader_program *prog)
+{
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (!sh)
+ continue;
+
+  struct gl_program *glprog = sh->Program;
+
+  blob_write_uint32(metadata, glprog->sh.NumSubroutineUniforms);
+  blob_write_uint32(metadata, glprog->sh.MaxSubroutineFunctionIndex);
+  blob_write_uint32(metadata, glprog->sh.NumSubroutineFunctions);
+  for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) {
+ int num_types = glprog->sh.SubroutineFunctions[j].num_compat_types;
+
+ blob_write_string(metadata, glprog->sh.SubroutineFunctions[j].name);
+ blob_write_uint32(metadata, glprog->sh.SubroutineFunctions[j].index);
+ blob_write_uint32(metadata, num_types);
+
+ for (int k = 0; k < num_types; k++) {
+encode_type_to_blob(metadata,
+glprog->sh.SubroutineFunctions[j].types[k]);
+ }
+  }
+   }
+}
+
+static void
+read_subroutines(struct blob_reader *metadata, struct gl_shader_program *prog)
+{
+   struct gl_subroutine_function *subs;
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (!sh)
+ continue;
+
+  struct gl_program *glprog = sh->Program;
+
+  glprog->sh.NumSubroutineUniforms = blob_read_uint32(metadata);
+  glprog->sh.MaxSubroutineFunctionIndex = blob_read_uint32(metadata);
+  glprog->sh.NumSubroutineFunctions = blob_read_uint32(metadata);
+
+  subs = rzalloc_array(prog, struct gl_subroutine_function,
+   glprog->sh.NumSubroutineFunctions);
+  glprog->sh.SubroutineFunctions = subs;
+
+  for (unsigned j = 0; j < glprog->sh.NumSubroutineFunctions; j++) {
+ subs[j].name = ralloc_strdup(prog, blob_read_string (metadata));
+ subs[j].index = (int) blob_read_uint32(metadata);
+ subs[j].num_compat_types = (int) blob_read_uint32(metadata);
+
+ subs[j].types = rzalloc_array(prog, const struct glsl_type *,
+   subs[j].num_compat_types);
+ for (int k = 0; k < subs[j].num_compat_types; k++) {
+subs[j].types[k] = decode_type_from_blob(metadata);
+ }
+  }
+   }
+}
+
+static void
 write_xfb(struct blob *metadata, struct gl_shader_program *shProg)
 {
struct gl_program *prog = shProg->last_vert_prog;
@@ -476,10 +538,28 @@ read_hash_tables(struct blob_reader *metadata, struct 
gl_shader_program *prog)
 }
 
 static void
+write_shader_subroutine_index(struct blob *metadata,
+  struct gl_linked_shader *sh,
+  struct gl_program_resource *res)
+{
+   assert(sh);
+
+   for (unsigned j = 0; j < sh->Program->sh.NumSubroutineFunctions; j++) {
+  if (strcmp(((gl_subroutine_function *)res->Data)->name,
+ sh->Program->sh.SubroutineFunctions[j].name) == 0) {
+ blob_write_uint32(metadata, j);
+ break;
+  }
+   }
+}
+
+static void
 write_program_resource_data(struct blob *metadata,
 struct gl_shader_program *prog,
 struct gl_program_resource *res)
 {
+   struct gl_linked_shader *sh;
+
switch(res->Type) {
case GL_PROGRAM_INPUT:
case GL_PROGRAM_OUTPUT: {
@@ -530,6 +610,16 @@ write_program_resource_data(struct blob *metadata,
  }
   }
   break;
+   case GL_VERTEX_SUBROUTINE:
+   case GL_TESS_CONTROL_SUBROUTINE:
+   case GL_TESS_EVALUATION_SUBROUTINE:
+   case GL_GEOMETRY_SUBROUTINE:
+   case GL_FRAGMENT_SUBROUTINE:
+   case GL_COMPUTE_SUBROUTINE:
+  sh =
+ prog->_LinkedShaders[_mesa_shader_stage_from_subroutine(res->Type)];
+  write_shader_subroutine_index(metadata, sh, res);
+  break;
default:
   assert(!"Support for writting resource not yet implemented.");
}
@@ -540,6 +630,8 @@ read_program_resource_data(struct blob_reader *metadata,
struct gl_shader_program *prog,
struct gl_program_resource *res)
 {
+   struct gl_linked_shader *sh;
+
switch(res->Type) {
case GL_PROGRAM_INPUT:
case GL_PROGRAM_OUTPUT: {
@@ -577,6 +669,17 @@ read_program_resource_data(struct blob_reader *metadata,
   res->Data = >last_vert_prog->
  sh.LinkedTransformFeedback->Varyings[blob_read_uint32(metadata)];
   break;
+   case 

[Mesa-dev] [PATCH 16/40] glsl: add support for caching atomic buffers

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 89 ++
 1 file changed, 89 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 530bdad..e75717c 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -405,6 +405,79 @@ read_buffer_blocks(struct blob_reader *metadata,
 }
 
 static void
+write_atomic_buffers(struct blob *metadata, struct gl_shader_program *prog)
+{
+   blob_write_uint32(metadata, prog->data->NumAtomicBuffers);
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  if (prog->_LinkedShaders[i]) {
+ struct gl_program *glprog = prog->_LinkedShaders[i]->Program;
+ blob_write_uint32(metadata, glprog->info.num_abos);
+  }
+   }
+
+   for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
+  blob_write_uint32(metadata, prog->data->AtomicBuffers[i].Binding);
+  blob_write_uint32(metadata, prog->data->AtomicBuffers[i].MinimumSize);
+  blob_write_uint32(metadata, prog->data->AtomicBuffers[i].NumUniforms);
+
+  blob_write_bytes(metadata, prog->data->AtomicBuffers[i].StageReferences,
+   sizeof(prog->data->AtomicBuffers[i].StageReferences));
+
+  for (unsigned j = 0; j < prog->data->AtomicBuffers[i].NumUniforms; j++) {
+ blob_write_uint32(metadata, prog->data->AtomicBuffers[i].Uniforms[j]);
+  }
+   }
+}
+
+static void
+read_atomic_buffers(struct blob_reader *metadata,
+ struct gl_shader_program *prog)
+{
+   prog->data->NumAtomicBuffers = blob_read_uint32(metadata);
+   prog->data->AtomicBuffers =
+  rzalloc_array(prog, gl_active_atomic_buffer,
+prog->data->NumAtomicBuffers);
+
+   struct gl_active_atomic_buffer **stage_buff_list[MESA_SHADER_STAGES];
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  if (prog->_LinkedShaders[i]) {
+ struct gl_program *glprog = prog->_LinkedShaders[i]->Program;
+
+ glprog->info.num_abos = blob_read_uint32(metadata);
+ glprog->sh.AtomicBuffers =
+rzalloc_array(glprog, gl_active_atomic_buffer *,
+  glprog->info.num_abos);
+ stage_buff_list[i] = glprog->sh.AtomicBuffers;
+  }
+   }
+
+   for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
+  prog->data->AtomicBuffers[i].Binding = blob_read_uint32(metadata);
+  prog->data->AtomicBuffers[i].MinimumSize = blob_read_uint32(metadata);
+  prog->data->AtomicBuffers[i].NumUniforms = blob_read_uint32(metadata);
+
+  blob_copy_bytes(metadata,
+  (uint8_t *) 
>data->AtomicBuffers[i].StageReferences,
+  sizeof(prog->data->AtomicBuffers[i].StageReferences));
+
+  prog->data->AtomicBuffers[i].Uniforms = rzalloc_array(prog, unsigned,
+ prog->data->AtomicBuffers[i].NumUniforms);
+
+  for (unsigned j = 0; j < prog->data->AtomicBuffers[i].NumUniforms; j++) {
+ prog->data->AtomicBuffers[i].Uniforms[j] = blob_read_uint32(metadata);
+  }
+
+  for (unsigned j = 0; j < MESA_SHADER_STAGES; j++) {
+ if (prog->data->AtomicBuffers[i].StageReferences[j]) {
+*stage_buff_list[j] = >data->AtomicBuffers[i];
+stage_buff_list[j]++;
+ }
+  }
+   }
+}
+
+static void
 write_xfb(struct blob *metadata, struct gl_shader_program *shProg)
 {
struct gl_program *prog = shProg->last_vert_prog;
@@ -790,6 +863,15 @@ write_program_resource_data(struct blob *metadata,
  }
   }
   break;
+   case GL_ATOMIC_COUNTER_BUFFER:
+  for (unsigned i = 0; i < prog->data->NumAtomicBuffers; i++) {
+ if (((gl_active_atomic_buffer *)res->Data)->Binding ==
+ prog->data->AtomicBuffers[i].Binding) {
+blob_write_uint32(metadata, i);
+break;
+ }
+  }
+  break;
case GL_TRANSFORM_FEEDBACK_BUFFER:
   for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) {
  if (((gl_transform_feedback_buffer *)res->Data)->Binding ==
@@ -865,6 +947,9 @@ read_program_resource_data(struct blob_reader *metadata,
case GL_UNIFORM:
   res->Data = >data->UniformStorage[blob_read_uint32(metadata)];
   break;
+   case GL_ATOMIC_COUNTER_BUFFER:
+  res->Data = >data->AtomicBuffers[blob_read_uint32(metadata)];
+  break;
case GL_TRANSFORM_FEEDBACK_BUFFER:
   res->Data = >last_vert_prog->
  sh.LinkedTransformFeedback->Buffers[blob_read_uint32(metadata)];
@@ -1104,6 +1189,8 @@ shader_cache_write_program_metadata(struct gl_context 
*ctx,
 
write_uniform_remap_tables(metadata, prog);
 
+   write_atomic_buffers(metadata, prog);
+
write_buffer_blocks(metadata, prog);
 
write_subroutines(metadata, prog);
@@ -1223,6 +1310,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
 
read_uniform_remap_tables(, prog);
 
+   read_atomic_buffers(, prog);
+

[Mesa-dev] [PATCH 19/40] glsl: cache uniform values

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

These may be lowered constant arrays or uniform values that we set before 
linking
so we need to cache the actual uniform values.
---
 src/compiler/glsl/shader_cache.cpp | 33 +
 1 file changed, 33 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 6225dea..a9d6987 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -568,11 +568,13 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
   blob_write_string(metadata, prog->data->UniformStorage[i].name);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].storage -
   prog->data->UniformDataSlots);
+  blob_write_uint32(metadata, prog->data->UniformStorage[i].builtin);
   blob_write_uint32(metadata, 
prog->data->UniformStorage[i].remap_location);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].block_index);
   blob_write_uint32(metadata, 
prog->data->UniformStorage[i].atomic_buffer_index);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].offset);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].array_stride);
+  blob_write_uint32(metadata, prog->data->UniformStorage[i].hidden);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].matrix_stride);
   blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major);
   blob_write_uint32(metadata,
@@ -584,6 +586,22 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
   blob_write_bytes(metadata, prog->data->UniformStorage[i].opaque,
sizeof(prog->data->UniformStorage[i].opaque));
}
+
+   /* Here we cache all uniform values. We do this to retain values for
+* uniforms with initialisers and also hidden uniforms that may be lowered
+* constant arrays. We could possibly just store the values we need but for
+* now we just store everything.
+*/
+   blob_write_uint32(metadata, prog->data->NumHiddenUniforms);
+   for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+  if (!prog->data->UniformStorage[i].builtin) {
+ unsigned vec_size =
+values_for_type(prog->data->UniformStorage[i].type) *
+MAX2(prog->data->UniformStorage[i].array_elements, 1);
+ blob_write_bytes(metadata, prog->data->UniformStorage[i].storage,
+  sizeof(union gl_constant_value) * vec_size);
+  }
+   }
 }
 
 static void
@@ -611,11 +629,13 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
   uniforms[i].array_elements = blob_read_uint32(metadata);
   uniforms[i].name = ralloc_strdup(prog, blob_read_string (metadata));
   uniforms[i].storage = data + blob_read_uint32(metadata);
+  uniforms[i].builtin = blob_read_uint32(metadata);
   uniforms[i].remap_location = blob_read_uint32(metadata);
   uniforms[i].block_index = blob_read_uint32(metadata);
   uniforms[i].atomic_buffer_index = blob_read_uint32(metadata);
   uniforms[i].offset = blob_read_uint32(metadata);
   uniforms[i].array_stride = blob_read_uint32(metadata);
+  uniforms[i].hidden = blob_read_uint32(metadata);
   uniforms[i].matrix_stride = blob_read_uint32(metadata);
   uniforms[i].row_major = blob_read_uint32(metadata);
   uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata);
@@ -627,6 +647,19 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
  blob_read_bytes(metadata, sizeof(uniforms[i].opaque)),
  sizeof(uniforms[i].opaque));
}
+
+   /* Restore uniform values. */
+   prog->data->NumHiddenUniforms = blob_read_uint32(metadata);
+   for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+  if (!prog->data->UniformStorage[i].builtin) {
+ unsigned vec_size =
+values_for_type(prog->data->UniformStorage[i].type) *
+MAX2(prog->data->UniformStorage[i].array_elements, 1);
+ blob_copy_bytes(metadata,
+ (uint8_t *) prog->data->UniformStorage[i].storage,
+ sizeof(union gl_constant_value) * vec_size);
+  }
+   }
 }
 
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 09/40] glsl: fix uniform remap table cache when explicit locations used

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 32 +---
 1 file changed, 25 insertions(+), 7 deletions(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index ba05655..ff8d150 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -57,7 +57,7 @@
 #include "main/core.h"
 #include "nir.h"
 #include "program.h"
-#include "util/disk_cache.h"
+#include "shader_cache.h"
 #include "util/mesa-sha1.h"
 #include "util/string_to_uint_map.h"
 
@@ -283,8 +283,20 @@ write_uniform_remap_table(struct blob *metadata,
blob_write_uint32(metadata, prog->NumUniformRemapTable);
 
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
-  blob_write_uint32(metadata, prog->UniformRemapTable[i] -
-   prog->data->UniformStorage);
+  blob_write_uint64(metadata,
+ptr_to_uint64_t(prog->UniformRemapTable[i]));
+
+  if (prog->UniformRemapTable[i] != INACTIVE_UNIFORM_EXPLICIT_LOCATION &&
+  prog->UniformRemapTable[i] != NULL) {
+
+ /* Here we store the offset rather than calculating it on restore
+  * because gl_uniform_storage may have a different size on the
+  * platform we are restoring the cache on.
+  */
+ uint32_t offset =
+prog->UniformRemapTable[i] - prog->data->UniformStorage;
+ blob_write_uint32(metadata, offset);
+  }
}
 }
 
@@ -294,12 +306,18 @@ read_uniform_remap_table(struct blob_reader *metadata,
 {
prog->NumUniformRemapTable = blob_read_uint32(metadata);
 
-   prog->UniformRemapTable =rzalloc_array(prog, struct gl_uniform_storage *,
-  prog->NumUniformRemapTable);
+   prog->UniformRemapTable = rzalloc_array(prog, struct gl_uniform_storage *,
+   prog->NumUniformRemapTable);
 
for (unsigned i = 0; i < prog->NumUniformRemapTable; i++) {
-  prog->UniformRemapTable[i] =
- prog->data->UniformStorage + blob_read_uint32(metadata);
+  uint64_t uni_ptr = blob_read_uint64(metadata);
+  if (uni_ptr == (uint64_t) INACTIVE_UNIFORM_EXPLICIT_LOCATION ||
+  uni_ptr == (uint64_t) NULL) {
+ prog->UniformRemapTable[i] = (gl_uniform_storage *) uni_ptr;
+  } else {
+ uint32_t uni_offset = blob_read_uint32(metadata);
+ prog->UniformRemapTable[i] = prog->data->UniformStorage + uni_offset;
+  }
}
 }
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 11/40] glsl: add shader cache support for samplers

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 18 ++
 1 file changed, 18 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 56ea305..05b11ed 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -233,6 +233,8 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
 prog->data->UniformStorage[i].top_level_array_size);
   blob_write_uint32(metadata,
 prog->data->UniformStorage[i].top_level_array_stride);
+  blob_write_bytes(metadata, prog->data->UniformStorage[i].opaque,
+   sizeof(prog->data->UniformStorage[i].opaque));
}
 }
 
@@ -272,6 +274,10 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
   uniforms[i].top_level_array_size = blob_read_uint32(metadata);
   uniforms[i].top_level_array_stride = blob_read_uint32(metadata);
   prog->UniformHash->put(i, uniforms[i].name);
+
+  memcpy(uniforms[i].opaque,
+ blob_read_bytes(metadata, sizeof(uniforms[i].opaque)),
+ sizeof(uniforms[i].opaque));
}
 }
 
@@ -572,6 +578,12 @@ write_shader_metadata(struct blob *metadata, 
gl_linked_shader *shader)
 sizeof(glprog->TexturesUsed));
blob_write_uint64(metadata, glprog->SamplersUsed);
 
+   blob_write_bytes(metadata, glprog->SamplerUnits,
+sizeof(glprog->SamplerUnits));
+   blob_write_bytes(metadata, glprog->sh.SamplerTargets,
+sizeof(glprog->sh.SamplerTargets));
+   blob_write_uint32(metadata, glprog->ShadowSamplers);
+
write_shader_parameters(metadata, glprog->Parameters);
 }
 
@@ -584,6 +596,12 @@ read_shader_metadata(struct blob_reader *metadata,
sizeof(glprog->TexturesUsed));
glprog->SamplersUsed = blob_read_uint64(metadata);
 
+   blob_copy_bytes(metadata, (uint8_t *) glprog->SamplerUnits,
+   sizeof(glprog->SamplerUnits));
+   blob_copy_bytes(metadata, (uint8_t *) glprog->sh.SamplerTargets,
+   sizeof(glprog->sh.SamplerTargets));
+   glprog->ShadowSamplers = blob_read_uint32(metadata);
+
glprog->Parameters = _mesa_new_parameter_list();
read_shader_parameters(metadata, glprog->Parameters);
 }
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 12/40] glsl: add support for caching shaders with xfb qualifiers

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

For now this disables the shader cache when transform feedback is
enabled via the GL API as we don't currently allow for it when
generating the sha for the shader.
---
 src/compiler/glsl/linker.cpp   |  14 -
 src/compiler/glsl/shader_cache.cpp | 108 +
 2 files changed, 121 insertions(+), 1 deletion(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index b5745ba..62cc2fd 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -4653,7 +4653,19 @@ link_shaders(struct gl_context *ctx, struct 
gl_shader_program *prog)
   return;
}
 
-   if (shader_cache_read_program_metadata(ctx, prog))
+   /* If transform feedback used on the program then compile all shaders. */
+   bool skip_cache = false;
+   if (prog->TransformFeedback.NumVarying > 0) {
+  for (unsigned i = 0; i < prog->NumShaders; i++) {
+ if (prog->Shaders[i]->ir) {
+continue;
+ }
+ _mesa_glsl_compile_shader(ctx, prog->Shaders[i], false, false, true);
+  }
+  skip_cache = true;
+   }
+
+   if (!skip_cache && shader_cache_read_program_metadata(ctx, prog))
   return;
 
void *mem_ctx = ralloc_context(NULL); // temporary linker context
diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 05b11ed..4c43fc3 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -208,6 +208,84 @@ decode_type_from_blob(struct blob_reader *blob)
 }
 
 static void
+write_xfb(struct blob *metadata, struct gl_shader_program *shProg)
+{
+   struct gl_program *prog = shProg->last_vert_prog;
+
+   if (!prog) {
+  blob_write_uint32(metadata, ~0u);
+  return;
+   }
+
+   struct gl_transform_feedback_info *ltf = prog->sh.LinkedTransformFeedback;
+
+   blob_write_uint32(metadata, prog->info.stage);
+
+   blob_write_uint32(metadata, ltf->NumOutputs);
+   blob_write_uint32(metadata, ltf->ActiveBuffers);
+   blob_write_uint32(metadata, ltf->NumVarying);
+
+   blob_write_bytes(metadata, ltf->Outputs,
+sizeof(struct gl_transform_feedback_output) *
+   ltf->NumOutputs);
+
+   for (int i = 0; i < ltf->NumVarying; i++) {
+  blob_write_string(metadata, ltf->Varyings[i].Name);
+  blob_write_uint32(metadata, ltf->Varyings[i].Type);
+  blob_write_uint32(metadata, ltf->Varyings[i].BufferIndex);
+  blob_write_uint32(metadata, ltf->Varyings[i].Size);
+  blob_write_uint32(metadata, ltf->Varyings[i].Offset);
+   }
+
+   blob_write_bytes(metadata, ltf->Buffers,
+sizeof(struct gl_transform_feedback_buffer) *
+   MAX_FEEDBACK_BUFFERS);
+}
+
+static void
+read_xfb(struct blob_reader *metadata, struct gl_shader_program *shProg)
+{
+   unsigned xfb_stage = blob_read_uint32(metadata);
+
+   if (xfb_stage == ~0u)
+  return;
+
+   struct gl_program *prog = shProg->_LinkedShaders[xfb_stage]->Program;
+   struct gl_transform_feedback_info *ltf =
+  rzalloc(prog, struct gl_transform_feedback_info);
+
+   prog->sh.LinkedTransformFeedback = ltf;
+   shProg->last_vert_prog = prog;
+
+   ltf->NumOutputs = blob_read_uint32(metadata);
+   ltf->ActiveBuffers = blob_read_uint32(metadata);
+   ltf->NumVarying = blob_read_uint32(metadata);
+
+   ltf->Outputs = rzalloc_array(prog, struct gl_transform_feedback_output,
+ltf->NumOutputs);
+
+   blob_copy_bytes(metadata, (uint8_t *) ltf->Outputs,
+   sizeof(struct gl_transform_feedback_output) *
+  ltf->NumOutputs);
+
+   ltf->Varyings = rzalloc_array(prog,
+ struct gl_transform_feedback_varying_info,
+ ltf->NumVarying);
+
+   for (int i = 0; i < ltf->NumVarying; i++) {
+  ltf->Varyings[i].Name = ralloc_strdup(prog, blob_read_string(metadata));
+  ltf->Varyings[i].Type = blob_read_uint32(metadata);
+  ltf->Varyings[i].BufferIndex = blob_read_uint32(metadata);
+  ltf->Varyings[i].Size = blob_read_uint32(metadata);
+  ltf->Varyings[i].Offset = blob_read_uint32(metadata);
+   }
+
+   blob_copy_bytes(metadata, (uint8_t *) ltf->Buffers,
+   sizeof(struct gl_transform_feedback_buffer) *
+  MAX_FEEDBACK_BUFFERS);
+}
+
+static void
 write_uniforms(struct blob *metadata, struct gl_shader_program *prog)
 {
blob_write_uint32(metadata, prog->SamplersValidated);
@@ -434,6 +512,24 @@ write_program_resource_data(struct blob *metadata,
  }
   }
   break;
+   case GL_TRANSFORM_FEEDBACK_BUFFER:
+  for (unsigned i = 0; i < MAX_FEEDBACK_BUFFERS; i++) {
+ if (((gl_transform_feedback_buffer *)res->Data)->Binding ==
+ 
prog->last_vert_prog->sh.LinkedTransformFeedback->Buffers[i].Binding) {
+blob_write_uint32(metadata, i);
+break;
+ }
+  }
+  

[Mesa-dev] [PATCH 14/40] glsl: store subroutine remap table in shader cache

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

---
 src/compiler/glsl/shader_cache.cpp | 57 ++
 1 file changed, 51 insertions(+), 6 deletions(-)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 7d651bc..deabc2a 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -423,8 +423,8 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
 
 
 static void
-write_uniform_remap_table(struct blob *metadata,
-  struct gl_shader_program *prog)
+write_uniform_remap_tables(struct blob *metadata,
+   struct gl_shader_program *prog)
 {
blob_write_uint32(metadata, prog->NumUniformRemapTable);
 
@@ -444,11 +444,31 @@ write_uniform_remap_table(struct blob *metadata,
  blob_write_uint32(metadata, offset);
   }
}
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (sh) {
+ struct gl_program *glprog = sh->Program;
+ blob_write_uint32(metadata, 
glprog->sh.NumSubroutineUniformRemapTable);
+
+ for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; 
j++) {
+struct gl_uniform_storage *sr =
+   glprog->sh.SubroutineUniformRemapTable[j];
+
+blob_write_uint64(metadata, ptr_to_uint64_t(sr));
+
+if (sr != INACTIVE_UNIFORM_EXPLICIT_LOCATION && sr != NULL) {
+   uint32_t offset = sr - prog->data->UniformStorage;
+   blob_write_uint32(metadata, offset);
+}
+ }
+  }
+   }
 }
 
 static void
-read_uniform_remap_table(struct blob_reader *metadata,
- struct gl_shader_program *prog)
+read_uniform_remap_tables(struct blob_reader *metadata,
+  struct gl_shader_program *prog)
 {
prog->NumUniformRemapTable = blob_read_uint32(metadata);
 
@@ -465,6 +485,31 @@ read_uniform_remap_table(struct blob_reader *metadata,
  prog->UniformRemapTable[i] = prog->data->UniformStorage + uni_offset;
   }
}
+
+   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
+  struct gl_linked_shader *sh = prog->_LinkedShaders[i];
+  if (sh) {
+ struct gl_program *glprog = sh->Program;
+ glprog->sh.NumSubroutineUniformRemapTable = 
blob_read_uint32(metadata);
+
+ glprog->sh.SubroutineUniformRemapTable =
+rzalloc_array(glprog, struct gl_uniform_storage *,
+  glprog->sh.NumSubroutineUniformRemapTable);
+
+ for (unsigned j = 0; j < glprog->sh.NumSubroutineUniformRemapTable; 
j++) {
+uint64_t uni_ptr = blob_read_uint64(metadata);
+if (uni_ptr == (uint64_t) INACTIVE_UNIFORM_EXPLICIT_LOCATION ||
+uni_ptr == (uint64_t) NULL) {
+   glprog->sh.SubroutineUniformRemapTable[j] =
+  (gl_uniform_storage *) uni_ptr;
+} else {
+   uint32_t uni_offset = blob_read_uint32(metadata);
+   glprog->sh.SubroutineUniformRemapTable[j] =
+  prog->data->UniformStorage + uni_offset;
+}
+ }
+  }
+   }
 }
 
 struct whte_closure
@@ -898,7 +943,7 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
 
write_xfb(metadata, prog);
 
-   write_uniform_remap_table(metadata, prog);
+   write_uniform_remap_tables(metadata, prog);
 
write_subroutines(metadata, prog);
 
@@ -1015,7 +1060,7 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
 
read_xfb(, prog);
 
-   read_uniform_remap_table(, prog);
+   read_uniform_remap_tables(, prog);
 
read_subroutines(, prog);
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 10/40] glsl: add basic support for resource list to shader cache

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This initially adds support for simple uniforms and varyings.
---
 src/compiler/glsl/shader_cache.cpp | 121 +
 1 file changed, 121 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index ff8d150..56ea305 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -392,6 +392,123 @@ read_hash_tables(struct blob_reader *metadata, struct 
gl_shader_program *prog)
 }
 
 static void
+write_program_resource_data(struct blob *metadata,
+struct gl_shader_program *prog,
+struct gl_program_resource *res)
+{
+   switch(res->Type) {
+   case GL_PROGRAM_INPUT:
+   case GL_PROGRAM_OUTPUT: {
+  const gl_shader_variable *var = (gl_shader_variable *)res->Data;
+  blob_write_bytes(metadata, var, sizeof(gl_shader_variable));
+  encode_type_to_blob(metadata, var->type);
+
+  if (var->interface_type)
+ encode_type_to_blob(metadata, var->interface_type);
+
+  if (var->outermost_struct_type)
+ encode_type_to_blob(metadata, var->outermost_struct_type);
+
+  blob_write_string(metadata, var->name);
+  break;
+   }
+   case GL_BUFFER_VARIABLE:
+   case GL_VERTEX_SUBROUTINE_UNIFORM:
+   case GL_GEOMETRY_SUBROUTINE_UNIFORM:
+   case GL_FRAGMENT_SUBROUTINE_UNIFORM:
+   case GL_COMPUTE_SUBROUTINE_UNIFORM:
+   case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
+   case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
+   case GL_UNIFORM:
+  for (unsigned i = 0; i < prog->data->NumUniformStorage; i++) {
+ if (strcmp(((gl_uniform_storage *)res->Data)->name,
+prog->data->UniformStorage[i].name) == 0) {
+blob_write_uint32(metadata, i);
+break;
+ }
+  }
+  break;
+   default:
+  assert(!"Support for writting resource not yet implemented.");
+   }
+}
+
+static void
+read_program_resource_data(struct blob_reader *metadata,
+   struct gl_shader_program *prog,
+   struct gl_program_resource *res)
+{
+   switch(res->Type) {
+   case GL_PROGRAM_INPUT:
+   case GL_PROGRAM_OUTPUT: {
+  gl_shader_variable *var = ralloc(prog, struct gl_shader_variable);
+
+  blob_copy_bytes(metadata, (uint8_t *) var, sizeof(gl_shader_variable));
+  var->type = decode_type_from_blob(metadata);
+
+  if (var->interface_type)
+ var->interface_type = decode_type_from_blob(metadata);
+
+  if (var->outermost_struct_type)
+ var->outermost_struct_type = decode_type_from_blob(metadata);
+
+  var->name = ralloc_strdup(prog, blob_read_string(metadata));
+
+  res->Data = var;
+  break;
+   }
+   case GL_BUFFER_VARIABLE:
+   case GL_VERTEX_SUBROUTINE_UNIFORM:
+   case GL_GEOMETRY_SUBROUTINE_UNIFORM:
+   case GL_FRAGMENT_SUBROUTINE_UNIFORM:
+   case GL_COMPUTE_SUBROUTINE_UNIFORM:
+   case GL_TESS_CONTROL_SUBROUTINE_UNIFORM:
+   case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM:
+   case GL_UNIFORM:
+  res->Data = >data->UniformStorage[blob_read_uint32(metadata)];
+  break;
+   default:
+  assert(!"Support for reading resource not yet implemented.");
+   }
+}
+
+static void
+write_program_resource_list(struct blob *metadata,
+struct gl_shader_program *prog)
+{
+   blob_write_uint32(metadata, prog->data->NumProgramResourceList);
+
+   for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
+  blob_write_uint32(metadata, prog->data->ProgramResourceList[i].Type);
+  write_program_resource_data(metadata, prog,
+  >data->ProgramResourceList[i]);
+  blob_write_bytes(metadata,
+   >data->ProgramResourceList[i].StageReferences,
+   
sizeof(prog->data->ProgramResourceList[i].StageReferences));
+   }
+}
+
+static void
+read_program_resource_list(struct blob_reader *metadata,
+   struct gl_shader_program *prog)
+{
+   prog->data->NumProgramResourceList = blob_read_uint32(metadata);
+
+   prog->data->ProgramResourceList =
+  ralloc_array(prog, gl_program_resource,
+   prog->data->NumProgramResourceList);
+
+   for (unsigned i = 0; i < prog->data->NumProgramResourceList; i++) {
+  prog->data->ProgramResourceList[i].Type = blob_read_uint32(metadata);
+  read_program_resource_data(metadata, prog,
+ >data->ProgramResourceList[i]);
+  blob_copy_bytes(metadata,
+  (uint8_t *) 
>data->ProgramResourceList[i].StageReferences,
+  
sizeof(prog->data->ProgramResourceList[i].StageReferences));
+   }
+}
+
+static void
 write_shader_parameters(struct blob *metadata,
 struct gl_program_parameter_list *params)
 {
@@ -556,6 +673,8 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
 

[Mesa-dev] [PATCH 02/40] docs: add shader cache environment variables

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

Reviewed-by: Eric Anholt 
---
 docs/envvars.html | 11 +++
 1 file changed, 11 insertions(+)

diff --git a/docs/envvars.html b/docs/envvars.html
index 276cea3..2269f18 100644
--- a/docs/envvars.html
+++ b/docs/envvars.html
@@ -114,6 +114,17 @@ glGetString(GL_VERSION) for OpenGL ES.
 glGetString(GL_SHADING_LANGUAGE_VERSION). Valid values are integers, such as
 "130".  Mesa will not really implement all the features of the given language 
version
 if it's higher than what's normally reported. (for developers only)
+MESA_GLSL_CACHE_DISABLE - if set, disables the GLSL shader cache
+MESA_GLSL_CACHE_MAX_SIZE - if set, determines the maximum size of
+the on-disk cache of compiled GLSL programs. Should be set to a number
+optionally followed by 'K', 'M', or 'G' to specify a size in
+kilobytes, megabytes, or gigabytes. By default, gigabytes will be
+assumed. And if unset, a maxium size of 1GB will be used.
+MESA_GLSL_CACHE_DIR - if set, determines the directory to be used
+for the on-disk cache of compiled GLSL programs. If this variable is
+not set, then the cache will be stored in $XDG_CACHE_HOME/mesa (if
+that variable is set), or else within .cache/mesa within the user's
+home directory.
 MESA_GLSL - shading language compiler 
options
 MESA_NO_MINMAX_CACHE - when set, the minmax index cache is globally 
disabled.
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 05/40] glsl: add initial implementation of shader cache

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This uses disk_cache.c to write out a serialization of various
state that's required in order to successfully load and use a
binary written out by a drivers backend, this state is referred to as
"metadata" throughout the implementation.

This initial version is intended to work with all stages beside
compute.

This patch is based on the initial work done by Carl.

V2: extend the file's doxygen comment to cover some of the
design decisions.

V3:
- skip cache for fixed function shaders
- add int64 support
- fix glsl IR program parameter caching/restore and cache the
  parameter values which are used by gallium backends.
- use new link status enum
---
 src/compiler/Makefile.glsl.am  |   3 +-
 src/compiler/Makefile.sources  |   4 +
 src/compiler/glsl/shader_cache.cpp | 601 +
 src/compiler/glsl/shader_cache.h   |  38 +++
 4 files changed, 645 insertions(+), 1 deletion(-)
 create mode 100644 src/compiler/glsl/shader_cache.cpp
 create mode 100644 src/compiler/glsl/shader_cache.h

diff --git a/src/compiler/Makefile.glsl.am b/src/compiler/Makefile.glsl.am
index f673196..41edb3c 100644
--- a/src/compiler/Makefile.glsl.am
+++ b/src/compiler/Makefile.glsl.am
@@ -131,7 +131,8 @@ glsl_libglsl_la_LIBADD = \
 
 glsl_libglsl_la_SOURCES =  \
$(LIBGLSL_GENERATED_FILES)  \
-   $(LIBGLSL_FILES)
+   $(LIBGLSL_FILES)\
+   $(LIBGLSL_SHADER_CACHE_FILES)
 
 glsl_libstandalone_la_SOURCES = \
$(GLSL_COMPILER_CXX_FILES)
diff --git a/src/compiler/Makefile.sources b/src/compiler/Makefile.sources
index a8bb4d3..1e8edc0 100644
--- a/src/compiler/Makefile.sources
+++ b/src/compiler/Makefile.sources
@@ -142,6 +142,10 @@ LIBGLSL_FILES = \
glsl/s_expression.cpp \
glsl/s_expression.h
 
+LIBGLSL_SHADER_CACHE_FILES = \
+   glsl/shader_cache.cpp \
+   glsl/shader_cache.h
+
 # glsl_compiler
 
 GLSL_COMPILER_CXX_FILES = \
diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
new file mode 100644
index 000..91f8d99
--- /dev/null
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -0,0 +1,601 @@
+/*
+ * Copyright © 2014 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file shader_cache.c
+ *
+ * GLSL shader cache implementation
+ *
+ * This uses disk_cache.c to write out a serialization of various
+ * state that's required in order to successfully load and use a
+ * binary written out by a drivers backend, this state is referred to as
+ * "metadata" throughout the implementation.
+ *
+ * The hash key for glsl metadata is a hash of the hashes of each GLSL
+ * source string as well as some API settings that change the final shader
+ * such as SSO, attribute binding, frag data bindins, etc.
+ *
+ * In order to avoid caching any actual IR we use the put_key/get_key support
+ * in the disk_cache to put the SHA-1 hash for each successfully compiled
+ * shader into the cache, and optimisticly return early from glCompileShader
+ * (if the identical shader had been successfully compiled in the past),
+ * in the hope that the final linked shader will be found in the cache.
+ * If anything goes wrong (shader variant not found, backend cache item is
+ * corrupt, etc) we will use a fallback path to compile and link the IR.
+ */
+
+#include "blob.h"
+#include "compiler/shader_info.h"
+#include "glsl_symbol_table.h"
+#include "glsl_parser_extras.h"
+#include "ir.h"
+#include "ir_optimization.h"
+#include "ir_rvalue_visitor.h"
+#include "ir_uniform.h"
+#include "linker.h"
+#include "link_varyings.h"
+#include "main/core.h"
+#include "nir.h"
+#include "program.h"
+#include "util/disk_cache.h"
+#include "util/mesa-sha1.h"
+#include "util/string_to_uint_map.h"
+
+extern "C" {
+#include "main/enums.h"
+#include 

[Mesa-dev] [PATCH 06/40] glsl: add helper to convert pointers to uint64_t

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This will be used to store all pointers in the cache as 64bit ints
allowing us to avoid issues when a 32bit program reads a cached
shader that was created by a 64bit application.
---
 src/compiler/glsl/shader_cache.h | 10 ++
 1 file changed, 10 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.h b/src/compiler/glsl/shader_cache.h
index 8bd0a3c..1596c33 100644
--- a/src/compiler/glsl/shader_cache.h
+++ b/src/compiler/glsl/shader_cache.h
@@ -27,6 +27,16 @@
 
 #include "util/disk_cache.h"
 
+static uint64_t inline
+ptr_to_uint64_t(void *ptr)
+{
+   uint64_t ptr_int = (uint64_t) ptr;
+#if __i386__
+   ptr_int &= 0x;
+#endif
+   return ptr_int;
+}
+
 void
 shader_cache_write_program_metadata(struct gl_context *ctx,
 struct gl_shader_program *prog);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 01/40] st/mesa/i965: create link status enum

2017-02-06 Thread Timothy Arceri
For the on-disk shader cache we want to be able to differentiate
between a program that was linked and one that was loaded from cache.
---
 src/compiler/glsl/linker.cpp   |  6 +++---
 src/compiler/glsl/standalone.cpp   |  2 +-
 src/mesa/drivers/dri/i965/brw_cs.c |  4 ++--
 src/mesa/drivers/dri/i965/brw_tcs.c|  2 +-
 src/mesa/drivers/dri/i965/brw_tes.c|  2 +-
 src/mesa/drivers/dri/i965/brw_vs.c |  2 +-
 src/mesa/drivers/dri/i965/brw_wm.c |  2 +-
 src/mesa/main/mtypes.h | 13 -
 src/mesa/main/program_resource.c   |  2 +-
 src/mesa/main/shaderapi.c  |  8 
 src/mesa/main/uniforms.c   |  2 +-
 src/mesa/program/ir_to_mesa.cpp|  4 ++--
 src/mesa/state_tracker/st_glsl_to_tgsi.cpp |  2 +-
 13 files changed, 31 insertions(+), 20 deletions(-)

diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index b768a6e..720c22b 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -421,7 +421,7 @@ linker_error(gl_shader_program *prog, const char *fmt, ...)
ralloc_vasprintf_append(>data->InfoLog, fmt, ap);
va_end(ap);
 
-   prog->data->LinkStatus = false;
+   prog->data->LinkStatus = linking_failure;
 }
 
 
@@ -2190,7 +2190,7 @@ link_intrastage_shaders(void *mem_ctx,
  
_mesa_shader_stage_to_program(shader_list[0]->Stage),
  prog->Name, false);
if (!gl_prog) {
-  prog->data->LinkStatus = false;
+  prog->data->LinkStatus = linking_failure;
   _mesa_delete_linked_shader(ctx, linked);
   return NULL;
}
@@ -4629,7 +4629,7 @@ linker_optimisation_loop(struct gl_context *ctx, 
exec_list *ir,
 void
 link_shaders(struct gl_context *ctx, struct gl_shader_program *prog)
 {
-   prog->data->LinkStatus = true; /* All error paths will set this to false */
+   prog->data->LinkStatus = linking_success; /* All error paths will set this 
to false */
prog->data->Validated = false;
 
/* Section 7.3 (Program Objects) of the OpenGL 4.5 Core Profile spec says:
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp
index 44f2c0f..7a2d3d2 100644
--- a/src/compiler/glsl/standalone.cpp
+++ b/src/compiler/glsl/standalone.cpp
@@ -509,7 +509,7 @@ standalone_compile_shader(const struct standalone_options 
*_options,
   } else {
  const gl_shader_stage stage = whole_program->Shaders[0]->Stage;
 
- whole_program->data->LinkStatus = GL_TRUE;
+ whole_program->data->LinkStatus = linking_success;
  whole_program->_LinkedShaders[stage] =
 link_intrastage_shaders(whole_program /* mem_ctx */,
 ctx,
diff --git a/src/mesa/drivers/dri/i965/brw_cs.c 
b/src/mesa/drivers/dri/i965/brw_cs.c
index 0f8d4eb..16b7945 100644
--- a/src/mesa/drivers/dri/i965/brw_cs.c
+++ b/src/mesa/drivers/dri/i965/brw_cs.c
@@ -66,7 +66,7 @@ brw_codegen_cs_prog(struct brw_context *brw,
memset(_data, 0, sizeof(prog_data));
 
if (cp->program.info.cs.shared_size > 64 * 1024) {
-  cp->program.sh.data->LinkStatus = false;
+  cp->program.sh.data->LinkStatus = linking_failure;
   const char *error_str =
  "Compute shader used more than 64KB of shared variables";
   ralloc_strcat(>program.sh.data->InfoLog, error_str);
@@ -119,7 +119,7 @@ brw_codegen_cs_prog(struct brw_context *brw,
 _data, cp->program.nir, st_index,
 _size, _str);
if (program == NULL) {
-  cp->program.sh.data->LinkStatus = false;
+  cp->program.sh.data->LinkStatus = linking_failure;
   ralloc_strcat(>program.sh.data->InfoLog, error_str);
   _mesa_problem(NULL, "Failed to compile compute shader: %s\n", error_str);
 
diff --git a/src/mesa/drivers/dri/i965/brw_tcs.c 
b/src/mesa/drivers/dri/i965/brw_tcs.c
index 858ecf9..64bfc40 100644
--- a/src/mesa/drivers/dri/i965/brw_tcs.c
+++ b/src/mesa/drivers/dri/i965/brw_tcs.c
@@ -249,7 +249,7 @@ brw_codegen_tcs_prog(struct brw_context *brw, struct 
brw_program *tcp,
   _size, _str);
if (program == NULL) {
   if (tep) {
- tep->program.sh.data->LinkStatus = false;
+ tep->program.sh.data->LinkStatus = linking_failure;
  ralloc_strcat(>program.sh.data->InfoLog, error_str);
   }
 
diff --git a/src/mesa/drivers/dri/i965/brw_tes.c 
b/src/mesa/drivers/dri/i965/brw_tes.c
index cb12b9c..3da5357 100644
--- a/src/mesa/drivers/dri/i965/brw_tes.c
+++ b/src/mesa/drivers/dri/i965/brw_tes.c
@@ -124,7 +124,7 @@ brw_codegen_tes_prog(struct brw_context *brw,
   brw_compile_tes(compiler, brw, mem_ctx, key, _vue_map, _data,
   nir, >program, st_index, _size, _str);
if (program == NULL) {
-  tep->program.sh.data->LinkStatus = false;
+  tep->program.sh.data->LinkStatus = linking_failure;
   ralloc_strcat(>program.sh.data->InfoLog, 

[Mesa-dev] GLSL IR & TGSI on-disk shader cache

2017-02-06 Thread Timothy Arceri
This series adds support for a GLSL IR level and TGSI (OpenGL/st)
level caches.

There are a few small bug fixes and a little bit of restructuring
to the GLSL IR patches to make things work for Gallium drivers vs
just i965 previously, but nothing too major.

The biggest change is patch 35 which changes the mesa cache
directory to be more structured allowing us to not fallback to
recompiles at draw time if we realise a cache item was created
with an old version of Mesa. Patch 36 also cleans up old cache
files so we shouldn't get into a possition were we are constantly
evicting cache items because its never cleaned out.

Even with the new directory structure I've still left in the
code that adds the Mesa version string to cache items because
users can do things like override the OpenGL version which will
change the output (in future we might want to just add this as
part of the sha1 input).

This series does not include the patch that adds cache support
to the radeonsi backend, the main reason for this is that llvm
currently doesn't allow the version to be queried at runtime
(as far as I'm aware) although it seems like other are interested
in this feature [1] so I will follow up on that.

The reason we don't just use the build time like radv is that we
will want something consistent accross distros to enable 
distribution of precompiled shaders.

Without the radeonsi patch min fps still goes up around 4 fps in
the Shadow of Mordor benchmark (although the stalls are still
very noticeable).

I should also point out that this enables a tgsi level cache for
r600, but I haven't tested this myself and lack the hardware.

Also any other Gallium driver that uses TGSI should also be able
to enable support.

Please review.

[1] https://groups.google.com/forum/#!topic/llvm-dev/xUg8fAKIKsA 

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 08/40] glsl: Serialize three additional hash tables with program metadata

2017-02-06 Thread Timothy Arceri
From: Carl Worth 

The three additional tables are AttributeBindings, FragDataBindings,
and FragDataIndexBindings.

The first table (AttributeBindings) was identified as missing by
trying to test the shader cache with a program that called
glGetAttribLocation.

Many thanks to Tapani Pälli , as it was review
of related work that he had done previously that pointed me to the
necessity to also save and restore FragDataBindings and
FragDataIndexBindings.
---
 src/compiler/glsl/shader_cache.cpp | 74 ++
 1 file changed, 74 insertions(+)

diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 91f8d99..ba05655 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -303,6 +303,76 @@ read_uniform_remap_table(struct blob_reader *metadata,
}
 }
 
+struct whte_closure
+{
+   struct blob *blob;
+   size_t num_entries;
+};
+
+static void
+write_hash_table_entry(const char *key, unsigned value, void *closure)
+{
+   struct whte_closure *whte = (struct whte_closure *) closure;
+
+   blob_write_string(whte->blob, key);
+   blob_write_uint32(whte->blob, value);
+
+   whte->num_entries++;
+}
+
+static void
+write_hash_table(struct blob *metadata, struct string_to_uint_map *hash)
+{
+   size_t offset;
+   struct whte_closure whte;
+
+   whte.blob = metadata;
+   whte.num_entries = 0;
+
+   offset = metadata->size;
+
+   /* Write a placeholder for the hashtable size. */
+   blob_write_uint32 (metadata, 0);
+
+   hash->iterate(write_hash_table_entry, );
+
+   /* Overwrite with the computed number of entires written. */
+   blob_overwrite_uint32 (metadata, offset, whte.num_entries);
+}
+
+static void
+read_hash_table(struct blob_reader *metadata, struct string_to_uint_map *hash)
+{
+   size_t i, num_entries;
+   const char *key;
+   uint32_t value;
+
+   num_entries = blob_read_uint32 (metadata);
+
+   for (i = 0; i < num_entries; i++) {
+  key = blob_read_string(metadata);
+  value = blob_read_uint32(metadata);
+
+  hash->put(value, key);
+   }
+}
+
+static void
+write_hash_tables(struct blob *metadata, struct gl_shader_program *prog)
+{
+   write_hash_table(metadata, prog->AttributeBindings);
+   write_hash_table(metadata, prog->FragDataBindings);
+   write_hash_table(metadata, prog->FragDataIndexBindings);
+}
+
+static void
+read_hash_tables(struct blob_reader *metadata, struct gl_shader_program *prog)
+{
+   read_hash_table(metadata, prog->AttributeBindings);
+   read_hash_table(metadata, prog->FragDataBindings);
+   read_hash_table(metadata, prog->FragDataIndexBindings);
+}
+
 static void
 write_shader_parameters(struct blob *metadata,
 struct gl_program_parameter_list *params)
@@ -445,6 +515,8 @@ shader_cache_write_program_metadata(struct gl_context *ctx,
 
write_uniforms(metadata, prog);
 
+   write_hash_tables(metadata, prog);
+
blob_write_uint32(metadata, prog->data->Version);
blob_write_uint32(metadata, prog->data->linked_stages);
 
@@ -563,6 +635,8 @@ shader_cache_read_program_metadata(struct gl_context *ctx,
 
read_uniforms(, prog);
 
+   read_hash_tables(, prog);
+
prog->data->Version = blob_read_uint32();
prog->data->linked_stages = blob_read_uint32();
 
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 07/40] glsl: make use of on disk shader cache

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

The hash key for glsl metadata is a hash of the hashes of each GLSL
source string.

This commit uses the put_key/get_key support in the cache put the SHA-1
hash of the source string for each successfully compiled shader into the
cache. This allows for early, optimistic returns from glCompileShader
(if the identical source string had been successfully compiled in the past),
in the hope that the final, linked shader will be found in the cache.

This is based on the intial patch by Carl.
---
 src/compiler/glsl/glsl_parser_extras.cpp | 16 
 src/compiler/glsl/linker.cpp |  5 +
 src/mesa/program/ir_to_mesa.cpp  |  8 
 3 files changed, 29 insertions(+)

diff --git a/src/compiler/glsl/glsl_parser_extras.cpp 
b/src/compiler/glsl/glsl_parser_extras.cpp
index 6fe1dd9..e16d543 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -33,6 +33,8 @@
 #include "main/shaderobj.h"
 #include "util/u_atomic.h" /* for p_atomic_cmpxchg */
 #include "util/ralloc.h"
+#include "util/disk_cache.h"
+#include "util/mesa-sha1.h"
 #include "ast.h"
 #include "glsl_parser_extras.h"
 #include "glsl_parser.h"
@@ -1924,6 +1926,20 @@ _mesa_glsl_compile_shader(struct gl_context *ctx, struct 
gl_shader *shader,
state->error = glcpp_preprocess(state, , >info_log,
  add_builtin_defines, state, ctx);
 
+   if (!force_recompile) {
+  char buf[41];
+  _mesa_sha1_compute(source, strlen(source), shader->sha1);
+  if (ctx->Cache && disk_cache_has_key(ctx->Cache, shader->sha1)) {
+ /* We've seen this shader before and know it compiles */
+ if (ctx->_Shader->Flags & GLSL_CACHE_INFO) {
+fprintf(stderr, "deferring compile of shader: %s\n",
+_mesa_sha1_format(buf, shader->sha1));
+ }
+ shader->CompileStatus = true;
+ return;
+  }
+   }
+
if (!state->error) {
  _mesa_glsl_lexer_ctor(state, source);
  _mesa_glsl_parse(state);
diff --git a/src/compiler/glsl/linker.cpp b/src/compiler/glsl/linker.cpp
index 720c22b..b5745ba 100644
--- a/src/compiler/glsl/linker.cpp
+++ b/src/compiler/glsl/linker.cpp
@@ -73,6 +73,7 @@
 #include "program.h"
 #include "program/prog_instruction.h"
 #include "program/program.h"
+#include "util/mesa-sha1.h"
 #include "util/set.h"
 #include "util/string_to_uint_map.h"
 #include "linker.h"
@@ -81,6 +82,7 @@
 #include "ir_rvalue_visitor.h"
 #include "ir_uniform.h"
 #include "builtin_functions.h"
+#include "shader_cache.h"
 
 #include "main/shaderobj.h"
 #include "main/enums.h"
@@ -4651,6 +4653,9 @@ link_shaders(struct gl_context *ctx, struct 
gl_shader_program *prog)
   return;
}
 
+   if (shader_cache_read_program_metadata(ctx, prog))
+  return;
+
void *mem_ctx = ralloc_context(NULL); // temporary linker context
 
prog->ARB_fragment_coord_conventions_enable = false;
diff --git a/src/mesa/program/ir_to_mesa.cpp b/src/mesa/program/ir_to_mesa.cpp
index ce58fbb..67c9267 100644
--- a/src/mesa/program/ir_to_mesa.cpp
+++ b/src/mesa/program/ir_to_mesa.cpp
@@ -46,6 +46,7 @@
 #include "compiler/glsl_types.h"
 #include "compiler/glsl/linker.h"
 #include "compiler/glsl/program.h"
+#include "compiler/glsl/shader_cache.h"
 #include "program/prog_instruction.h"
 #include "program/prog_optimize.h"
 #include "program/prog_print.h"
@@ -3114,6 +3115,10 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
   }
}
 
+   /* Return early if we are loading the shader from on-disk cache */
+   if (prog->data->LinkStatus == linking_skipped)
+  return;
+
if (ctx->_Shader->Flags & GLSL_DUMP) {
   if (!prog->data->LinkStatus) {
 fprintf(stderr, "GLSL shader program %d failed to link\n", prog->Name);
@@ -3124,6 +3129,9 @@ _mesa_glsl_link_shader(struct gl_context *ctx, struct 
gl_shader_program *prog)
  fprintf(stderr, "%s\n", prog->data->InfoLog);
   }
}
+
+   if (prog->data->LinkStatus)
+  shader_cache_write_program_metadata(ctx, prog);
 }
 
 } /* extern "C" */
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 03/40] util: add a disk_cache_remove() function

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This will be used to remove cache items created with old versions
of Mesa or other invalid cache items from the cache.

V2: rename stub function (cache_* funtions were renamed disk_cache_*)
in master.
---
 src/util/disk_cache.c | 22 ++
 src/util/disk_cache.h | 12 
 2 files changed, 34 insertions(+)

diff --git a/src/util/disk_cache.c b/src/util/disk_cache.c
index 551ceeb..7451b08 100644
--- a/src/util/disk_cache.c
+++ b/src/util/disk_cache.c
@@ -538,6 +538,28 @@ evict_random_item(struct disk_cache *cache)
 }
 
 void
+disk_cache_remove(struct disk_cache *cache, cache_key key)
+{
+   struct stat sb;
+
+   char *filename = get_cache_file(cache, key);
+   if (filename == NULL) {
+  return;
+   }
+
+   if (stat(filename, ) == -1) {
+  ralloc_free(filename);
+  return;
+   }
+
+   unlink(filename);
+   ralloc_free(filename);
+
+   if (sb.st_size)
+  p_atomic_add(cache->size, - sb.st_size);
+}
+
+void
 disk_cache_put(struct disk_cache *cache,
   cache_key key,
   const void *data,
diff --git a/src/util/disk_cache.h b/src/util/disk_cache.h
index 7e9cb80..1f2bf3d 100644
--- a/src/util/disk_cache.h
+++ b/src/util/disk_cache.h
@@ -78,6 +78,12 @@ void
 disk_cache_destroy(struct disk_cache *cache);
 
 /**
+ * Remove the item in the cache under the name \key.
+ */
+void
+disk_cache_remove(struct disk_cache *cache, cache_key key);
+
+/**
  * Store an item in the cache under the name \key.
  *
  * The item can be retrieved later with disk_cache_get(), (unless the item has
@@ -151,6 +157,12 @@ disk_cache_put(struct disk_cache *cache, cache_key key,
return;
 }
 
+static inline void
+disk_cache_remove(struct program_cache *cache, cache_key key)
+{
+   return;
+}
+
 static inline uint8_t *
 disk_cache_get(struct disk_cache *cache, cache_key key, size_t *size)
 {
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 04/40] glsl: add param to force shader recompile

2017-02-06 Thread Timothy Arceri
From: Timothy Arceri 

This will be used to skip checking the cache and force a recompile.
---
 src/compiler/glsl/glsl_parser_extras.cpp | 2 +-
 src/compiler/glsl/program.h  | 2 +-
 src/compiler/glsl/standalone.cpp | 3 ++-
 src/mesa/main/shaderapi.c| 2 +-
 4 files changed, 5 insertions(+), 4 deletions(-)

diff --git a/src/compiler/glsl/glsl_parser_extras.cpp 
b/src/compiler/glsl/glsl_parser_extras.cpp
index 59787bd..6fe1dd9 100644
--- a/src/compiler/glsl/glsl_parser_extras.cpp
+++ b/src/compiler/glsl/glsl_parser_extras.cpp
@@ -1911,7 +1911,7 @@ do_late_parsing_checks(struct _mesa_glsl_parse_state 
*state)
 
 void
 _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
-  bool dump_ast, bool dump_hir)
+  bool dump_ast, bool dump_hir, bool force_recompile)
 {
struct _mesa_glsl_parse_state *state =
   new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
diff --git a/src/compiler/glsl/program.h b/src/compiler/glsl/program.h
index 8f5a31b..58a7069 100644
--- a/src/compiler/glsl/program.h
+++ b/src/compiler/glsl/program.h
@@ -33,7 +33,7 @@ struct gl_shader_program;
 
 extern void
 _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
- bool dump_ast, bool dump_hir);
+ bool dump_ast, bool dump_hir, bool force_recompile);
 
 #ifdef __cplusplus
 } /* extern "C" */
diff --git a/src/compiler/glsl/standalone.cpp b/src/compiler/glsl/standalone.cpp
index 7a2d3d2..521964b 100644
--- a/src/compiler/glsl/standalone.cpp
+++ b/src/compiler/glsl/standalone.cpp
@@ -381,7 +381,8 @@ compile_shader(struct gl_context *ctx, struct gl_shader 
*shader)
struct _mesa_glsl_parse_state *state =
   new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
 
-   _mesa_glsl_compile_shader(ctx, shader, options->dump_ast, 
options->dump_hir);
+   _mesa_glsl_compile_shader(ctx, shader, options->dump_ast,
+ options->dump_hir, true);
 
/* Print out the resulting IR */
if (!state->error && options->dump_lir) {
diff --git a/src/mesa/main/shaderapi.c b/src/mesa/main/shaderapi.c
index da450f2..d7c415d 100644
--- a/src/mesa/main/shaderapi.c
+++ b/src/mesa/main/shaderapi.c
@@ -1036,7 +1036,7 @@ _mesa_compile_shader(struct gl_context *ctx, struct 
gl_shader *sh)
   /* this call will set the shader->CompileStatus field to indicate if
* compilation was successful.
*/
-  _mesa_glsl_compile_shader(ctx, sh, false, false);
+  _mesa_glsl_compile_shader(ctx, sh, false, false, false);
 
   if (ctx->_Shader->Flags & GLSL_LOG) {
  _mesa_write_shader_to_file(sh);
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] gallium/tgsi: fix oob access in parse instruction

2017-02-06 Thread Li Qiang
Hello,

Ping!

2017-01-23 15:44 GMT+08:00 Li Qiang :

> When parsing texture instruction, it doesn't stop if the
> 'cur' is ',', the loop variable 'i' will also be increased
> and be used to index the 'inst.TexOffsets' array. This can lead
> an oob access issue. This patch avoid this.
>
> Signed-off-by: Li Qiang 
> ---
>  src/gallium/auxiliary/tgsi/tgsi_text.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c
> b/src/gallium/auxiliary/tgsi/tgsi_text.c
> index 308e6b5..4ed9050 100644
> --- a/src/gallium/auxiliary/tgsi/tgsi_text.c
> +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c
> @@ -1163,7 +1163,7 @@ parse_instruction(
>
> cur = ctx->cur;
> eat_opt_white(  );
> -   for (i = 0; inst.Instruction.Texture && *cur == ','; i++) {
> +   for (i = 0; inst.Instruction.Texture && *cur == ',' && i <
> TGSI_FULL_MAX_TEX_OFFSETS; i++) {
>   cur++;
>   eat_opt_white(  );
>   ctx->cur = cur;
> --
> 2.7.4
>
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [Freedreno] WebProcess crash on DB410c

2017-02-06 Thread Sivasubramanian Patchaiperumal
Tried writing a simple EGL pbuffer application and tested it on DB410c. As
expected, eglChooseConfig returned no matched config available. Is there
something we can do to get pbuffer support on Mesa?

On 3 February 2017 at 20:33, Rob Clark  wrote:

> Hmm, could be that westeros is doing something wrong that causes the
> pbuffer path to be hit.  I'm not entirely sure why pbuffer is not
> supported in wayland (other than just that these days there are better
> ways to do things than pbuffer), although I thought I remembered
> seeing a fallback to surfaceless in webkit..
>
> BR,
> -R
>
> On Fri, Feb 3, 2017 at 1:05 AM, Sivasubramanian Patchaiperumal
>  wrote:
> > One more point is westeros always return null window for offscreen
> target,
> > that why WPE falls back to pbuffer on HiKey and DB410c cases.
> >
> > On 3 February 2017 at 11:30, Sivasubramanian Patchaiperumal
> >  wrote:
> >>
> >> Thanks Rob for your inputs. Yes, you are looking at the right place. But
> >> the HiKey which takes same pbuffer path and it working with Mali is the
> >> reference now. I'm trying to write a simple egl app that uses pbuffer to
> >> confirm the support with Mesa. Does it sounds correct or you have any
> >> suggestions?
> >>
> >> On 3 February 2017 at 02:06, Rob Clark  wrote:
> >>>
> >>> btw, where exactly is it crashing?  I grabbed the WebKitForWayland
> >>> tree.. if I'm looking at the right thing, the only place where it
> >>> should try to create a pbuffer is in
> >>> Source/WebCore/platform/graphics/egl/GLContextEGL.cpp and that looks
> >>> like it should only be a fallback after createWaylandContext() fails??
> >>>
> >>> I suspect pbuffer is not the root problem, that looks like a fallback
> >>> path that shouldn't be hit..
> >>>
> >>> BR,
> >>> -R
> >>>
> >>> On Thu, Feb 2, 2017 at 9:55 AM, Rob Clark  wrote:
> >>> > hmm, just looking at dri2_wl_display_vtbl:
> >>> >
> >>> >.create_pbuffer_surface = dri2_fallback_create_pbuffer_surface,
> >>> >
> >>> > which just returns null.. so I guess pbuffers are not supported under
> >>> > wayland.
> >>> >
> >>> > Bit of google search reveals:
> >>> >
> >>> >
> >>> > https://lists.freedesktop.org/archives/wayland-devel/2012-
> April/002928.html
> >>> >
> >>> > so I think the answer is don't use pbuffers.
> >>> >
> >>> > BR,
> >>> > -R
> >>> >
> >>> > On Thu, Feb 2, 2017 at 9:50 AM, Rob Clark 
> wrote:
> >>> >> hmm, tons of older stuff uses pbuffers w/ x11.. although a quick
> look
> >>> >> at mesa/demos.git and it doesn't look like any of them that build
> for
> >>> >> wayland do.  I don't think pbuffers are used much anymore.  But I
> >>> >> would expect there should be some piglit tests which do.
> >>> >>
> >>> >> (Plus, firefox and chromium have been ported to wayland.. and quite
> a
> >>> >> lot of other sw.  And a lot of us are using wayland on our
> >>> >> laptops/desktops these days.)
> >>> >>
> >>> >> BR,
> >>> >> -R
> >>> >>
> >>> >> On Thu, Feb 2, 2017 at 9:39 AM, Sivasubramanian Patchaiperumal
> >>> >>  wrote:
> >>> >>> Yes, WebProcess(in WebKit) is crashing on DB410c. Any client that
> >>> >>> uses
> >>> >>> pbuffer surfaces will crash I suspect. Is there is any simple egl
> >>> >>> application that uses pixel buffer to verify and confirm?
> >>> >>>
> >>> >>> On 2 February 2017 at 19:00, Rob Clark 
> wrote:
> >>> 
> >>>  hmm, ok, so it is a *client* process that is crashing?  The
> wayland
> >>>  winsys (used by client processes, as opposed to gbm/drm winsys
> used
> >>>  by
> >>>  compositor) does support pbuffers.
> >>> 
> >>>  BR,
> >>>  -R
> >>> 
> >>>  On Thu, Feb 2, 2017 at 7:43 AM, Sivasubramanian Patchaiperumal
> >>>   wrote:
> >>>  > Westeros code uses EGL window surface only, but the WPE code (at
> >>>  > https://github.com/Metrological/WebKitForWayland/) which uses
> >>>  > pbuffer
> >>>  > works
> >>>  > on HiKey and RPI as mentioned.
> >>>  >
> >>>  > On 2 February 2017 at 17:38, Rob Clark 
> >>>  > wrote:
> >>>  >>
> >>>  >> On Thu, Feb 2, 2017 at 2:13 AM, Sivasubramanian Patchaiperumal
> >>>  >>  wrote:
> >>>  >> > Hi,
> >>>  >> > I'm trying to port WPE on DB410c with Westeros compositor,
> but
> >>>  >> > the
> >>>  >> > webprocess crashes due to null sharingcontext. Webprocess
> fails
> >>>  >> > to
> >>>  >> > create gl
> >>>  >> > context as eglChooseConfig fails when the surface type
> >>>  >> > attribute is
> >>>  >> > pbuffer.
> >>>  >> > Also, Westeros sample app works fine and the issue is only
> when
> >>>  >> > surface
> >>>  >> > type
> >>>  >> > attribute is 

[Mesa-dev] [PATCH] glx/glvnd: Fix GLXdispatchIndex sorting

2017-02-06 Thread Hans de Goede
Commit 8bca8d89ef3b ("glx/glvnd: Fix dispatch function names and indices")
fixed the sorting of the array initializers in g_glxglvnddispatchfuncs.c
because FindGLXFunction's binary search needs these to be sorted
alphabetically.

That commit also mostly fixed the sorting of the DI_foo defines in
g_glxglvnddispatchindices.h, which is what actually matters as the
arrays are initialized using "[DI_foo] = glXfoo," but a small error
crept in which at least causes glXGetVisualFromFBConfigSGIX to not
resolve, breaking games such as "The Binding of Isaac: Rebirth" and
"Crypt of the NecroDancer" from Steam not working and possible causes
other problems too.

This commit fixes the last of the sorting errors, fixing these mentioned
games not working.

Fixes: 8bca8d89ef3b ("glx/glvnd: Fix dispatch function names and indices")
Cc: "13.0" 
Cc: "17.0" 
Cc: Adam Jackson 
Signed-off-by: Hans de Goede 
---
 src/glx/g_glxglvnddispatchindices.h | 8 
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/glx/g_glxglvnddispatchindices.h 
b/src/glx/g_glxglvnddispatchindices.h
index 0891654..05a2c8c 100644
--- a/src/glx/g_glxglvnddispatchindices.h
+++ b/src/glx/g_glxglvnddispatchindices.h
@@ -46,14 +46,14 @@ typedef enum __GLXdispatchIndex {
 DI_GetMscRateOML,
 // GetProcAddress implemented by libglvnd
 // GetProcAddressARB implemented by libglvnd
+DI_GetScreenDriver,
 // GetSelectedEvent implemented by libglvnd
 DI_GetSelectedEventSGIX,
+DI_GetSwapIntervalMESA,
+DI_GetSyncValuesOML,
 DI_GetVideoSyncSGI,
 // GetVisualFromFBConfig implemented by libglvnd
 DI_GetVisualFromFBConfigSGIX,
-DI_GetScreenDriver,
-DI_GetSwapIntervalMESA,
-DI_GetSyncValuesOML,
 // ImportContextEXT implemented by libglvnd
 // IsDirect implemented by libglvnd
 DI_JoinSwapGroupSGIX,
@@ -81,9 +81,9 @@ typedef enum __GLXdispatchIndex {
 DI_SwapIntervalMESA,
 DI_SwapIntervalSGI,
 // UseXFont implemented by libglvnd
-// WaitGL implemented by libglvnd
 DI_WaitForMscOML,
 DI_WaitForSbcOML,
+// WaitGL implemented by libglvnd
 DI_WaitVideoSyncSGI,
 // WaitX implemented by libglvnd
 DI_LAST_INDEX
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Kenneth Graunke
On Monday, February 6, 2017 8:54:40 PM PST Marek Olšák wrote:
> On Mon, Feb 6, 2017 at 8:20 PM, Ernst Sjöstrand  wrote:
> > FYI glmark2 segfaults with mesa_glthread=true. Expected that some programs
> > will segfault?
> 
> Yes, even segfaults are expected with mesa_glthread=true.
> 
> Marek

Would it make sense to be crash-free or even regression-free on at
least Piglit, before merging?  (Or are we there already?)

--Ken


signature.asc
Description: This is a digitally signed message part.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 99701] loader.c:353:8: error: implicit declaration of function 'geteuid' is invalid in C99 [-Werror, -Wimplicit-function-declaration]

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99701

Bug ID: 99701
   Summary: loader.c:353:8: error: implicit declaration of
function 'geteuid' is invalid in C99
[-Werror,-Wimplicit-function-declaration]
   Product: Mesa
   Version: git
  Hardware: x86-64 (AMD64)
OS: Mac OS X (All)
Status: NEW
  Keywords: bisected, regression
  Severity: normal
  Priority: medium
 Component: Mesa core
  Assignee: mesa-dev@lists.freedesktop.org
  Reporter: v...@freedesktop.org
QA Contact: mesa-dev@lists.freedesktop.org
CC: e...@anholt.net, nhaeh...@gmail.com

mesa: 47ca0f537dfbc03f0eb0cb12fdee06dbe664fbc7 (master 17.1.0-devel)

  CC   libloader_la-loader.lo
loader.c:353:8: error: implicit declaration of function 'geteuid' is invalid in
C99 [-Werror,-Wimplicit-function-declaration]
   if (geteuid() == getuid()) {
   ^

commit 3f462050c29dc29139732987c9c9ef9a670133ab
Author: Eric Anholt 
Date:   Fri Feb 3 11:02:59 2017 -0800

loader: Add an environment variable to override driver name choice.

My vc4 simulator has been implemented so far by having an entrypoint
claiming to be i965, which was a bit gross.  The simulator would be a lot
less special if we entered through the vc4 entrypoint like normal, so add
a loader environment variable to allow the i965 fd to probe as vc4.

Reviewed-by: Emil Velikov 
Reviewed-by: Nicolai Hähnle 

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 03/10] swr: [rasterizer jitter] Fix issues with stream-out on llvm>=3.8

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/builder.cpp   | 4 +---
 src/gallium/drivers/swr/rasterizer/jitter/builder.h | 2 --
 src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp | 6 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
index 4fc5af7..3b86895 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
@@ -56,8 +56,6 @@ namespace SwrJit
 mInt16PtrTy = PointerType::get(mInt16Ty, 0);
 mInt32PtrTy = PointerType::get(mInt32Ty, 0);
 mInt64Ty = Type::getInt64Ty(pJitMgr->mContext);
-mV4FP32Ty = StructType::get(pJitMgr->mContext, std::vector(4, 
mFP32Ty), false); // vector4 float type (represented as structure)
-mV4Int32Ty = StructType::get(pJitMgr->mContext, std::vector(4, 
mInt32Ty), false); // vector4 int type
 mSimdInt1Ty = VectorType::get(mInt1Ty, mVWidth);
 mSimdInt16Ty = VectorType::get(mInt16Ty, mVWidth);
 mSimdInt32Ty = VectorType::get(mInt32Ty, mVWidth);
@@ -65,7 +63,7 @@ namespace SwrJit
 mSimdFP16Ty = VectorType::get(mFP16Ty, mVWidth);
 mSimdFP32Ty = VectorType::get(mFP32Ty, mVWidth);
 mSimdVectorTy = ArrayType::get(mSimdFP32Ty, 4);
-mSimdVectorTRTy = StructType::get(pJitMgr->mContext, 
std::vector(5, mSimdFP32Ty), false);
+mSimdVectorTRTy = ArrayType::get(mSimdFP32Ty, 5);
 
 if (sizeof(uint32_t*) == 4)
 {
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.h 
b/src/gallium/drivers/swr/rasterizer/jitter/builder.h
index 515560e..6627b33 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.h
@@ -69,8 +69,6 @@ namespace SwrJit
 Type*mSimdIntPtrTy;
 Type*mSimdVectorTy;
 Type*mSimdVectorTRTy;
-StructType*  mV4FP32Ty;
-StructType*  mV4Int32Ty;
 
 #include "builder_gen.h"
 #include "builder_x86.h"
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
index 793e5ec..3d39338 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
@@ -159,7 +159,11 @@ struct StreamOutJit : public Builder
 
 // cast input to <4xfloat>
 Value* src = BITCAST(vpackedAttrib, simd4Ty);
-CALL(maskStore, {pOut, ToMask(packedMask), src});
+
+// cast mask to <4xint>
+Value* mask = ToMask(packedMask);
+mask = BITCAST(mask, VectorType::get(IRB()->getInt32Ty(), 4));
+CALL(maskStore, {pOut, mask, src});
 }
 
 // increment SO buffer
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 09/10] swr: [rasterizer core] Frontend SIMD16 WIP

2017-02-06 Thread Tim Rowley
Removed temporary scafolding in PA, widended the PA_STATE interface
for SIMD16, and implemented PA_STATE_CUT and PA_TESS for SIMD16.

PA_STATE_CUT and PA_TESS now work in SIMD16.
---
 src/gallium/drivers/swr/rasterizer/core/context.h  |   6 +
 .../drivers/swr/rasterizer/core/frontend.cpp   |  31 +-
 src/gallium/drivers/swr/rasterizer/core/pa.h   | 522 ++---
 src/gallium/drivers/swr/rasterizer/core/pa_avx.cpp |  65 ++-
 4 files changed, 331 insertions(+), 293 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/context.h 
b/src/gallium/drivers/swr/rasterizer/core/context.h
index 6e596b4..e937a63 100644
--- a/src/gallium/drivers/swr/rasterizer/core/context.h
+++ b/src/gallium/drivers/swr/rasterizer/core/context.h
@@ -217,6 +217,12 @@ struct PA_STATE;
 typedef void(*PFN_PROCESS_PRIMS)(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t 
workerId, simdvector prims[], 
 uint32_t primMask, simdscalari primID, simdscalari viewportIdx);
 
+#if ENABLE_AVX512_SIMD16
+// function signature for pipeline stages that execute after primitive assembly
+typedef void(*PFN_PROCESS_PRIMS_SIMD16)(DRAW_CONTEXT *pDC, PA_STATE& pa, 
uint32_t workerId, simd16vector prims[],
+uint32_t primMask, simd16scalari primID, simd16scalari viewportIdx);
+
+#endif
 OSALIGNLINE(struct) API_STATE
 {
 // Vertex Buffers
diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp 
b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
index 4d04d8a..c150c51 100644
--- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
@@ -1295,7 +1295,7 @@ void ProcessDraw(
 
 while (pa.HasWork())
 {
-// PaGetNextVsOutput currently has the side effect of updating 
some PA state machine state.
+// GetNextVsOutput currently has the side effect of updating some 
PA state machine state.
 // So we need to keep this outside of (i < endVertex) check.
 
 simdmask *pvCutIndices_lo = nullptr;
@@ -1303,8 +1303,10 @@ void ProcessDraw(
 
 if (IsIndexedT::value)
 {
-pvCutIndices_lo = ();
-pvCutIndices_hi = ();
+// simd16mask <=> simdmask[2]
+
+pvCutIndices_lo = _cast(())[0];
+pvCutIndices_hi = _cast(())[1];
 }
 
 simdvertex vout_lo;
@@ -1313,7 +1315,7 @@ void ProcessDraw(
 vsContext_lo.pVout = _lo;
 vsContext_hi.pVout = _hi;
 
-simd16vertex  = pa.GetNextVsOutput_simd16();
+simd16vertex  = pa.GetNextVsOutput();
 
 if (i < endVertex)
 {
@@ -1433,12 +1435,13 @@ void ProcessDraw(
 {
 SWR_ASSERT(pDC->pState->pfnProcessPrims);
 
-uint32_t genMask = 
GenMask(pa.NumPrims_simd16());
-uint32_t genMask_lo = genMask & 255;
-uint32_t genMask_hi = (genMask >> 8) & 255;
+uint32_t mask = GenMask(pa.NumPrims());
+uint32_t mask_lo = mask & 255;
+uint32_t mask_hi = (mask >> 8) & 255;
 
-simdscalari getPrimId_lo = 
pa.GetPrimID_simd16_lo(work.startPrimID);
-simdscalari getPrimId_hi = 
pa.GetPrimID_simd16_hi(work.startPrimID);
+simd16scalari primid = 
pa.GetPrimID(work.startPrimID);
+simdscalari primid_lo = primid.lo;
+simdscalari primid_hi = primid.hi;
 
 simdvector prim[MAX_NUM_VERTS_PER_PRIM];
 
@@ -1451,10 +1454,9 @@ void ProcessDraw(
 }
 
 pa.useAlternateOffset = false;
-pDC->pState->pfnProcessPrims(pDC, pa, 
workerId, prim,
-genMask_lo, getPrimId_lo, 
_simd_set1_epi32(0));
+pDC->pState->pfnProcessPrims(pDC, pa, 
workerId, prim, mask_lo, primid_lo, _simd_setzero_si());
 
-if (genMask_hi)
+if (mask_hi)
 {
 for (uint32_t i = 0; i < 3; i += 1)
 {
@@ -1465,8 +1467,7 @@ void ProcessDraw(
 }
 
 pa.useAlternateOffset = true;
-pDC->pState->pfnProcessPrims(pDC, pa, 
workerId, prim,
-genMask_hi, getPrimId_hi, 
_simd_set1_epi32(0));
+pDC->pState->pfnProcessPrims(pDC, pa, 
workerId, 

[Mesa-dev] [PATCH 10/10] swr: [rasterizer jitter] Pass LLVM-IR size into jitter

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp | 4 ++--
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.h   | 2 +-
 src/gallium/drivers/swr/rasterizer/jitter/jit_api.h  | 1 +
 3 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index 5bd21a1..6414796 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -190,9 +190,9 @@ void JitManager::SetupNewModule()
 
 //
 /// @brief Create new LLVM module from IR.
-bool JitManager::SetupModuleFromIR(const uint8_t *pIR)
+bool JitManager::SetupModuleFromIR(const uint8_t *pIR, size_t length)
 {
-std::unique_ptr pMem = 
MemoryBuffer::getMemBuffer(StringRef((const char*)pIR), "");
+std::unique_ptr pMem = 
MemoryBuffer::getMemBuffer(StringRef((const char*)pIR, length), "");
 
 SMDiagnostic Err;
 std::unique_ptr newModule = parseIR(pMem.get()->getMemBufferRef(), 
Err, mContext);
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
index e45ad14..170bdde 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
@@ -178,7 +178,7 @@ struct JitManager
 std::string mCore;
 
 void SetupNewModule();
-bool SetupModuleFromIR(const uint8_t *pIR);
+bool SetupModuleFromIR(const uint8_t *pIR, size_t length);
 
 void DumpAsm(llvm::Function* pFunction, const char* fileName);
 static void DumpToFile(llvm::Function *f, const char *fileName);
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/jit_api.h 
b/src/gallium/drivers/swr/rasterizer/jitter/jit_api.h
index 8a08031..b072eb3 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/jit_api.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/jit_api.h
@@ -59,6 +59,7 @@ struct JIT_COMPILE_INPUT
 SWR_SHADER_TYPE type;
 
 const void* pIR;///< Pointer to LLVM IR text.
+size_t irLength;
 
 bool enableJitSampler;
 };
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 04/10] swr: [rasterizer jitter] Change SimdVector representation to array

2017-02-06 Thread Tim Rowley
Make all SimdVectors in LLVM represented as simdscalar[4] rather
than a struct.

Fixes issues with promotion of values from i32 to i64 to match
register width.
---
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp | 6 ++
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.h   | 2 --
 2 files changed, 2 insertions(+), 6 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index d77dffb..74ffd27 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -133,8 +133,6 @@ JitManager::JitManager(uint32_t simdWidth, const char 
*arch, const char* core)
 mInt8Ty = Type::getInt8Ty(mContext);
 mInt32Ty = Type::getInt32Ty(mContext);   // int type
 mInt64Ty = Type::getInt64Ty(mContext);   // int type
-mV4FP32Ty = StructType::get(mContext, std::vector(4, mFP32Ty), 
false); // vector4 float type (represented as structure)
-mV4Int32Ty = StructType::get(mContext, std::vector(4, mInt32Ty), 
false); // vector4 int type
 
 // fetch function signature
 // typedef void(__cdecl *PFN_FETCH_FUNC)(SWR_FETCH_CONTEXT& fetchInfo, 
simdvertex& out);
@@ -147,8 +145,8 @@ JitManager::JitManager(uint32_t simdWidth, const char 
*arch, const char* core)
 mSimtFP32Ty = VectorType::get(mFP32Ty, mVWidth);
 mSimtInt32Ty = VectorType::get(mInt32Ty, mVWidth);
 
-mSimdVectorTy = StructType::get(mContext, std::vector(4, 
mSimtFP32Ty), false);
-mSimdVectorInt32Ty = StructType::get(mContext, std::vector(4, 
mSimtInt32Ty), false);
+mSimdVectorTy = ArrayType::get(mSimtFP32Ty, 4);
+mSimdVectorInt32Ty = ArrayType::get(mSimtInt32Ty, 4);
 
 #if defined(_WIN32)
 // explicitly instantiate used symbols from potentially staticly linked 
libs
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
index ed7216b..e45ad14 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
@@ -164,8 +164,6 @@ struct JitManager
 llvm::Type*mInt32Ty;
 llvm::Type*mInt64Ty;
 llvm::Type*mFP32Ty;
-llvm::StructType*  mV4FP32Ty;
-llvm::StructType*  mV4Int32Ty;
 
 llvm::Type* mSimtFP32Ty;
 llvm::Type* mSimtInt32Ty;
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 06/10] swr: [rasterizer jitter] Add DEBUGTRAP jit builder function

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp | 7 +++
 src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h   | 3 ++-
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
index 8744eb6..d65267e 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
@@ -350,6 +350,13 @@ namespace SwrJit
 }
 #endif
 
+//
+Value *Builder::DEBUGTRAP()
+{
+Function *func = Intrinsic::getDeclaration(JM()->mpCurrentModule, 
Intrinsic::debugtrap);
+return CALL(func);
+}
+
 Value *Builder::VRCP(Value *va)
 {
 return FDIV(VIMMED1(1.0f), va);  // 1 / a
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h 
b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h
index 67f938e..9d55ce2 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h
@@ -152,7 +152,8 @@ void STACKRESTORE(Value* pSaved);
 
 Value* POPCNT(Value* a);
 
-Value* INT3() { return INTERRUPT(C((uint8_t)3)); }
+Value* DEBUGTRAP();
+Value* INT3() { return DEBUGTRAP(); }
 
 
 Value *VEXTRACTI128(Value* a, Constant* imm8);
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 08/10] swr: [rasterizer jitter] Disable unsafe FP optimizations in the jitter

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index 74ffd27..5bd21a1 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -88,7 +88,7 @@ JitManager::JitManager(uint32_t simdWidth, const char *arch, 
const char* core)
 tOpts.AllowFPOpFusion = FPOpFusion::Fast;
 tOpts.NoInfsFPMath = false;
 tOpts.NoNaNsFPMath = false;
-tOpts.UnsafeFPMath = true;
+tOpts.UnsafeFPMath = false;
 #if defined(_DEBUG)
 #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR < 7
 tOpts.NoFramePointerElim = true;
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 02/10] swr: [rasterizer jitter] Adjust jitter header includes

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp| 8 
 src/gallium/drivers/swr/rasterizer/jitter/JitManager.h  | 6 +++---
 src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp | 2 +-
 src/gallium/drivers/swr/rasterizer/jitter/builder.cpp   | 2 +-
 src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp | 2 +-
 src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp | 2 +-
 6 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
index 5021fe2..d77dffb 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.cpp
@@ -31,10 +31,6 @@
 #pragma warning(disable: 4800 4146 4244 4267 4355 4996)
 #endif
 
-#include "jit_api.h"
-#include "JitManager.h"
-#include "fetch_jit.h"
-
 #pragma push_macro("DEBUG")
 #undef DEBUG
 
@@ -57,6 +53,10 @@
 
 #pragma pop_macro("DEBUG")
 
+#include "JitManager.h"
+#include "jit_api.h"
+#include "fetch_jit.h"
+
 #include "core/state.h"
 
 #include "state_llvm.h"
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h 
b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
index 7c0eaa9..ed7216b 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
+++ b/src/gallium/drivers/swr/rasterizer/jitter/JitManager.h
@@ -29,9 +29,6 @@
 **/
 #pragma once
 
-#include "common/os.h"
-#include "common/isa.hpp"
-
 #if defined(_WIN32)
 #pragma warning(disable : 4146 4244 4267 4800 4996)
 #endif
@@ -84,6 +81,9 @@ using PassManager = llvm::legacy::PassManager;
 #include "llvm/Support/DynamicLibrary.h"
 
 
+#include "common/os.h"
+#include "common/isa.hpp"
+
 #pragma pop_macro("DEBUG")
 
 //
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
index 2fd011f..76a58b6 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
@@ -27,9 +27,9 @@
 * Notes:
 *
 **/
+#include "builder.h"
 #include "jit_api.h"
 #include "blend_jit.h"
-#include "builder.h"
 #include "state_llvm.h"
 
 #include 
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
index 6ee4d85..4fc5af7 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/builder.cpp
@@ -64,7 +64,7 @@ namespace SwrJit
 mSimdInt64Ty = VectorType::get(mInt64Ty, mVWidth);
 mSimdFP16Ty = VectorType::get(mFP16Ty, mVWidth);
 mSimdFP32Ty = VectorType::get(mFP32Ty, mVWidth);
-mSimdVectorTy = StructType::get(pJitMgr->mContext, 
std::vector(4, mSimdFP32Ty), false);
+mSimdVectorTy = ArrayType::get(mSimdFP32Ty, 4);
 mSimdVectorTRTy = StructType::get(pJitMgr->mContext, 
std::vector(5, mSimdFP32Ty), false);
 
 if (sizeof(uint32_t*) == 4)
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
index 984aab6..901bce6 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/fetch_jit.cpp
@@ -27,9 +27,9 @@
 * Notes:
 *
 **/
+#include "builder.h"
 #include "jit_api.h"
 #include "fetch_jit.h"
-#include "builder.h"
 #include "state_llvm.h"
 #include 
 #include 
diff --git a/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
index c4fb372..793e5ec 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/streamout_jit.cpp
@@ -27,9 +27,9 @@
 * Notes:
 *
 **/
+#include "builder.h"
 #include "jit_api.h"
 #include "streamout_jit.h"
-#include "builder.h"
 #include "state_llvm.h"
 #include "llvm/IR/DataLayout.h"
 
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 00/10] swr: update rasterizer

2017-02-06 Thread Tim Rowley
Highlights include more avx512 work and fixes for llvm>=3.8.

Tim Rowley (10):
  swr: [rasterizer core] Frontend SIMD16 WIP
  swr: [rasterizer jitter] Adjust jitter header includes
  swr: [rasterizer jitter] Fix issues with stream-out on llvm>=3.8
  swr: [rasterizer jitter] Change SimdVector representation to array
  swr: [rasterizer jitter] Multisample blend jit fix
  swr: [rasterizer jitter] Add DEBUGTRAP jit builder function
  swr: [rasterizer core] Frontend SIMD16 WIP
  swr: [rasterizer jitter] Disable unsafe FP optimizations in the jitter
  swr: [rasterizer core] Frontend SIMD16 WIP
  swr: [rasterizer jitter] Pass LLVM-IR size into jitter

 src/gallium/drivers/swr/rasterizer/core/context.h  |   6 +
 .../drivers/swr/rasterizer/core/frontend.cpp   | 331 --
 src/gallium/drivers/swr/rasterizer/core/frontend.h |  12 +-
 src/gallium/drivers/swr/rasterizer/core/knobs.h|   1 +
 src/gallium/drivers/swr/rasterizer/core/pa.h   | 478 +
 src/gallium/drivers/swr/rasterizer/core/pa_avx.cpp | 389 +++--
 .../drivers/swr/rasterizer/jitter/JitManager.cpp   |  20 +-
 .../drivers/swr/rasterizer/jitter/JitManager.h |  10 +-
 .../drivers/swr/rasterizer/jitter/blend_jit.cpp|   6 +-
 .../drivers/swr/rasterizer/jitter/builder.cpp  |   6 +-
 .../drivers/swr/rasterizer/jitter/builder.h|   2 -
 .../drivers/swr/rasterizer/jitter/builder_misc.cpp |   7 +
 .../drivers/swr/rasterizer/jitter/builder_misc.h   |   3 +-
 .../drivers/swr/rasterizer/jitter/fetch_jit.cpp|   2 +-
 .../drivers/swr/rasterizer/jitter/jit_api.h|   1 +
 .../swr/rasterizer/jitter/streamout_jit.cpp|   8 +-
 16 files changed, 1098 insertions(+), 184 deletions(-)

-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 05/10] swr: [rasterizer jitter] Multisample blend jit fix

2017-02-06 Thread Tim Rowley
---
 src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp 
b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
index 76a58b6..b4a33b8 100644
--- a/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
+++ b/src/gallium/drivers/swr/rasterizer/jitter/blend_jit.cpp
@@ -776,9 +776,9 @@ struct BlendJit : public Builder
 if(state.desc.sampleMaskEnable || state.desc.alphaToCoverageEnable ||
state.desc.oMaskEnable)
 {
-// load current mask
+// load coverage mask
 Value* pMask = LOAD(ppMask);
-currentMask = S_EXT(ICMP_SGT(currentMask, VBROADCAST(C(0))), 
mSimdInt32Ty);
+currentMask = S_EXT(ICMP_UGT(currentMask, VBROADCAST(C(0))), 
mSimdInt32Ty);
 Value* outputMask = AND(pMask, currentMask);
 // store new mask
 STORE(outputMask, GEP(ppMask, C(0)));
-- 
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 07/10] swr: [rasterizer core] Frontend SIMD16 WIP

2017-02-06 Thread Tim Rowley
Widen simdvertex to SIMD16/simd16vertex in frontend for passing VS
attributes from VS to PA.
---
 .../drivers/swr/rasterizer/core/frontend.cpp   |  33 ++-
 src/gallium/drivers/swr/rasterizer/core/frontend.h |   8 +
 src/gallium/drivers/swr/rasterizer/core/pa.h   |  64 +
 src/gallium/drivers/swr/rasterizer/core/pa_avx.cpp | 280 ++---
 4 files changed, 243 insertions(+), 142 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp 
b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
index b005ead..4d04d8a 100644
--- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
@@ -1307,12 +1307,14 @@ void ProcessDraw(
 pvCutIndices_hi = ();
 }
 
-simdvertex _lo = pa.GetNextVsOutput_simd16_lo();
-simdvertex _hi = pa.GetNextVsOutput_simd16_hi();
+simdvertex vout_lo;
+simdvertex vout_hi;
 
 vsContext_lo.pVout = _lo;
 vsContext_hi.pVout = _hi;
 
+simd16vertex  = pa.GetNextVsOutput_simd16();
+
 if (i < endVertex)
 {
 // 1. Execute FS/VS for a single SIMD.
@@ -1347,9 +1349,36 @@ void ProcessDraw(
 {
 AR_BEGIN(FEVertexShader, pDC->drawId);
 state.pfnVertexFunc(GetPrivateState(pDC), _lo);
+
+// copy SIMD vout_lo to lo part of SIMD16 vout
+{
+const uint32_t voutNumSlots = VERTEX_ATTRIB_START_SLOT 
+ state.feNumAttributes;
+
+for (uint32_t i = 0; i < voutNumSlots; i += 1)
+{
+for (uint32_t j = 0; j < 4; j += 1)
+{
+vout.attrib[i][j].lo = vout_lo.attrib[i][j];
+}
+}
+}
+
 if ((i + KNOB_SIMD_WIDTH) < endVertex)
 {
 state.pfnVertexFunc(GetPrivateState(pDC), 
_hi);
+
+// copy SIMD vout_hi to hi part of SIMD16 vout
+{
+const uint32_t voutNumSlots = 
VERTEX_ATTRIB_START_SLOT + state.feNumAttributes;
+
+for (uint32_t i = 0; i < voutNumSlots; i += 1)
+{
+for (uint32_t j = 0; j < 4; j += 1)
+{
+vout.attrib[i][j].hi = 
vout_hi.attrib[i][j];
+}
+}
+}
 }
 AR_END(FEVertexShader, 0);
 
diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.h 
b/src/gallium/drivers/swr/rasterizer/core/frontend.h
index 6d5f6a3..58d6901 100644
--- a/src/gallium/drivers/swr/rasterizer/core/frontend.h
+++ b/src/gallium/drivers/swr/rasterizer/core/frontend.h
@@ -30,6 +30,14 @@
 #include "context.h"
 #include 
 
+#if ENABLE_AVX512_SIMD16
+// TODO: this belongs in state.h alongside the simdvector definition, but 
there is a llvm codegen issue
+struct simd16vertex
+{
+simd16vectorattrib[KNOB_NUM_ATTRIBUTES];
+};
+
+#endif
 // Calculates the A and B coefficients for the 3 edges of the triangle
 // 
 // maths for edge equations:
diff --git a/src/gallium/drivers/swr/rasterizer/core/pa.h 
b/src/gallium/drivers/swr/rasterizer/core/pa.h
index 826032a..7319c56 100644
--- a/src/gallium/drivers/swr/rasterizer/core/pa.h
+++ b/src/gallium/drivers/swr/rasterizer/core/pa.h
@@ -51,6 +51,9 @@ struct PA_STATE
 
 virtual bool HasWork() = 0;
 virtual simdvector& GetSimdVector(uint32_t index, uint32_t slot) = 0;
+#if ENABLE_AVX512_SIMD16
+virtual simd16vector& GetSimdVector_simd16(uint32_t index, uint32_t slot) 
= 0;
+#endif
 virtual bool Assemble(uint32_t slot, simdvector verts[]) = 0;
 #if ENABLE_AVX512_SIMD16
 virtual bool Assemble_simd16(uint32_t slot, simd16vector verts[]) = 0;
@@ -61,6 +64,7 @@ struct PA_STATE
 #if ENABLE_AVX512_SIMD16
 virtual simdvertex& GetNextVsOutput_simd16_lo() = 0;
 virtual simdvertex& GetNextVsOutput_simd16_hi() = 0;
+virtual simd16vertex& GetNextVsOutput_simd16() = 0;
 #endif
 virtual bool GetNextStreamOutput() = 0;
 virtual simdmask& GetNextVsIndices() = 0;
@@ -151,6 +155,14 @@ struct PA_STATE_OPT : public PA_STATE
 return pVertex[index].attrib[slot];
 }
 
+#if ENABLE_AVX512_SIMD16
+simd16vector& GetSimdVector_simd16(uint32_t index, uint32_t slot)
+{
+simd16vertex* pVertex = (simd16vertex*)pStreamBase;
+return pVertex[index].attrib[slot];
+}
+
+#endif
 // Assembles 4 triangles. Each simdvector is a single vertex from 4
 // triangles (   ) and there are 3 verts per triangle.
 bool Assemble(uint32_t slot, simdvector verts[])
@@ -245,6 

[Mesa-dev] [PATCH 01/10] swr: [rasterizer core] Frontend SIMD16 WIP

2017-02-06 Thread Tim Rowley
SIMD16 Primitive Assembly (PA) only supports TriList and RectList.

CUT_AWARE_PA, TESS, GS, and SO disabled in the SIMD16 front end.
---
 .../drivers/swr/rasterizer/core/frontend.cpp   | 299 ++---
 src/gallium/drivers/swr/rasterizer/core/frontend.h |   4 +-
 src/gallium/drivers/swr/rasterizer/core/knobs.h|   1 +
 src/gallium/drivers/swr/rasterizer/core/pa.h   | 268 +-
 src/gallium/drivers/swr/rasterizer/core/pa_avx.cpp | 284 ++-
 5 files changed, 813 insertions(+), 43 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp 
b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
index c8dce10..b005ead 100644
--- a/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/frontend.cpp
@@ -1027,7 +1027,7 @@ static void TessellationStages(
 SWR_TS_TESSELLATED_DATA tsData = { 0 };
 AR_BEGIN(FETessellation, pDC->drawId);
 TSTessellate(tsCtx, hsContext.pCPout[p].tessFactors, tsData);
-   AR_EVENT(TessPrimCount(1));
+AR_EVENT(TessPrimCount(1));
 AR_END(FETessellation, 0);
 
 if (tsData.NumPrimitives == 0)
@@ -1161,12 +1161,9 @@ void ProcessDraw(
 
 DRAW_WORK&  work = *(DRAW_WORK*)pUserData;
 const API_STATE&state = GetApiState(pDC);
-__m256i vScale = _mm256_set_epi32(7, 6, 5, 4, 3, 2, 1, 0);
-SWR_VS_CONTEXT  vsContext;
-simdvertex  vin;
 
-int indexSize = 0;
-uint32_t endVertex = work.numVerts; 
+uint32_t indexSize = 0;
+uint32_t endVertex = work.numVerts;
 
 const int32_t* pLastRequestedIndex = nullptr;
 if (IsIndexedT::value)
@@ -1197,30 +1194,6 @@ void ProcessDraw(
 endVertex = GetNumVerts(state.topology, GetNumPrims(state.topology, 
work.numVerts));
 }
 
-SWR_FETCH_CONTEXT fetchInfo = { 0 };
-fetchInfo.pStreams = [0];
-fetchInfo.StartInstance = work.startInstance;
-fetchInfo.StartVertex = 0;
-
-vsContext.pVin = 
-
-if (IsIndexedT::value)
-{
-fetchInfo.BaseVertex = work.baseVertex;
-
-// if the entire index buffer isn't being consumed, set the last index
-// so that fetches < a SIMD wide will be masked off
-fetchInfo.pLastIndex = (const 
int32_t*)(((uint8_t*)state.indexBuffer.pIndices) + state.indexBuffer.size);
-if (pLastRequestedIndex < fetchInfo.pLastIndex)
-{
-fetchInfo.pLastIndex = pLastRequestedIndex;
-}
-}
-else
-{
-fetchInfo.StartVertex = work.startVertex;
-}
-
 #if defined(KNOB_ENABLE_RDTSC) || defined(KNOB_ENABLE_AR)
 uint32_t numPrims = GetNumPrims(state.topology, work.numVerts);
 #endif
@@ -1259,6 +1232,267 @@ void ProcessDraw(
 PA_FACTORY paFactory(pDC, state.topology, 
work.numVerts);
 PA_STATE& pa = paFactory.GetPA();
 
+#if USE_SIMD16_FRONTEND
+simdvertex  vin_lo;
+simdvertex  vin_hi;
+SWR_VS_CONTEXT  vsContext_lo;
+SWR_VS_CONTEXT  vsContext_hi;
+
+vsContext_lo.pVin = _lo;
+vsContext_hi.pVin = _hi;
+
+SWR_FETCH_CONTEXT   fetchInfo_lo = { 0 };
+
+fetchInfo_lo.pStreams = [0];
+fetchInfo_lo.StartInstance = work.startInstance;
+fetchInfo_lo.StartVertex = 0;
+
+if (IsIndexedT::value)
+{
+fetchInfo_lo.BaseVertex = work.baseVertex;
+
+// if the entire index buffer isn't being consumed, set the last index
+// so that fetches < a SIMD wide will be masked off
+fetchInfo_lo.pLastIndex = (const 
int32_t*)(((uint8_t*)state.indexBuffer.pIndices) + state.indexBuffer.size);
+if (pLastRequestedIndex < fetchInfo_lo.pLastIndex)
+{
+fetchInfo_lo.pLastIndex = pLastRequestedIndex;
+}
+}
+else
+{
+fetchInfo_lo.StartVertex = work.startVertex;
+}
+
+SWR_FETCH_CONTEXT   fetchInfo_hi = fetchInfo_lo;
+
+const simd16scalari vScale = _simd16_set_epi32(15, 14, 13, 12, 11, 10, 9, 
8, 7, 6, 5, 4, 3, 2, 1, 0);
+
+for (uint32_t instanceNum = 0; instanceNum < work.numInstances; 
instanceNum++)
+{
+uint32_t  i = 0;
+
+simd16scalari vIndex;
+
+if (IsIndexedT::value)
+{
+fetchInfo_lo.pIndices = work.pIB;
+fetchInfo_hi.pIndices = (int32_t *)((uint8_t 
*)fetchInfo_lo.pIndices + KNOB_SIMD_WIDTH * indexSize);// 1/2 of 
KNOB_SIMD16_WIDTH
+}
+else
+{
+vIndex = _simd16_add_epi32(_simd16_set1_epi32(work.startVertexID), 
vScale);
+
+fetchInfo_lo.pIndices = (const int32_t *)
+fetchInfo_hi.pIndices = (const int32_t *)
+}
+
+fetchInfo_lo.CurInstance = instanceNum;
+fetchInfo_hi.CurInstance = instanceNum;
+
+vsContext_lo.InstanceID = instanceNum;
+vsContext_hi.InstanceID = instanceNum;
+
+while (pa.HasWork())
+{
+// PaGetNextVsOutput currently has the 

Re: [Mesa-dev] [PATCH] radv: pass FMASK alignment to application

2017-02-06 Thread Bas Nieuwenhuizen
Yep,

Reviewed-by: Bas Nieuwenhuizen 

On Tue, Feb 7, 2017, at 01:32, Dave Airlie wrote:
> From: Dave Airlie 
> 
> As was done for dcc and cmask.
> 
> Cc: "17.0" 
> Signed-off-by: Dave Airlie 
> ---
>  src/amd/vulkan/radv_image.c | 1 +
>  1 file changed, 1 insertion(+)
> 
> diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
> index 1581645..461d668 100644
> --- a/src/amd/vulkan/radv_image.c
> +++ b/src/amd/vulkan/radv_image.c
> @@ -510,6 +510,7 @@ radv_image_alloc_fmask(struct radv_device *device,
>  
>   image->fmask.offset = align64(image->size, image->fmask.alignment);
>   image->size = image->fmask.offset + image->fmask.size;
> +   image->alignment = MAX2(image->alignment,
> image->fmask.alignment);
>  }
>  
>  static void
> -- 
> 2.9.3
> 
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] radv: pass FMASK alignment to application

2017-02-06 Thread Dave Airlie
From: Dave Airlie 

As was done for dcc and cmask.

Cc: "17.0" 
Signed-off-by: Dave Airlie 
---
 src/amd/vulkan/radv_image.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 1581645..461d668 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -510,6 +510,7 @@ radv_image_alloc_fmask(struct radv_device *device,
 
image->fmask.offset = align64(image->size, image->fmask.alignment);
image->size = image->fmask.offset + image->fmask.size;
+   image->alignment = MAX2(image->alignment, image->fmask.alignment);
 }
 
 static void
-- 
2.9.3

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 99517] [TRACKER] Mesa 17.0 release tracker

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99517
Bug 99517 depends on bug 99633, which changed state.

Bug 99633 Summary: rasterizer/core/clip.h:279:49: error: ‘const struct 
API_STATE’ has no member named ‘linkageCount’
https://bugs.freedesktop.org/show_bug.cgi?id=99633

   What|Removed |Added

 Status|ASSIGNED|RESOLVED
 Resolution|--- |FIXED

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [Bug 99633] rasterizer/core/clip.h:279:49: error: ‘const struct API_STATE’ has no member named ‘linkageCount’

2017-02-06 Thread bugzilla-daemon
https://bugs.freedesktop.org/show_bug.cgi?id=99633

Bruce Cherniak  changed:

   What|Removed |Added

 Resolution|--- |FIXED
 Status|ASSIGNED|RESOLVED

--- Comment #7 from Bruce Cherniak  ---
Patch has been pushed.

-- 
You are receiving this mail because:
You are the QA Contact for the bug.
You are the assignee for the bug.___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 2/2] radv: Enable fast clears by default.

2017-02-06 Thread Dave Airlie
On 7 February 2017 at 09:53, Andres Rodriguez  wrote:
> For the series:
>
> Reviewed-by: Andres Rodriguez 
>
>
>
> On 2017-02-06 06:47 PM, Bas Nieuwenhuizen wrote:
>>
>> Works for me on dota2 and talos now.
>>
>> Signed-off-by: Bas Nieuwenhuizen 

For all 3, happy dance and

Reviewed-by: Dave Airlie 

>> ---
>>   src/amd/vulkan/radv_device.c | 4 ++--
>>   src/amd/vulkan/radv_meta_clear.c | 2 +-
>>   src/amd/vulkan/radv_private.h| 2 +-
>>   3 files changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
>> index 16c9c0ed684..98d4b91ac40 100644
>> --- a/src/amd/vulkan/radv_device.c
>> +++ b/src/amd/vulkan/radv_device.c
>> @@ -294,7 +294,7 @@ static const VkAllocationCallbacks default_alloc = {
>>   };
>> static const struct debug_control radv_debug_options[] = {
>> -   {"fastclears", RADV_DEBUG_FAST_CLEARS},
>> +   {"nofastclears", RADV_DEBUG_NO_FAST_CLEARS},
>> {"nodcc", RADV_DEBUG_NO_DCC},
>> {"shaders", RADV_DEBUG_DUMP_SHADERS},
>> {"nocache", RADV_DEBUG_NO_CACHE},
>> @@ -2157,7 +2157,7 @@ radv_initialise_color_surface(struct radv_device
>> *device,
>> cb->cb_color_info |= S_028C70_COMPRESSION(1);
>> if (iview->image->cmask.size &&
>> -   (device->debug_flags & RADV_DEBUG_FAST_CLEARS))
>> +   !(device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS))
>> cb->cb_color_info |= S_028C70_FAST_CLEAR(1);
>> if (iview->image->surface.dcc_size && level_info->dcc_enabled)
>> diff --git a/src/amd/vulkan/radv_meta_clear.c
>> b/src/amd/vulkan/radv_meta_clear.c
>> index a42e8345716..6d02acc2dd1 100644
>> --- a/src/amd/vulkan/radv_meta_clear.c
>> +++ b/src/amd/vulkan/radv_meta_clear.c
>> @@ -841,7 +841,7 @@ emit_fast_color_clear(struct radv_cmd_buffer
>> *cmd_buffer,
>> if (!iview->image->cmask.size && !iview->image->surface.dcc_size)
>> return false;
>>   - if (!(cmd_buffer->device->debug_flags & RADV_DEBUG_FAST_CLEARS))
>> +   if (cmd_buffer->device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS)
>> return false;
>> if (!radv_layout_can_fast_clear(iview->image, image_layout,
>> radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index,
>> cmd_buffer->queue_family_index)))
>> diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
>> index 69ff3578e34..25ed5dec7cf 100644
>> --- a/src/amd/vulkan/radv_private.h
>> +++ b/src/amd/vulkan/radv_private.h
>> @@ -102,7 +102,7 @@ enum radv_mem_type {
>>   enum {
>> -   RADV_DEBUG_FAST_CLEARS   =   0x1,
>> +   RADV_DEBUG_NO_FAST_CLEARS=   0x1,
>> RADV_DEBUG_NO_DCC=   0x2,
>> RADV_DEBUG_DUMP_SHADERS  =   0x4,
>> RADV_DEBUG_NO_CACHE  =   0x8,
>
>
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] i965: Select pipeline and emit state base address in Gen8+ HiZ ops.

2017-02-06 Thread Kenneth Graunke
If a HiZ op is the first thing in the batch, we should make sure
to select the render pipeline and emit state base address before
proceeding.

I believe 3DSTATE_WM_HZ_OP creates 3DPRIMITIVEs internally, and
dispatching those on the GPGPU pipeline seems a bit sketchy.  I'm
not actually sure that STATE_BASE_ADDRESS is necessary, as the
depth related commands use graphics addresses, not ones relative
to the base address...but we're likely to set it as part of the
next operation anyway, so we should just do it right away.

Cc: "17.0" 
Signed-off-by: Kenneth Graunke 
---
 src/mesa/drivers/dri/i965/gen8_depth_state.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/gen8_depth_state.c 
b/src/mesa/drivers/dri/i965/gen8_depth_state.c
index a7e61354fd5..620b32df8bb 100644
--- a/src/mesa/drivers/dri/i965/gen8_depth_state.c
+++ b/src/mesa/drivers/dri/i965/gen8_depth_state.c
@@ -404,6 +404,9 @@ gen8_hiz_exec(struct brw_context *brw, struct 
intel_mipmap_tree *mt,
if (op == BLORP_HIZ_OP_NONE)
   return;
 
+   brw_select_pipeline(brw, BRW_RENDER_PIPELINE);
+   brw_upload_state_base_address(brw);
+
/* Disable the PMA stall fix since we're about to do a HiZ operation. */
if (brw->gen == 8)
   gen8_write_pma_stall_bits(brw, 0);
-- 
2.11.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 2/2] radv: Enable fast clears by default.

2017-02-06 Thread Andres Rodriguez

For the series:

Reviewed-by: Andres Rodriguez 


On 2017-02-06 06:47 PM, Bas Nieuwenhuizen wrote:

Works for me on dota2 and talos now.

Signed-off-by: Bas Nieuwenhuizen 
---
  src/amd/vulkan/radv_device.c | 4 ++--
  src/amd/vulkan/radv_meta_clear.c | 2 +-
  src/amd/vulkan/radv_private.h| 2 +-
  3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 16c9c0ed684..98d4b91ac40 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -294,7 +294,7 @@ static const VkAllocationCallbacks default_alloc = {
  };
  
  static const struct debug_control radv_debug_options[] = {

-   {"fastclears", RADV_DEBUG_FAST_CLEARS},
+   {"nofastclears", RADV_DEBUG_NO_FAST_CLEARS},
{"nodcc", RADV_DEBUG_NO_DCC},
{"shaders", RADV_DEBUG_DUMP_SHADERS},
{"nocache", RADV_DEBUG_NO_CACHE},
@@ -2157,7 +2157,7 @@ radv_initialise_color_surface(struct radv_device *device,
cb->cb_color_info |= S_028C70_COMPRESSION(1);
  
  	if (iview->image->cmask.size &&

-   (device->debug_flags & RADV_DEBUG_FAST_CLEARS))
+   !(device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS))
cb->cb_color_info |= S_028C70_FAST_CLEAR(1);
  
  	if (iview->image->surface.dcc_size && level_info->dcc_enabled)

diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index a42e8345716..6d02acc2dd1 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -841,7 +841,7 @@ emit_fast_color_clear(struct radv_cmd_buffer *cmd_buffer,
if (!iview->image->cmask.size && !iview->image->surface.dcc_size)
return false;
  
-	if (!(cmd_buffer->device->debug_flags & RADV_DEBUG_FAST_CLEARS))

+   if (cmd_buffer->device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS)
return false;
  
  	if (!radv_layout_can_fast_clear(iview->image, image_layout, radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index, cmd_buffer->queue_family_index)))

diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 69ff3578e34..25ed5dec7cf 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -102,7 +102,7 @@ enum radv_mem_type {
  
  
  enum {

-   RADV_DEBUG_FAST_CLEARS   =   0x1,
+   RADV_DEBUG_NO_FAST_CLEARS=   0x1,
RADV_DEBUG_NO_DCC=   0x2,
RADV_DEBUG_DUMP_SHADERS  =   0x4,
RADV_DEBUG_NO_CACHE  =   0x8,


___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 2/2] radv: Enable fast clears by default.

2017-02-06 Thread Bas Nieuwenhuizen
Works for me on dota2 and talos now.

Signed-off-by: Bas Nieuwenhuizen 
---
 src/amd/vulkan/radv_device.c | 4 ++--
 src/amd/vulkan/radv_meta_clear.c | 2 +-
 src/amd/vulkan/radv_private.h| 2 +-
 3 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/amd/vulkan/radv_device.c b/src/amd/vulkan/radv_device.c
index 16c9c0ed684..98d4b91ac40 100644
--- a/src/amd/vulkan/radv_device.c
+++ b/src/amd/vulkan/radv_device.c
@@ -294,7 +294,7 @@ static const VkAllocationCallbacks default_alloc = {
 };
 
 static const struct debug_control radv_debug_options[] = {
-   {"fastclears", RADV_DEBUG_FAST_CLEARS},
+   {"nofastclears", RADV_DEBUG_NO_FAST_CLEARS},
{"nodcc", RADV_DEBUG_NO_DCC},
{"shaders", RADV_DEBUG_DUMP_SHADERS},
{"nocache", RADV_DEBUG_NO_CACHE},
@@ -2157,7 +2157,7 @@ radv_initialise_color_surface(struct radv_device *device,
cb->cb_color_info |= S_028C70_COMPRESSION(1);
 
if (iview->image->cmask.size &&
-   (device->debug_flags & RADV_DEBUG_FAST_CLEARS))
+   !(device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS))
cb->cb_color_info |= S_028C70_FAST_CLEAR(1);
 
if (iview->image->surface.dcc_size && level_info->dcc_enabled)
diff --git a/src/amd/vulkan/radv_meta_clear.c b/src/amd/vulkan/radv_meta_clear.c
index a42e8345716..6d02acc2dd1 100644
--- a/src/amd/vulkan/radv_meta_clear.c
+++ b/src/amd/vulkan/radv_meta_clear.c
@@ -841,7 +841,7 @@ emit_fast_color_clear(struct radv_cmd_buffer *cmd_buffer,
if (!iview->image->cmask.size && !iview->image->surface.dcc_size)
return false;
 
-   if (!(cmd_buffer->device->debug_flags & RADV_DEBUG_FAST_CLEARS))
+   if (cmd_buffer->device->debug_flags & RADV_DEBUG_NO_FAST_CLEARS)
return false;
 
if (!radv_layout_can_fast_clear(iview->image, image_layout, 
radv_image_queue_family_mask(iview->image, cmd_buffer->queue_family_index, 
cmd_buffer->queue_family_index)))
diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h
index 69ff3578e34..25ed5dec7cf 100644
--- a/src/amd/vulkan/radv_private.h
+++ b/src/amd/vulkan/radv_private.h
@@ -102,7 +102,7 @@ enum radv_mem_type {
 
 
 enum {
-   RADV_DEBUG_FAST_CLEARS   =   0x1,
+   RADV_DEBUG_NO_FAST_CLEARS=   0x1,
RADV_DEBUG_NO_DCC=   0x2,
RADV_DEBUG_DUMP_SHADERS  =   0x4,
RADV_DEBUG_NO_CACHE  =   0x8,
-- 
2.11.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH 1/2] radv: Pass DCC alignment to application.

2017-02-06 Thread Bas Nieuwenhuizen
Signed-off-by: Bas Nieuwenhuizen 
Cc: "17.0" 
---
 src/amd/vulkan/radv_image.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 202f460aafe..1581645b18d 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -582,6 +582,7 @@ radv_image_alloc_dcc(struct radv_device *device,
/* + 8 for storing the clear values */
image->clear_value_offset = image->dcc_offset + image->surface.dcc_size;
image->size = image->dcc_offset + image->surface.dcc_size + 8;
+   image->alignment = MAX2(image->alignment, image->surface.dcc_alignment);
 }
 
 static unsigned
-- 
2.11.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


[Mesa-dev] [PATCH] radv: Pass CMASK alignment to application.

2017-02-06 Thread Bas Nieuwenhuizen
CMASK alignment can be greater than image data alignment, so pass
it to the app so that it knows what alignment to backing memory
should have.

Signed-off-by: Bas Nieuwenhuizen 
Cc: 
---
 src/amd/vulkan/radv_image.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c
index 99d17376cf6..202f460aafe 100644
--- a/src/amd/vulkan/radv_image.c
+++ b/src/amd/vulkan/radv_image.c
@@ -571,6 +571,7 @@ radv_image_alloc_cmask(struct radv_device *device,
/* + 8 for storing the clear values */
image->clear_value_offset = image->cmask.offset + image->cmask.size;
image->size = image->cmask.offset + image->cmask.size + 8;
+   image->alignment = MAX2(image->alignment, image->cmask.alignment);
 }
 
 static void
-- 
2.11.0

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH] radv/ac: avoid the fmask path when doing txs.

2017-02-06 Thread Bas Nieuwenhuizen
Reviewed-by: Bas Nieuwenhuizen 

On Mon, Feb 6, 2017, at 03:41, Dave Airlie wrote:
> From: Dave Airlie 
> 
> This fixes the vulkan samples deferredmultisampling test.
> 
> Cc: "17.0" 
> Signed-off-by: Dave Airlie 
> ---
>  src/amd/common/ac_nir_to_llvm.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/src/amd/common/ac_nir_to_llvm.c
> b/src/amd/common/ac_nir_to_llvm.c
> index 566516f..dbd65f6 100644
> --- a/src/amd/common/ac_nir_to_llvm.c
> +++ b/src/amd/common/ac_nir_to_llvm.c
> @@ -3648,7 +3648,8 @@ static void visit_tex(struct nir_to_llvm_context
> *ctx, nir_tex_instr *instr)
>* The sample index should be adjusted as follows:
>*   sample_index = (fmask >> (sample_index * 4)) & 0xF;
>*/
> -   if (instr->sampler_dim == GLSL_SAMPLER_DIM_MS) {
> +   if (instr->sampler_dim == GLSL_SAMPLER_DIM_MS &&
> +   instr->op != nir_texop_txs) {
>   LLVMValueRef txf_address[4];
>   struct ac_tex_info txf_info = { 0 };
>   unsigned txf_count = count;
> -- 
> 2.7.4
> 
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Marek Olšák
On Mon, Feb 6, 2017 at 9:27 PM, Jan Ziak <0xe2.0x9a.0...@gmail.com> wrote:
> Hello
>
> I am against application profiles - in the form of "a
> community-maintained whitelist of apps" or in any other form
> explicitly associating the name/ID of an app with a Mesa variable
> which controls the behavior of Mesa.
>
> Application profiles would be a manifestation of poor algorithms in
> the OpenGL implementation.

No, it's called incremental progress.

The Mesa community doesn't have resources to develop a multithreaded
solution that is perfect from day 1. Incremental progress will get us
there eventually. Or not. But it's the only way to get somewhere with
our limited resources.

Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [ANNOUNCE] mesa 17.0.0-rc3

2017-02-06 Thread Ilia Mirkin
May I ask why

commit 7d3f9ed71c71637a91ecf15f50dbe7578a65d57e
Author: Ilia Mirkin 
Date:   Wed Jan 25 22:31:58 2017 -0500

st/mesa: MAX_VARYING is the max supported number of patch varyings, not min

and

commit e73f87fcbdcb12b0b8d28c4ca3444bfb7669bca5
Author: Ilia Mirkin 
Date:   Wed Feb 1 16:11:41 2017 -0500

vbo: process buffer binding state changes on draw when recording

weren't included? (And looks like various other ones too...) Did they
just not make the cutoff, or was there some kind of procedural
screwup?

Cheers,

  -ilia

On Mon, Feb 6, 2017 at 9:02 AM, Emil Velikov  wrote:
> The third release candidate for Mesa 17.0.0 is now available.
>
> Note that we have a couple of issues that I'd like to see fixed.
> If those are be not sorted by this Friday the final release will be
> out, regardless.
>
>
> Andreas Boll (1):
>   configure.ac: Require LLVM for r300 only on x86 and x86_64
>
> Bartosz Tomczyk (2):
>   r600: Fix stack overflow
>   glsl: fix heap-buffer-overflow
>
> Bas Nieuwenhuizen (1):
>   radv/ac: Use base in push constant loads.
>
> Christian Gmeiner (1):
>   etnaviv: Avoid infinite loop in find_frame()
>
> Christian König (1):
>   st/va: make sure that we call begin_frame() only once v2
>
> Dave Airlie (6):
>   radv: program a default point size.
>   radv: handle transfer_write as a dst flag.
>   radv/ac: fix multisample subpass image.
>   radv/ac: handle nir irem opcode.
>   radv/ac: implement txs for buffer textures.
>   radv/ac: apply slice rounding to 1d arrays as well.
>
> Emil Velikov (22):
>   configure.ac: move require_dri_shared_libs_and_glapi() before its users
>   mesa: move variable declaration to where its used
>   i965: automake: correctly set MKDIR_GEN
>   freedreno: automake: correctly set MKDIR_GEN
>   i965: automake: include builddir prior to srcdir
>   i915: automake: include builddir prior to srcdir
>   egl: automake: include builddir prior to srcdir
>   clover: automake: include builddir prior to srcdir
>   st/dri: automake: include builddir prior to srcdir
>   d3dadapter9: automake: include builddir prior to srcdir
>   glx: automake: include builddir prior to srcdir
>   glx/apple: automake: include builddir prior to srcdir
>   glx/windows: automake: include builddir prior to srcdir
>   loader: automake: include builddir prior to srcdir
>   mapi: automake: include builddir prior to srcdir
>   radeon, r200: automake: include builddir prior to srcdir
>   dri/swrast: automake: include builddir prior to srcdir
>   dri/osmesa: automake: include builddir prior to srcdir
>   mesa/tests: automake: include builddir prior to srcdir
>   radv: automake: Don't install vk_platform.h or vulkan.h.
>   configure.ac: list radeon in --with-vulkan-drivers help string
>   Update version to 17.0.0-rc3
>
> Iago Toral Quiroga (1):
>   anv/lower_input_attachments: honor sample index parameter to 
> subpassLoad()
>
> Ian Romanick (1):
>   mesa: Don't advertise GL_OES_read_format in core profile
>
> Jason Ekstrand (8):
>   i965/blorp: Use the correct ISL format for combined depth/stencil
>   vulkan/wsi/wayland: Handle VK_INCOMPLETE for GetFormats
>   vulkan/wsi/wayland: Handle VK_INCOMPLETE for GetPresentModes
>   vulkan/wsi: Lower the maximum image sizes
>   intel/blorp: Handle clearing of A4B4G4R4 on all platforms
>   isl/formats: Only advertise sampling for A4B4G4R4 on Broadwell
>   anv: Flush render cache before STATE_BASE_ADDRESS on gen7
>   anv: Improve flushing around STATE_BASE_ADDRESS
>
> Kenneth Graunke (6):
>   i965: Fix fast depth clears for surfaces with a dimension of 16384.
>   i965: Use a UW source type for CS_OPCODE_CS_TERMINATE.
>   i965: Make intelEmitCopyBlit not truncate large strides.
>   i965: Unbind deleted shaders from brw_context, fixing malloc heisenbug.
>   i965: Fix check for negative pitch in can_do_fast_copy_blit().
>   i965: Support the force_glsl_version driconf option.
>
> Lionel Landwerlin (4):
>   anv: set command buffer to NULL when allocations fail
>   anv: fix descriptor pool internal size allocation
>   spirv: handle OpUndef as part of the variable parsing pass
>   spirv: handle undefined components for OpVectorShuffle
>
> Lucas Stach (1):
>   etnaviv: force vertex buffers through the MMU
>
> Marek Olšák (3):
>   st/mesa: destroy pipe_context before destroying st_context (v2)
>   radeonsi: handle first_non_void correctly in si_create_vertex_elements
>   radeonsi: don't invoke DCC decompression in 
> update_all_texture_descriptors
>
> Mauro Rossi (1):
>   android: fix llvm, elf dependencies for M, N releases
>
> Nanley Chery (1):
>   anv/cmd_buffer: Use the proper depth input attachment surface state
>
> Nayan Deshmukh (1):
>   

Re: [Mesa-dev] [RFC PATCH] gallium: add a common uploader to pipe_context

2017-02-06 Thread Marek Olšák
On Mon, Feb 6, 2017 at 9:58 PM, Brian Paul  wrote:
> On 02/06/2017 12:11 PM, Marek Olšák wrote:
>>
>> On Mon, Feb 6, 2017 at 5:15 PM, Brian Paul  wrote:
>>>
>>> On 02/03/2017 02:41 PM, Marek Olšák wrote:


 On Fri, Feb 3, 2017 at 9:45 PM, Brian Paul  wrote:
>
>
> On 02/01/2017 02:23 PM, Brian Paul wrote:
>>
>>
>>
>> On 01/27/2017 04:00 AM, Marek Olšák wrote:
>>>
>>>
>>>
>>> On Fri, Jan 27, 2017 at 10:05 AM, Nicolai Hähnle 
>>> wrote:



 On 27.01.2017 00:51, Marek Olšák wrote:
>
>
>
>
> From: Marek Olšák 
>
> For lower memory usage and more efficient updates of the buffer
> residency
> list. (e.g. if drivers keep seeing the same buffer for many
> consecutive
> "add" calls, the calls can be turned into no-ops trivially)





 This makes sense to me, but how are you planning to deal with the
 bind
 flags? They are currently set differently for different upload mgrs.
 We
 should probably do away with them entirely anyway.
>>>
>>>
>>>
>>>
>>> Drivers can set the bind flags they need. Some drivers will set all 3
>>> bind flags. Other drivers don't have to set any.
>>
>>
>>
>>
>> I need to look into this part more closely.  I think we may have
>> trouble
>> mixing constants with index/vertex data in our VMware driver...
>
>
>
>
> Marek,
>
> Your patch series, as-is, did indeed cause trouble with our VMware
> driver.
> We need to keep constants in a separate buffer.
>
> The good news is I don't think this is a huge problem and I've updated
> (a
> subset of) your patches to accommodate both your needs and ours.
>
> The basic idea is to add a pipe_context::get_stream_uploader() hook
> that
> allows drivers to use just one or separate uploaders for
> vertex/index/constant data.  Plus, I added a
> pipe_context::unmap_stream_uploaders() helper, but this isn't strictly
> necessary.
>
> WIP patch attached (only lightly tested).  Let me know what you think.



 Can we simply add these 2 fields into pipe_context instead of the
 callback?

 pipe_context::stream_uploader // vertex + index
 pipe_context::const_uploader
>>>
>>>
>>>
>>> Yeah, that might work too.  Though, now I have to test the case of vertex
>>> data and index data being in the same VBO.  We may need three uploader
>>> pointers...
>>
>>
>> What's the issue with svga that it needs different buffers for each
>> type? OpenGL allows the same buffer to be used for vertex, index,
>> const, even the same buffer range.
>
>
> Our virtual device protocol uses DX10 conventions and in DX10, constant
> buffers are distinct from vertex/index buffers.  That is, you can't set both
> D3D10_BIND_CONSTANT_BUFFER and D3D10_BIND_VERTEX_BUFFER for one buffer.
> Luckily, we haven't come across any GL apps that need that (and it wouldn't
> be too hard to work around it if needed).
>
> I was pretty sure that vertex+index data in one buffer was OK but I wanted
> to check.  Since I don't think we have any piglit tests (or apps) that
> exercise that specific case, I just wrote one and it seems to work fine.
>
> So, pipe_context::stream_uploader + pipe_context::const_uploader should be
> OK for us.  Do you want to implement that?

Yes, I'll add const_uploader.

Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 3/8] radv/amdgpu: Add winsys implementation of virtual buffers.

2017-02-06 Thread Dave Airlie
On 5 February 2017 at 21:43, Bas Nieuwenhuizen  wrote:
> Signed-off-by: Bas Nieuwenhuizen 
> ---
>  src/amd/vulkan/radv_radeon_winsys.h   |   5 +
>  src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c | 218 
> +++---
>  src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.h |  35 -
>  src/amd/vulkan/winsys/amdgpu/radv_amdgpu_cs.c |  98 +++-
>  4 files changed, 330 insertions(+), 26 deletions(-)

This patch seems to be the main work involved,

I'm happy to give Reviewed-by: Dave Airlie  for the series,

However for this patch it might be nice to add some more
comments to radv_amdgpu_winsys_bo_virtual_bind with what exactly it is doing.

Like if we are merging ranges or why you remove ranges etc, just what rules
it is following to make it easier when debugging it in the future.

Dave.


>
> diff --git a/src/amd/vulkan/radv_radeon_winsys.h 
> b/src/amd/vulkan/radv_radeon_winsys.h
> index 79c182007a6..20d6b1d60d2 100644
> --- a/src/amd/vulkan/radv_radeon_winsys.h
> +++ b/src/amd/vulkan/radv_radeon_winsys.h
> @@ -47,6 +47,7 @@ enum radeon_bo_flag { /* bitfield */
> RADEON_FLAG_GTT_WC =(1 << 0),
> RADEON_FLAG_CPU_ACCESS =(1 << 1),
> RADEON_FLAG_NO_CPU_ACCESS = (1 << 2),
> +   RADEON_FLAG_VIRTUAL =   (1 << 3)
>  };
>
>  enum radeon_bo_usage { /* bitfield */
> @@ -284,6 +285,10 @@ struct radeon_winsys {
>
> void (*buffer_set_metadata)(struct radeon_winsys_bo *bo,
> struct radeon_bo_metadata *md);
> +
> +   void (*buffer_virtual_bind)(struct radeon_winsys_bo *parent,
> +   uint64_t offset, uint64_t size,
> +   struct radeon_winsys_bo *bo, uint64_t 
> bo_offset);
> struct radeon_winsys_ctx *(*ctx_create)(struct radeon_winsys *ws);
> void (*ctx_destroy)(struct radeon_winsys_ctx *ctx);
>
> diff --git a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c 
> b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> index 7319a988872..d5bce304510 100644
> --- a/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> +++ b/src/amd/vulkan/winsys/amdgpu/radv_amdgpu_bo.c
> @@ -34,19 +34,182 @@
>  #include 
>  #include 
>
> +static void
> +radv_amdgpu_winsys_virtual_map(struct radv_amdgpu_winsys_bo *bo,
> +   const struct radv_amdgpu_map_range *range)
> +{
> +   assert(range->size);
> +
> +   if (!range->bo)
> +   return; /* TODO: PRT mapping */
> +
> +   int r = amdgpu_bo_va_op(range->bo->bo, range->bo_offset, range->size,
> +   range->offset + bo->va, 0, AMDGPU_VA_OP_MAP);
> +   if (r)
> +   abort();
> +}
> +
> +static void
> +radv_amdgpu_winsys_virtual_unmap(struct radv_amdgpu_winsys_bo *bo,
> + const struct radv_amdgpu_map_range *range)
> +{
> +   assert(range->size);
> +
> +   if (!range->bo)
> +   return; /* TODO: PRT mapping */
> +
> +   int r = amdgpu_bo_va_op(range->bo->bo, range->bo_offset, range->size,
> +   range->offset + bo->va, 0, 
> AMDGPU_VA_OP_UNMAP);
> +   if (r)
> +   abort();
> +}
> +
> +static void
> +radv_amdgpu_winsys_rebuild_bo_list(struct radv_amdgpu_winsys_bo *bo)
> +{
> +   bo->bo_count = 0;
> +   for (uint32_t i = 0; i < bo->range_count; ++i) {
> +   bool found = false;
> +   if (!bo->ranges[i].bo)
> +   continue;
> +
> +   for(uint32_t j = 0; j <  bo->bo_count; ++j) {
> +   if (bo->bos[j] == bo->ranges[i].bo) {
> +   found = true;
> +   break;
> +   }
> +   }
> +
> +   if (!found) {
> +   if (bo->bo_capacity == bo->bo_count) {
> +   bo->bos = realloc(bo->bos,
> + (bo->bo_capacity + 1) * 
> sizeof(struct radv_amdgpu_bo *));
> +   ++bo->bo_capacity;
> +   }
> +   bo->bos[bo->bo_count++] = bo->ranges[i].bo;
> +   }
> +   }
> +}
> +
> +static void
> +radv_amdgpu_winsys_bo_virtual_bind(struct radeon_winsys_bo *_parent,
> +   uint64_t offset, uint64_t size,
> +   struct radeon_winsys_bo *_bo, uint64_t 
> bo_offset)
> +{
> +   struct radv_amdgpu_winsys_bo *parent = (struct radv_amdgpu_winsys_bo 
> *)_parent;
> +   struct radv_amdgpu_winsys_bo *bo = (struct radv_amdgpu_winsys_bo*)_bo;
> +   int range_count_delta, new_idx;
> +   int first = 0, last;
> +   struct radv_amdgpu_map_range new_first, new_last;
> +
> +   assert(parent->is_virtual);
> +   assert(!bo || !bo->is_virtual);
> +
> +   if (!size)
> +   return;
> 

Re: [Mesa-dev] [PATCH] swr: [rasterizer core] Removed unused clip code.

2017-02-06 Thread Rowley, Timothy O
Reviewed-by: Tim Rowley 
>

On Feb 3, 2017, at 11:35 AM, Bruce Cherniak 
> wrote:

Removed unused Clip() and FRUSTUM_CLIP_MASK define.
---
src/gallium/drivers/swr/rasterizer/core/clip.cpp | 22 --
src/gallium/drivers/swr/rasterizer/core/clip.h   |  4 
2 files changed, 26 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.cpp 
b/src/gallium/drivers/swr/rasterizer/core/clip.cpp
index 7b1e09d..0a6afe5 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.cpp
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.cpp
@@ -157,28 +157,6 @@ int ClipTriToPlane( const float *pInPts, int numInPts,
return i;
}

-
-
-void Clip(const float *pTriangle, const float *pAttribs, int numAttribs, float 
*pOutTriangles, int *numVerts, float *pOutAttribs)
-{
-// temp storage to hold at least 6 sets of vertices, the max number that 
can be created during clipping
-OSALIGNSIMD(float) tempPts[6 * 4];
-OSALIGNSIMD(float) tempAttribs[6 * KNOB_NUM_ATTRIBUTES * 4];
-
-// we opt to clip to viewport frustum to produce smaller triangles for 
rasterization precision
-int NumOutPts = ClipTriToPlane(pTriangle, 3, pAttribs, 
numAttribs, tempPts, tempAttribs);
-NumOutPts = ClipTriToPlane(tempPts, NumOutPts, tempAttribs, 
numAttribs, pOutTriangles, pOutAttribs);
-NumOutPts = ClipTriToPlane(pOutTriangles, NumOutPts, 
pOutAttribs, numAttribs, tempPts, tempAttribs);
-NumOutPts = ClipTriToPlane(tempPts, NumOutPts, tempAttribs, 
numAttribs, pOutTriangles, pOutAttribs);
-NumOutPts = ClipTriToPlane(pOutTriangles, NumOutPts, 
pOutAttribs, numAttribs, tempPts, tempAttribs);
-NumOutPts = ClipTriToPlane(tempPts, NumOutPts, tempAttribs, 
numAttribs, pOutTriangles, pOutAttribs);
-
-SWR_ASSERT(NumOutPts <= 6);
-
-*numVerts = NumOutPts;
-return;
-}
-
void ClipTriangles(DRAW_CONTEXT *pDC, PA_STATE& pa, uint32_t workerId, 
simdvector prims[], uint32_t primMask, simdscalari primId, simdscalari 
viewportIdx)
{
SWR_CONTEXT *pContext = pDC->pContext;
diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h 
b/src/gallium/drivers/swr/rasterizer/core/clip.h
index f19858f..23a768f 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.h
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.h
@@ -56,12 +56,8 @@ enum SWR_CLIPCODES
GUARDBAND_BOTTOM = (0x80 << CLIPCODE_SHIFT | 0x8)
};

-#define FRUSTUM_CLIP_MASK 
(FRUSTUM_LEFT|FRUSTUM_TOP|FRUSTUM_RIGHT|FRUSTUM_BOTTOM|FRUSTUM_NEAR|FRUSTUM_FAR)
#define GUARDBAND_CLIP_MASK 
(FRUSTUM_NEAR|FRUSTUM_FAR|GUARDBAND_LEFT|GUARDBAND_TOP|GUARDBAND_RIGHT|GUARDBAND_BOTTOM|NEGW)

-void Clip(const float *pTriangle, const float *pAttribs, int numAttribs, float 
*pOutTriangles,
-  int *numVerts, float *pOutAttribs);
-
INLINE
void ComputeClipCodes(const API_STATE& state, const simdvector& vertex, 
simdscalar& clipCodes, simdscalari viewportIndexes)
{
--
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [Mesa-stable] [PATCH] swr: [rasterizer core] Remove dead code Clipper::ClipScalar()

2017-02-06 Thread Rowley, Timothy O
Reviewed-by: Tim Rowley 
>

On Feb 4, 2017, at 5:55 PM, Vinson Lee 
> wrote:

Tested-by: Vinson Lee >

On Thu, Feb 2, 2017 at 12:42 PM, Cherniak, Bruce
> wrote:
I followed up with a v2 that includes the bugzilla reference.

Good point, I’ll look into following up with a patch to remove Clip().

Thanks for the quick review.

On Feb 2, 2017, at 2:26 PM, Ilia Mirkin 
> wrote:

Reviewed-by: Ilia Mirkin >

I got confused by this code as well when I was trying to understand
the clipper. I think the Clip() function can go too now in the .cpp
file (as well as the fwd decl in the header)?

On Thu, Feb 2, 2017 at 3:15 PM, Bruce Cherniak 
> wrote:
Clipper::ClipScalar() is dead code and should be removed.  It is causing
an error with gcc-7 because it references a now defunct member.

CC: "13.0 17.0" 
>
---
src/gallium/drivers/swr/rasterizer/core/clip.h | 39 --
1 file changed, 39 deletions(-)

diff --git a/src/gallium/drivers/swr/rasterizer/core/clip.h 
b/src/gallium/drivers/swr/rasterizer/core/clip.h
index 085e4a9..f19858f 100644
--- a/src/gallium/drivers/swr/rasterizer/core/clip.h
+++ b/src/gallium/drivers/swr/rasterizer/core/clip.h
@@ -262,45 +262,6 @@ public:
   return _simd_movemask_ps(vClipCullMask);
   }

-// clip a single primitive
-int ClipScalar(PA_STATE& pa, uint32_t primIndex, float* pOutPos, float* 
pOutAttribs)
-{
-OSALIGNSIMD(float) inVerts[3 * 4];
-OSALIGNSIMD(float) inAttribs[3 * KNOB_NUM_ATTRIBUTES * 4];
-
-// transpose primitive position
-__m128 verts[3];
-pa.AssembleSingle(VERTEX_POSITION_SLOT, primIndex, verts);
-_mm_store_ps([0], verts[0]);
-_mm_store_ps([4], verts[1]);
-_mm_store_ps([8], verts[2]);
-
-// transpose attribs
-uint32_t numScalarAttribs = this->state.linkageCount * 4;
-
-int idx = 0;
-DWORD slot = 0;
-uint32_t mapIdx = 0;
-uint32_t tmpLinkage = uint32_t(this->state.linkageMask);
-while (_BitScanForward(, tmpLinkage))
-{
-tmpLinkage &= ~(1 << slot);
-// Compute absolute attrib slot in vertex array
-uint32_t inputSlot = VERTEX_ATTRIB_START_SLOT + 
this->state.linkageMap[mapIdx++];
-__m128 attrib[3];// triangle attribs (always 4 wide)
-pa.AssembleSingle(inputSlot, primIndex, attrib);
-_mm_store_ps([idx], attrib[0]);
-_mm_store_ps([idx + numScalarAttribs], attrib[1]);
-_mm_store_ps([idx + numScalarAttribs * 2], attrib[2]);
-idx += 4;
-}
-
-int numVerts;
-Clip(inVerts, inAttribs, numScalarAttribs, pOutPos, , 
pOutAttribs);
-
-return numVerts;
-}
-
   // clip SIMD primitives
   void ClipSimd(const simdscalar& vPrimMask, const simdscalar& vClipMask, 
PA_STATE& pa, const simdscalari& vPrimId, const simdscalari& vViewportIdx)
   {
--
2.7.4

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev
___
mesa-stable mailing list
mesa-sta...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-stable

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [RFC PATCH] gallium: add a common uploader to pipe_context

2017-02-06 Thread Brian Paul

On 02/06/2017 12:11 PM, Marek Olšák wrote:

On Mon, Feb 6, 2017 at 5:15 PM, Brian Paul  wrote:

On 02/03/2017 02:41 PM, Marek Olšák wrote:


On Fri, Feb 3, 2017 at 9:45 PM, Brian Paul  wrote:


On 02/01/2017 02:23 PM, Brian Paul wrote:



On 01/27/2017 04:00 AM, Marek Olšák wrote:



On Fri, Jan 27, 2017 at 10:05 AM, Nicolai Hähnle 
wrote:



On 27.01.2017 00:51, Marek Olšák wrote:




From: Marek Olšák 

For lower memory usage and more efficient updates of the buffer
residency
list. (e.g. if drivers keep seeing the same buffer for many
consecutive
"add" calls, the calls can be turned into no-ops trivially)





This makes sense to me, but how are you planning to deal with the bind
flags? They are currently set differently for different upload mgrs.
We
should probably do away with them entirely anyway.




Drivers can set the bind flags they need. Some drivers will set all 3
bind flags. Other drivers don't have to set any.




I need to look into this part more closely.  I think we may have trouble
mixing constants with index/vertex data in our VMware driver...




Marek,

Your patch series, as-is, did indeed cause trouble with our VMware
driver.
We need to keep constants in a separate buffer.

The good news is I don't think this is a huge problem and I've updated (a
subset of) your patches to accommodate both your needs and ours.

The basic idea is to add a pipe_context::get_stream_uploader() hook that
allows drivers to use just one or separate uploaders for
vertex/index/constant data.  Plus, I added a
pipe_context::unmap_stream_uploaders() helper, but this isn't strictly
necessary.

WIP patch attached (only lightly tested).  Let me know what you think.



Can we simply add these 2 fields into pipe_context instead of the
callback?

pipe_context::stream_uploader // vertex + index
pipe_context::const_uploader



Yeah, that might work too.  Though, now I have to test the case of vertex
data and index data being in the same VBO.  We may need three uploader
pointers...


What's the issue with svga that it needs different buffers for each
type? OpenGL allows the same buffer to be used for vertex, index,
const, even the same buffer range.


Our virtual device protocol uses DX10 conventions and in DX10, constant 
buffers are distinct from vertex/index buffers.  That is, you can't set 
both D3D10_BIND_CONSTANT_BUFFER and D3D10_BIND_VERTEX_BUFFER for one 
buffer.  Luckily, we haven't come across any GL apps that need that (and 
it wouldn't be too hard to work around it if needed).


I was pretty sure that vertex+index data in one buffer was OK but I 
wanted to check.  Since I don't think we have any piglit tests (or apps) 
that exercise that specific case, I just wrote one and it seems to work 
fine.


So, pipe_context::stream_uploader + pipe_context::const_uploader should 
be OK for us.  Do you want to implement that?


-Brian

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Jan Ziak
Hello

I am against application profiles - in the form of "a
community-maintained whitelist of apps" or in any other form
explicitly associating the name/ID of an app with a Mesa variable
which controls the behavior of Mesa.

Application profiles would be a manifestation of poor algorithms in
the OpenGL implementation.

Application profiles would hinder entry of new players into the Linux
OpenGL application market, because their applications would be at the
disadvantage of not being in the whitelist. Application profiles would
make competition (economics) less effective.

A solution superior to application profiles is to analyze
application's OpenGL usage patterns and make optimization decisions
based on those patterns. The OpenGL implementation (Mesa) can store
the patterns and computed values in a disk cache to avoid
recomputation if the app is started again.

Jan

> Yes, I'm aware that glthread is far from perfect. However, I don't consider
> that an issue. My idea is that the actual work will take place in master. I
> have zero faith that any work on that will take place outside of master.
>
> Currently I don't expect it to work with any GL4 apps, because the threaded
> dispatch isn't aware of many GL4 functions. Initially we'll have a
> community-maintained whitelist of apps benefitting from glthread.
>
> Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [RFC PATCH 1/1] st/dri: add a new driconf option override_glsl_version for ARK games

2017-02-06 Thread Samuel Pitoiset



On 02/06/2017 04:45 PM, Eero Tamminen wrote:

Hi,

On 05.02.2017 15:19, Samuel Pitoiset wrote:

On 02/03/2017 07:48 PM, Bas Nieuwenhuizen wrote:

As far as I can see[1], when the game detects GL 4.3+, the engine tries
to load a different set of shaders from disk, but the game developers
have not enabled the right flag during building, so the shaders for
GL4.3+ are not actually distributed with the game, which results in a
failure to load the game. From my POV this is entirely the fault of the
game.


I can confirm that these ARK games fail to start with a 4.3+ context.
But from my point of view, I'm not really *sure* it's a game fault
because as you said in the related ticket, the game starts correctly
with AMDGPU-pro because it returns the right context. Maybe we should
just do the same?



That said, the bug contains a report from someone else that it works on
intel with GL4.3+.


That was me.  The game is still early access and has been updated many
times since.



I never got to test that or look deeper into this, so
it could very well be that I overlooked something during this analysis.


It would be interesting to get a confirmation, but I don't have any
intel hw here.


Results from quick try on Ubuntu 16.04 with today's version of the game
(ARK: Survival Evolved)...

With (Ubuntu 16.04 default) Mesa 11.2, game starts to the game main
menu, but when one starts from that a single player campaign, it will
crash before the real game begins, after few minutes of loading (when
game RAM resident set size has grown to ~10 GB):

Thread 1 "ShooterGame" received signal SIGSEGV, Segmentation fault.
0x01369f9b in _start ()
(gdb) bt
#0  0x01369f9b in _start ()


With latest Mesa (with or without the patch), game will just show a
small dialog with few garbage characters and exit.  I have no idea what
it wants to complain about.


That patch is actually wrong for intel (it doesn't override anything).

Maybe you can try this one?

https://cgit.freedesktop.org/~hakzsam/mesa/log/?h=override_glsl_version_v2

Thanks.




- Eero

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [RFC PATCH 1/1] st/dri: add a new driconf option override_glsl_version for ARK games

2017-02-06 Thread Samuel Pitoiset



On 02/06/2017 04:04 PM, Eero Tamminen wrote:

Hi,
On 03.02.2017 19:23, Samuel Pitoiset wrote:

This is similar to the MESA_GLSL_VERSION_OVERRIDE envvar (mainly
for developers). But this one has the advantage to be configured
for specific apps which require a context with an explicit version.

For example, when an app requires a 3.2 core context, RadeonSI
will return a 4.5 context but this might fail (eg. ARK games).

No need to add both "ARK: Survival Evolved" and "ARK: Survival
Of The Fittest" because the executable name is the same.


Those games use Unreal Engine v4 and "ShooterGame" is the binary name
for one of the demos included in UE v4 SDK:
https://wiki.unrealengine.com/Linux_Demos



Sadness.


If ARK developers couldn't be bothered to change the name of their
binary before release, maybe other game developers don't/haven't either.
 I.e. I'm not sure it's unique enough.


-> Safer to have an option that just tells Mesa to use context version
that the application requested (if Mesa supports that on given HW).


Totally agree.




- Eero


Signed-off-by: Samuel Pitoiset 
---
 src/gallium/include/state_tracker/st_api.h  | 1 +
 src/gallium/state_trackers/dri/dri_screen.c | 3 +++
 src/gallium/state_trackers/osmesa/osmesa.c  | 1 +
 src/mesa/drivers/dri/common/drirc   | 4 
 src/mesa/drivers/dri/common/xmlpool/t_options.h | 5 +
 src/mesa/drivers/dri/i965/brw_context.c | 3 +++
 src/mesa/state_tracker/st_extensions.c  | 3 +++
 7 files changed, 20 insertions(+)

diff --git a/src/gallium/include/state_tracker/st_api.h
b/src/gallium/include/state_tracker/st_api.h
index a2e37d2e48..e0a73d74ad 100644
--- a/src/gallium/include/state_tracker/st_api.h
+++ b/src/gallium/include/state_tracker/st_api.h
@@ -246,6 +246,7 @@ struct st_config_options
boolean force_s3tc_enable;
boolean allow_glsl_extension_directive_midshader;
boolean glsl_zero_init;
+   unsigned override_glsl_version;
 };

 /**
diff --git a/src/gallium/state_trackers/dri/dri_screen.c
b/src/gallium/state_trackers/dri/dri_screen.c
index a950f5241d..a1fa0a3be3 100644
--- a/src/gallium/state_trackers/dri/dri_screen.c
+++ b/src/gallium/state_trackers/dri/dri_screen.c
@@ -70,6 +70,7 @@ const __DRIconfigOptionsExtension
gallium_config_options = {
  DRI_CONF_DISABLE_SHADER_BIT_ENCODING("false")
  DRI_CONF_FORCE_GLSL_VERSION(0)
  DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER("false")
+ DRI_CONF_OVERRIDE_GLSL_VERSION(0)
   DRI_CONF_SECTION_END

   DRI_CONF_SECTION_MISCELLANEOUS
@@ -100,6 +101,8 @@ dri_fill_st_options(struct st_config_options
*options,
options->allow_glsl_extension_directive_midshader =
   driQueryOptionb(optionCache,
"allow_glsl_extension_directive_midshader");
options->glsl_zero_init = driQueryOptionb(optionCache,
"glsl_zero_init");
+   options->override_glsl_version =
+  driQueryOptioni(optionCache, "override_glsl_version");
 }

 static const __DRIconfig **
diff --git a/src/gallium/state_trackers/osmesa/osmesa.c
b/src/gallium/state_trackers/osmesa/osmesa.c
index 18f1b88128..8102be14ed 100644
--- a/src/gallium/state_trackers/osmesa/osmesa.c
+++ b/src/gallium/state_trackers/osmesa/osmesa.c
@@ -679,6 +679,7 @@ OSMesaCreateContextAttribs(const int *attribList,
OSMesaContext sharelist)
attribs.options.disable_shader_bit_encoding = FALSE;
attribs.options.force_s3tc_enable = FALSE;
attribs.options.force_glsl_version = 0;
+   attribs.options.override_glsl_version = 0;

osmesa_init_st_visual(,
  PIPE_FORMAT_R8G8B8A8_UNORM,
diff --git a/src/mesa/drivers/dri/common/drirc
b/src/mesa/drivers/dri/common/drirc
index 20fd8123e4..52c121a064 100644
--- a/src/mesa/drivers/dri/common/drirc
+++ b/src/mesa/drivers/dri/common/drirc
@@ -104,5 +104,9 @@ TODO: document the other workarounds.
 
 
 
+
+
+
+
 
 
diff --git a/src/mesa/drivers/dri/common/xmlpool/t_options.h
b/src/mesa/drivers/dri/common/xmlpool/t_options.h
index a189bbedec..fb9ecbe3e7 100644
--- a/src/mesa/drivers/dri/common/xmlpool/t_options.h
+++ b/src/mesa/drivers/dri/common/xmlpool/t_options.h
@@ -110,6 +110,11 @@ DRI_CONF_OPT_BEGIN_V(force_glsl_version, int,
def, "0:999") \
 DRI_CONF_DESC(en,gettext("Force a default GLSL version for
shaders that lack an explicit #version line")) \
 DRI_CONF_OPT_END

+#define DRI_CONF_OVERRIDE_GLSL_VERSION(def) \
+DRI_CONF_OPT_BEGIN_V(override_glsl_version, int, def, "0:999") \
+DRI_CONF_DESC(en,gettext("Override the GLSL version for apps
that require an explicit version")) \
+DRI_CONF_OPT_END
+
 #define DRI_CONF_ALLOW_GLSL_EXTENSION_DIRECTIVE_MIDSHADER(def) \
 DRI_CONF_OPT_BEGIN_B(allow_glsl_extension_directive_midshader, def) \
 DRI_CONF_DESC(en,gettext("Allow GLSL #extension directives in
the middle of shaders")) \
diff --git a/src/mesa/drivers/dri/i965/brw_context.c

Re: [Mesa-dev] [RFC] EGL extension for additional DRM_BUFFER_FORMATs

2017-02-06 Thread Dave Airlie
>
>>
>> On 26.01.2017 12:50, Nicolai Hähnle wrote:
>> > Hi all,
>> >
>> > this is mostly motivated by the need to support more screen depths than
>> > just 24/32-bit RGB in Glamor. The extension is simple enough, just adding
>> > three more enums that are accepted.
>> >
>> > I _think_ every DRI driver that exposes EGL_MESA_drm_image should be able
>> > to support this new extension as well, since EGL_MESA_drm_image requires
>> > DRI image version 10 to be enabled, and the corresponding
>> > __DRI_IMAGE_FORMAT_* values have been there since DRI image version 5, but
>> > do let me know if that thinking is wrong.
>> >
>> > I'd like to land at least the first patch relatively quickly, to avoid 
>> > future
>> > enum clashes. Internally, we had already accidentally used an enum that is
>> > used by one of the WL extensions, since those are not in the EGL 
>> > registry...
>> >
>> > Please review / provide feedback!

I just saw this, EGL_MESA_drm_image is really not a good place to start,

we have two specs instead,
EGL_EXT_image_dma_buf_import.
EGL_MESA_image_dma_buf_export

does one of those not cover this?

Dave.
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Marek Olšák
On Mon, Feb 6, 2017 at 8:20 PM, Ernst Sjöstrand  wrote:
> FYI glmark2 segfaults with mesa_glthread=true. Expected that some programs
> will segfault?

Yes, even segfaults are expected with mesa_glthread=true.

Marek
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 14/34] gbm: Get modifiers from DRI

2017-02-06 Thread Daniel Stone
Hi,

On 6 February 2017 at 19:22, Jason Ekstrand  wrote:
> On Sun, Feb 5, 2017 at 1:15 PM, Ben Widawsky  wrote:
>> Introducing the LINEAR modifier (which happened after v2 of this series) did
>> make things complex because it's possible in some horrific future that a 
>> image
>> doesn't support linear. As a result, you are correct. I think for this case, 
>> the
>> client can handle it pretty easily, and returning INVALID is the right
>> thing to do.
>>
>> Daniel, are you okay with changing this to return DRM_FORMAT_MOD_INVALID?

Hm, it's a little less clean, but sure, works for me.

>> Yeah, this is also a lie but way trickier than the above. Again before this 
>> rev
>> of the series, 0 meant DRM_FORMAT_MOD_NONE, and that was actually legit,
>> however, now it does mean LINEAR. I believe it's safe to assume that all dumb
>> BOs are linear, but it should probably be baked in somewhere better. One 
>> option
>> would be to create a proper DRIimage for a dumb BO, but I think the best bet 
>> is
>> to just replace 0 with DRM_FORMAT_MOD_LINEAR.
>
> That sounds fairly reasonable to me.  I guess someone could create a BO with
> GBM and then call the kernel ioctl to set the tiling mode to X-tiled and
> then ask what it has.  However, short of calling into the driver and having
> it query the kernel, I don't see a good way to get around that.  I think I'd
> be ok with just returning LINEAR and saying "don't do that".  Daniel?

That's impressively contrived, which is a polite way of saying deeply
stupid; wouldn't that break Mesa anyway? I'm happy to ban that.

Cheers,
Daniel
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH RFC 3/3] egl: add support for EGL_MESA_drm_image_formats

2017-02-06 Thread Eric Anholt
Nicolai Hähnle  writes:

> From: Nicolai Hähnle 
>
> XXX do we need a separate enable bit?

I don't think so -- the driver can take a normal error path when asked
to create an image, right?

So, if you write some more commit message on this one, the series will
get my r-b.  Maybe:

"This will allow X with Glamor to create DRM images for 16bpp displays.

No separate enable bit is used.  The extension doesn't guarantee that an
image can be created with the given format, it just allows the request
to be expressed."


signature.asc
Description: PGP signature
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH 14/34] gbm: Get modifiers from DRI

2017-02-06 Thread Jason Ekstrand
On Sun, Feb 5, 2017 at 1:15 PM, Ben Widawsky  wrote:

> On 17-01-31 12:38:44, Jason Ekstrand wrote:
>
>> On Mon, Jan 23, 2017 at 10:21 PM, Ben Widawsky  wrote:
>>
>> Replace the naive, 'save all the modifiers' with a proper query for just
>>> the modifier that was selected. To accomplish this, two new query tokens
>>> are added to the extension:
>>> __DRI_IMAGE_ATTRIB_MODIFIER_UPPER
>>> __DRI_IMAGE_ATTRIB_MODIFIER_LOWER
>>>
>>> The query extension only supported 32b queries, and modifiers are 64b,
>>> so we needed two of them.
>>>
>>> Yes>> NOTE: The extension version is still set to 12, so none of this
> will
>
> actually be called.
>>>
>>> v2: Use stored modifiers from create instead of queryImage
>>>
>>> v3: Make sure not to query modifiers for dumb buffers (Daniel)
>>> Fixed comments in functions.
>>>
>>> Cc: Daniel Stone 
>>> Signed-off-by: Ben Widawsky 
>>> Reviewed-by: Eric Engestrom 
>>> Acked-by: Daniel Stone 
>>> ---
>>>  src/gbm/backends/dri/gbm_dri.c   | 37
>>> 
>>>  src/gbm/gbm-symbols-check|  1 +
>>>  src/gbm/main/gbm.c   | 19 
>>>  src/gbm/main/gbm.h   |  3 +++
>>>  src/gbm/main/gbmint.h|  5 +
>>>  src/mesa/drivers/dri/i965/intel_screen.c |  6 ++
>>>  6 files changed, 58 insertions(+), 13 deletions(-)
>>>
>>> diff --git a/src/gbm/backends/dri/gbm_dri.c
>>> b/src/gbm/backends/dri/gbm_dri
>>> .c
>>> index a777f1a984..d5b458aa38 100644
>>> --- a/src/gbm/backends/dri/gbm_dri.c
>>> +++ b/src/gbm/backends/dri/gbm_dri.c
>>> @@ -38,6 +38,7 @@
>>>  #include 
>>>  #include 
>>>  #include 
>>> +#include 
>>>
>>>  #include  /* dri_interface needs GL types */
>>>  #include 
>>> @@ -732,6 +733,32 @@ gbm_dri_bo_get_offset(struct gbm_bo *_bo, int plane)
>>> return (uint32_t)offset;
>>>  }
>>>
>>> +static uint64_t
>>> +gbm_dri_bo_get_modifier(struct gbm_bo *_bo)
>>> +{
>>> +   struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
>>> +   struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
>>> +
>>> +   if (!dri->image || dri->image->base.version < 14) {
>>> +  errno = ENOSYS;
>>> +  return 0;
>>>
>>>
>> Do we want to return the invalid modifier in the error case?  I thought 0
>> was "linear"
>>
>>
>>
> Introducing the LINEAR modifier (which happened after v2 of this series)
> did
> make things complex because it's possible in some horrific future that a
> image
> doesn't support linear. As a result, you are correct. I think for this
> case, the
> client can handle it pretty easily, and returning INVALID is the right
> thing to
> do.
>
> Daniel, are you okay with changing this to return DRM_FORMAT_MOD_INVALID?
>
> +   }
>>> +
>>> +   /* Dumb buffers have no modifiers */
>>> +   if (!bo->image)
>>> +  return 0;
>>>
>>>
>> Same here.  I'm not really sure that this is an error, but saying it's
>> linear might be a lie.  I guess this is a static function so maybe it
>> doesn't matter?
>>
>>
> Yeah, this is also a lie but way trickier than the above. Again before
> this rev
> of the series, 0 meant DRM_FORMAT_MOD_NONE, and that was actually legit,
> however, now it does mean LINEAR. I believe it's safe to assume that all
> dumb
> BOs are linear, but it should probably be baked in somewhere better. One
> option
> would be to create a proper DRIimage for a dumb BO, but I think the best
> bet is
> to just replace 0 with DRM_FORMAT_MOD_LINEAR.
>

That sounds fairly reasonable to me.  I guess someone could create a BO
with GBM and then call the kernel ioctl to set the tiling mode to X-tiled
and then ask what it has.  However, short of calling into the driver and
having it query the kernel, I don't see a good way to get around that.  I
think I'd be ok with just returning LINEAR and saying "don't do that".
Daniel?

--Jason


>
>> +
>>> +   uint64_t ret = 0;
>>> +   int mod;
>>> +   dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_MODIFIER_UPPER,
>>> );
>>> +   ret = (uint64_t)mod << 32;
>>> +
>>> +   dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_MODIFIER_LOWER,
>>> );
>>> +   ret |= mod;
>>> +
>>> +   return ret;
>>> +}
>>> +
>>>  static void
>>>  gbm_dri_bo_destroy(struct gbm_bo *_bo)
>>>  {
>>> @@ -1074,15 +1101,6 @@ gbm_dri_bo_create(struct gbm_device *gbm,
>>> if (bo->image == NULL)
>>>goto failed;
>>>
>>> -   bo->base.base.modifiers = calloc(count, sizeof(*modifiers));
>>> -   if (count && !bo->base.base.modifiers) {
>>> -  dri->image->destroyImage(bo->image);
>>> -  goto failed;
>>> -   }
>>> -
>>> -   bo->base.base.count = count;
>>> -   memcpy(bo->base.base.modifiers, modifiers, count *
>>> sizeof(*modifiers));
>>> -
>>>
>>>
>> What's going on here?  Is this in the right patch?
>>
>>
>>
> Yes, but no. Originally all the modifiers were saved/stored at creation
> and I
> did something with the list at query time. 

Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Ernst Sjöstrand
FYI glmark2 segfaults with mesa_glthread=true. Expected that some programs
will segfault?

ATTENTION: default value of option mesa_glthread overridden by environment.
[New Thread 0x7fffed73d700 (LWP 23060)]
_mesa_glthread_init
===
glmark2 2014.03
===
OpenGL Information
GL_VENDOR: X.Org
GL_RENDERER:   Gallium 0.4 on AMD FIJI (DRM 3.9.0 / 4.10.0-rc3+, LLVM
5.0.0)
GL_VERSION:3.0 Mesa 17.1.0-devel (git-c91d721)
===
[New Thread 0x7fffecf3c700 (LWP 23061)]
_mesa_glthread_init
_mesa_glthread_destroy
[Thread 0x7fffed73d700 (LWP 23060) exited]

Thread 1 "glmark2" received signal SIGSEGV, Segmentation fault.

Here's the backtrace:
http://pastebin.com/0FrM0Q0A

Regards
//Ernst


2017-02-06 1:11 GMT+01:00 Marek Olšák :

> Hi,
>
> Back in 2012-2013, then-Intel employees Eric Anholt and Paul Berry
> wrote this threaded GL dispatch where GL calls are queued and executed
> in a different thread. It was supposed to deal with high CPU overhead
> of Mesa, but at the time most games used the compatibility profile and
> Steam didn't really exist on Linux, so it didn't help many (if any)
> apps.
>
> Things are different today. We have Steam and most games use the GL
> core profile. We know of several games that have better performance
> with glthread, namely Borderlands 2, and some people reported to me
> that some other games also benefit. It's about time we put this into
> mainline Mesa.
>
> My plan is that we merge it as-is or with minor changes, and then
> we'll clean it up and improve it while it's in master. It's disabled
> by default, so it shouldn't bother anyone who doesn't want it. There
> is a drirc option to turn it on (just use the corresponding env var).
> All Gallium drivers support it.
>
> A note on synchronizations. Borderlands 2 has 170 thread syncs per
> frame. That means the app thread has to stop and wait 170x per frame.
> Despite that, it still has 70% higher performance in some cases. My
> theory is that if you have a lot of draw calls, you can have a lot of
> syncs, because the sheer amount of draw calls will just make those
> syncs irrelevant. 200 syncs per 4k draw calls is like 1 sync per 20
> draw calls.
>
> Here it is: https://cgit.freedesktop.org/~mareko/mesa/log/?h=glthread
>
> The plan is to merge everything up to the gallium commit (without the
> Intel commits, I'll let Intel decide what to do with them). I can send
> the whole series to the list if that's preferable.
>
> Opinions?
>
> Marek
> ___
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] [PATCH v3] gbm: Export a per plane getter for stride

2017-02-06 Thread Jason Ekstrand
On Sun, Feb 5, 2017 at 8:16 PM, Ben Widawsky  wrote:

> v2: Preserve legacy behavior when plane is 0 (Jason Ekstrand)
> EINVAL when input plane is greater than total planes (Jason Ekstrand)
> Don't leak the image after fromPlanar (Daniel)
> Move bo->image check below plane count preventing bad index succeeding
> (Daniel)
>
> v3: Fix DRIimage leak (using Jason's recommended change)
> Make plane 0 return planar stride. This might break legacy behavior (Jason)
>
> Cc: Jason Ekstrand 
> Signed-off-by: Ben Widawsky 
> Reviewed-by: Eric Engestrom  (v1)
> Acked-by: Daniel Stone 
>
> make plane 0 with multi plane be normal (Jason)
> ---
>  src/gbm/backends/dri/gbm_dri.c | 45 ++
> ++--
>  src/gbm/gbm-symbols-check  |  1 +
>  src/gbm/main/gbm.c | 15 +-
>  src/gbm/main/gbm.h |  3 +++
>  4 files changed, 57 insertions(+), 7 deletions(-)
>
> diff --git a/src/gbm/backends/dri/gbm_dri.c b/src/gbm/backends/dri/gbm_
> dri.c
> index 3d9c540d95..ecba3ead5a 100644
> --- a/src/gbm/backends/dri/gbm_dri.c
> +++ b/src/gbm/backends/dri/gbm_dri.c
> @@ -648,20 +648,53 @@ gbm_dri_bo_get_handle_for_plane(struct gbm_bo *_bo,
> int plane)
> }
>
> __DRIimage *image = dri->image->fromPlanar(bo->image, plane, NULL);
> -   if (!image) {
> -  /* Use the parent's handle */
> -  image = bo->image;
> +   if (image) {
> +  dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_HANDLE, );
> +  dri->image->destroyImage(image);
> +   } else {
> +  dri->image->queryImage(bo->image, __DRI_IMAGE_ATTRIB_HANDLE,
> );
> }
>
> -   dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_HANDLE, );
> -
>

Wrong patch?


> return ret;
>  }
>
>  static uint32_t
>  gbm_dri_bo_get_stride(struct gbm_bo *_bo, int plane)
>  {
> -   return _bo->stride;
> +   struct gbm_dri_device *dri = gbm_dri_device(_bo->gbm);
> +   struct gbm_dri_bo *bo = gbm_dri_bo(_bo);
> +   __DRIimage *image;
> +   int stride = 0;
> +
> +   if (!dri->image || dri->image->base.version < 11 ||
> !dri->image->fromPlanar) {
> +  /* Preserve legacy behavior if plane is 0 */
> +  if (plane == 0)
> + return _bo->stride;
> +
> +  errno = ENOSYS;
> +  return 0;
> +   }
> +
> +   if (plane >= get_number_planes(dri, bo->image)) {
> +  errno = EINVAL;
> +  return 0;
> +   }
> +
> +   if (bo->image == NULL)
> +  return _bo->stride;
> +
> +   image = dri->image->fromPlanar(bo->image, plane, NULL);
> +   if (!image) {
> +  /* Use the parent stride */
> +  image = bo->image;
> +   }
> +
> +   dri->image->queryImage(image, __DRI_IMAGE_ATTRIB_STRIDE, );
> +
> +   if (image != bo->image)
> +  dri->image->destroyImage(image);
> +
> +   return (uint32_t)stride;
>  }
>
>  static void
> diff --git a/src/gbm/gbm-symbols-check b/src/gbm/gbm-symbols-check
> index 1e6dd4d3ec..459006a63f 100755
> --- a/src/gbm/gbm-symbols-check
> +++ b/src/gbm/gbm-symbols-check
> @@ -14,6 +14,7 @@ gbm_bo_unmap
>  gbm_bo_get_width
>  gbm_bo_get_height
>  gbm_bo_get_stride
> +gbm_bo_get_stride_for_plane
>  gbm_bo_get_format
>  gbm_bo_get_device
>  gbm_bo_get_handle
> diff --git a/src/gbm/main/gbm.c b/src/gbm/main/gbm.c
> index 7462e90c4c..0a9f0bef7e 100644
> --- a/src/gbm/main/gbm.c
> +++ b/src/gbm/main/gbm.c
> @@ -165,7 +165,20 @@ gbm_bo_get_height(struct gbm_bo *bo)
>  GBM_EXPORT uint32_t
>  gbm_bo_get_stride(struct gbm_bo *bo)
>  {
> -   return bo->gbm->bo_get_stride(bo, 0);
> +   return gbm_bo_get_stride_for_plane(bo, 0);
> +}
> +
> +/** Get the stride for the given plane
> + *
> + * \param bo The buffer object
> + * \param plane for which you want the stride
> + *
> + * \sa gbm_bo_get_stride()
> + */
> +GBM_EXPORT uint32_t
> +gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane)
> +{
> +   return bo->gbm->bo_get_stride(bo, plane);
>  }
>
>  /** Get the format of the buffer object
> diff --git a/src/gbm/main/gbm.h b/src/gbm/main/gbm.h
> index 67548206c4..1719c5312a 100644
> --- a/src/gbm/main/gbm.h
> +++ b/src/gbm/main/gbm.h
> @@ -304,6 +304,9 @@ uint32_t
>  gbm_bo_get_stride(struct gbm_bo *bo);
>
>  uint32_t
> +gbm_bo_get_stride_for_plane(struct gbm_bo *bo, int plane);
> +
> +uint32_t
>  gbm_bo_get_format(struct gbm_bo *bo);
>
>  struct gbm_device *
> --
> 2.11.1
>
>
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


Re: [Mesa-dev] Time to merge threaded GL dispatch? (aka glthread)

2017-02-06 Thread Eric Anholt
Marek Olšák  writes:

> Yes, I'm aware that glthread is far from perfect. However, I don't consider
> that an issue. My idea is that the actual work will take place in master. I
> have zero faith that any work on that will take place outside of master.

Yeah.  Now that there's some evidence it's useful, let's work on getting
it merged and then fix it up more once it's in tree.


signature.asc
Description: PGP signature
___
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev


  1   2   >