mesa.git
7 years agoi965: Fix number of slots in SSO mode when there are no user varyings.
Kenneth Graunke [Tue, 29 Nov 2016 00:59:45 +0000 (16:59 -0800)]
i965: Fix number of slots in SSO mode when there are no user varyings.

We want vue_map->num_slots to be one more than the final slot.

When assigning fixed slots, built-in slots, and non-SSO user varyings,
we do slot++.  This leaves "slot" as one past the most recently assigned
slot.  But for SSO user varyings, we computed slot based on the varying
location value...and left it at that slot value.

To work around this inconsistency, I made num_slots be "slot + 1" if
separate and "slot" otherwise.  The problem is...if there are no user
varyings in SSO mode...then we would have done slot++ when assigning
built-ins, so it would be off by one.  This resulted in loops from 0
to vue_map->num_slots hitting a bonus BRW_VARYING_SLOT_PAD at the end.

This used to break the SIMD8 VS/TES backends, but I fixed that in
commit 480d6c1653713dcae617ac523b2ca5deee01c845.  It's probably safe
at this point, but we should fix it anyway.

To fix this, do slot++ in all cases.  For SSO mode, we overwrite slot
for every varying, so this increment only matters on the last varying.
Because we process varyings in order, this will set slot to 1 more
than the highest assigned slot.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
7 years agospirv: Move cursor before calling vtn_ssa_value() in phi 2nd pass.
Kenneth Graunke [Mon, 9 Jan 2017 07:03:25 +0000 (23:03 -0800)]
spirv: Move cursor before calling vtn_ssa_value() in phi 2nd pass.

vtn_ssa_value() can produce variable loads, and the cursor might
be after a return statement, causing nir_builder assert failures
about not inserting instructions after a jump.

This fixes:
dEQP-VK.spirv_assembly.instruction.graphics.barrier.in_if
dEQP-VK.spirv_assembly.instruction.graphics.barrier.in_switch

Cc: "13.0 12.0" <mesa-stable@lists.freedesktop.org>
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agomesa: set GLSL 1.20 for the fixed-function fragment shader
Marek Olšák [Sat, 7 Jan 2017 14:36:45 +0000 (15:36 +0100)]
mesa: set GLSL 1.20 for the fixed-function fragment shader

This fixes broken depth texturing after:

commit 22639a6e19f95902aef23474ad672bf489231ea7
Author: Timothy Arceri <timothy.arceri@collabora.com>
Date:   Mon Nov 21 00:29:29 2016 +1100

    st/mesa: get Version from gl_program rather than gl_shader_program

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
7 years agoradv: Create single RADV_DEBUG env var.
Bas Nieuwenhuizen [Mon, 2 Jan 2017 17:57:02 +0000 (18:57 +0100)]
radv: Create single RADV_DEBUG env var.

Also changed RADV_SHOW_QUEUES to a no compute queue option. That
would make more sense later when the compute queue is established,
but the transfer queue still experimental.

v2: Don't include the trace flag.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
7 years agoac/debug: Dump indirect buffers.
Bas Nieuwenhuizen [Sun, 1 Jan 2017 15:47:12 +0000 (16:47 +0100)]
ac/debug: Dump indirect buffers.

This is for handling chained command buffers and secondary command
buffers. It doesn't handle the trace id for secondary command buffers
yet, but I don't think that is possible in general with just writes,
as we could call a secondary command buffer multiple times.

I think this is good enough for now, as the most useful case is the
chaining when we grow an IB.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
7 years agoradv: Dump command buffer on hang.
Bas Nieuwenhuizen [Fri, 23 Dec 2016 22:51:18 +0000 (23:51 +0100)]
radv: Dump command buffer on hang.

v2:
  - Now use the filename specified by RADV_TRACE_FILE env var.
  - Use the same var to enable tracing.

I thought we could as well always set the filename explicitly
instead of having some arbitrary defaults, and at that point
we don't need a separate feature enable.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
7 years agoac/debug: Move IB decode to common code.
Bas Nieuwenhuizen [Sat, 24 Dec 2016 12:08:00 +0000 (13:08 +0100)]
ac/debug: Move IB decode to common code.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
7 years agoac/debug: Move sid_tables.h generation to common code.
Bas Nieuwenhuizen [Sat, 24 Dec 2016 10:53:41 +0000 (11:53 +0100)]
ac/debug: Move sid_tables.h generation to common code.

Signed-off-by: Bas Nieuwenhuizen <basni@google.com>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
7 years agorelnotes: Claim OpenGL 4.5 rather than 4.4
Jason Ekstrand [Sun, 8 Jan 2017 04:29:49 +0000 (20:29 -0800)]
relnotes: Claim OpenGL 4.5 rather than 4.4

Acked-by: Matt Turner <mattst88@gmail.com>
7 years agomesa: Bump the version to 17.0
Jason Ekstrand [Sun, 8 Jan 2017 04:26:12 +0000 (20:26 -0800)]
mesa: Bump the version to 17.0

Acked-by: Matt Turner <mattst88@gmail.com>
7 years agoradeonsi: fix the Witcher 2 black transitions
Marek Olšák [Tue, 3 Jan 2017 19:12:28 +0000 (20:12 +0100)]
radeonsi: fix the Witcher 2 black transitions

v2: do it properly

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

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: set si_shader_context::input_decls for ranged decls correctly
Marek Olšák [Tue, 3 Jan 2017 19:03:37 +0000 (20:03 +0100)]
radeonsi: set si_shader_context::input_decls for ranged decls correctly

This has no effect because no code uses those members with ranged decls.

Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: cleanly communicate whether si_shader_dump should check R600_DEBUG
Marek Olšák [Tue, 3 Jan 2017 13:19:37 +0000 (14:19 +0100)]
radeonsi: cleanly communicate whether si_shader_dump should check R600_DEBUG

Tested-by: Edmondo Tommasina <edmondo.tommasina@gmail.com>
Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoisl: render target cube maps should be handled as 2D images, not cubes
Iago Toral Quiroga [Fri, 6 Jan 2017 11:29:45 +0000 (12:29 +0100)]
isl: render target cube maps should be handled as 2D images, not cubes

This fixes layered rendering Vulkan CTS tests with cube (arrays). We
also do this in the GL driver, see this code from gen8_depth_state.c
for example:

case GL_TEXTURE_CUBE_MAP_ARRAY:
case GL_TEXTURE_CUBE_MAP:
   /* The PRM claims that we should use BRW_SURFACE_CUBE for this
    * situation, but experiments show that gl_Layer doesn't work when we do
    * this.  So we use BRW_SURFACE_2D, since for rendering purposes this is
    * equivalent.
    */
   surftype = BRW_SURFACE_2D;
   depth *= 6;
   break;

So I guess we simply forgot to port this workaround to Vulkan.

v2: tweak the conditions so the special case is cube texture sampling
    rather than anything else (Jason)

Fixes:
dEQP-VK.geometry.layered.cube*

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoanv: don't skip the VUE header if we are reading gl_Layer in a fragment shader
Iago Toral Quiroga [Thu, 5 Jan 2017 12:17:53 +0000 (13:17 +0100)]
anv: don't skip the VUE header if we are reading gl_Layer in a fragment shader

This is the same we do in the GL driver: the hardware provides gl_Layer
in the VUE header, so when the fragment shader reads it we can't skip it.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoanv: enable shaderFloat64 feature
Samuel Iglesias Gonsálvez [Thu, 10 Nov 2016 09:06:48 +0000 (10:06 +0100)]
anv: enable shaderFloat64 feature

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoanv: enable float64 feature on supported platforms
Samuel Iglesias Gonsálvez [Wed, 4 Jan 2017 12:11:35 +0000 (13:11 +0100)]
anv: enable float64 feature on supported platforms

v2:
- Remove image_ms_array initialization (Jason)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: enable SpvCapabilityFloat64 only to supported platforms
Samuel Iglesias Gonsálvez [Wed, 4 Jan 2017 08:35:36 +0000 (09:35 +0100)]
spirv: enable SpvCapabilityFloat64 only to supported platforms

v2 (Jason):
- Use nir_spirv_supported_extensions to check if the feature is enabled.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir/i965: use two slots from inputs_read for dvec3/dvec4 vertex input attributes
Juan A. Suarez Romero [Fri, 16 Dec 2016 09:24:43 +0000 (10:24 +0100)]
nir/i965: use two slots from inputs_read for dvec3/dvec4 vertex input attributes

So far, input_reads was a bitmap tracking which vertex input locations
were being used.

In OpenGL, an attribute bigger than a vec4 (like a dvec3 or dvec4)
consumes just one location, any other small attribute. So we mark the
proper bit in inputs_read, and also the same bit in double_inputs_read
if the attribute is a dvec3/dvec4.

But in Vulkan, this is slightly different: a dvec3/dvec4 attribute
consumes two locations, not just one. And hence two bits would be marked
in inputs_read for the same vertex input attribute.

To avoid handling two different situations in NIR, we just choose the
latest one: in OpenGL, when creating NIR from GLSL/IR, any dvec3/dvec4
vertex input attribute is marked with two bits in the inputs_read bitmap
(and also in the double_inputs_read), and following attributes are
adjusted accordingly.

As example, if in our GLSL/IR shader we have three attributes:

layout(location = 0) vec3  attr0;
layout(location = 1) dvec4 attr1;
layout(location = 2) dvec3 attr2;

then in our NIR shader we put attr0 in location 0, attr1 in locations 1
and 2, and attr2 in location 3 and 4.

Checking carefully, basically we are using slots rather than locations
in NIR.

When emitting the vertices, we do a inverse map to know the
corresponding location for each slot.

v2 (Jason):
- use two slots from inputs_read for dvec3/dvec4 NIR from GLSL/IR.

v3 (Jason):
- Fix commit log error.
- Use ladder ifs and fix braces.
- elements_double is divisible by 2, don't need DIV_ROUND_UP().
- Use if ladder instead of a switch.
- Add comment about hardware restriction in 64bit vertex attributes.

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoisl: fix VA64 support for double and dvecN vertex attributes
Samuel Iglesias Gonsálvez [Tue, 15 Nov 2016 11:49:38 +0000 (12:49 +0100)]
isl: fix VA64 support for double and dvecN vertex attributes

We use *64*_PASSTHRU formats to upload vertex attributes of 64 bits
to avoid conversions. From the BDW PRM, Volume 2d, page 586
(VERTEX_ELEMENT_STATE):

     "When SourceElementFormat is set to one of the *64*_PASSTHRU
     formats, 64-bit components are stored in the URB without any
     conversion. In this case, vertex elements must be written as 128
     or 256 bits, with VFCOMP_STORE_0 being used to pad the output
     as required. E.g., if R64_PASSTHRU is used to copy a 64-bit Red
     component into the URB, Component 1 must be specified as
     VFCOMP_STORE_0 (with Components 2,3 set to VFCOMP_NOSTORE)
     in order to output a 128-bit vertex element, or Components 1-3 must
     be specified as VFCOMP_STORE_0 in order to output a 256-bit vertex
     element. Likewise, use of R64G64B64_PASSTHRU requires Component 3
     to be specified as VFCOMP_STORE_0 in order to output a 256-bit vertex
     element."

v2,v3 (Jason):
- Don't delete unused formats.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoanv/pipeline: get map for double input attributes
Juan A. Suarez Romero [Tue, 15 Nov 2016 16:57:30 +0000 (16:57 +0000)]
anv/pipeline: get map for double input attributes

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add support for doubles to OpSpecConstant
Samuel Iglesias Gonsálvez [Mon, 14 Nov 2016 11:08:32 +0000 (12:08 +0100)]
spirv: add support for doubles to OpSpecConstant

v2 (Jason):
- Fix indent in radv change
- Add vtn_u64_literal() helper to take 64 bits (Jason)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv/nir: add (un)packDouble2x32() translation
Samuel Iglesias Gonsálvez [Thu, 10 Nov 2016 09:37:40 +0000 (10:37 +0100)]
spirv/nir: add (un)packDouble2x32() translation

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv/nir: implement DF conversions
Samuel Iglesias Gonsálvez [Wed, 7 Dec 2016 07:10:16 +0000 (08:10 +0100)]
spirv/nir: implement DF conversions

SPIR-V does not have special opcodes for DF conversions. We need to identify
them by checking the bit size of the operand and the result.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir: add nir_type_conversion_op()
Samuel Iglesias Gonsálvez [Wed, 7 Dec 2016 07:34:42 +0000 (08:34 +0100)]
nir: add nir_type_conversion_op()

This function returns the nir_op corresponding to the conversion between
the given nir_alu_type arguments.

This function lacks support for integer-based types with bit_size != 32
and for float16 conversion ops.

v2:
- Improve readiness of the code and delete cases that don't happen now (Jason)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir: add nir_get_nir_type_for_glsl_type()
Samuel Iglesias Gonsálvez [Wed, 7 Dec 2016 07:34:02 +0000 (08:34 +0100)]
nir: add nir_get_nir_type_for_glsl_type()

v2 (Jason):
- Refactor nir_get_nir_type_for_glsl_type() to avoid using unneeded helpers (Jason)

v3:
- Use return directly (Jason)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add support for doubles on OpComposite{Insert,Extract}
Samuel Iglesias Gonsálvez [Thu, 10 Nov 2016 11:11:03 +0000 (12:11 +0100)]
spirv: add support for doubles on OpComposite{Insert,Extract}

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: Enable double floating points when copying variables in _vtn_variable_copy()
Samuel Iglesias Gonsálvez [Thu, 10 Nov 2016 11:07:53 +0000 (12:07 +0100)]
spirv: Enable double floating points when copying variables in _vtn_variable_copy()

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add double support to _vtn_block_load_store()
Samuel Iglesias Gonsálvez [Thu, 10 Nov 2016 09:07:09 +0000 (10:07 +0100)]
spirv: add double support to _vtn_block_load_store()

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add double support to _vtn_variable_load_store
Samuel Iglesias Gonsálvez [Tue, 8 Nov 2016 15:55:46 +0000 (16:55 +0100)]
spirv: add double support to _vtn_variable_load_store

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add double support to SpvOpCompositeExtract
Samuel Iglesias Gonsálvez [Mon, 21 Nov 2016 15:19:13 +0000 (16:19 +0100)]
spirv: add double support to SpvOpCompositeExtract

v2 (Jason):
- Add asserts.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: fix SpvOpSpecConstantOp with SpvOpVectorShuffle working with double-based...
Samuel Iglesias Gonsálvez [Mon, 21 Nov 2016 15:13:46 +0000 (16:13 +0100)]
spirv: fix SpvOpSpecConstantOp with SpvOpVectorShuffle working with double-based vecs

We need to pick two 32-bit values per component to perform the right shuffle operation.

v2 (Jason):
- Add assert to check matching bit sizes (Jason)
- Simplify the code to pick components (Jason)

v3:
- Switch on bit_size once (Jason)
- Add comment to explain the constant value for unused components (Erik)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add DF support to SpvOp*ConstantComposite
Samuel Iglesias Gonsálvez [Mon, 21 Nov 2016 15:33:08 +0000 (16:33 +0100)]
spirv: add DF support to SpvOp*ConstantComposite

v2 (Jason):
- Add assert.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add DF support to vtn_const_ssa_value()
Samuel Iglesias Gonsálvez [Mon, 21 Nov 2016 15:32:24 +0000 (16:32 +0100)]
spirv: add DF support to vtn_const_ssa_value()

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add support for loading DF constants
Samuel Iglesias Gonsálvez [Mon, 21 Nov 2016 15:30:47 +0000 (16:30 +0100)]
spirv: add support for loading DF constants

v2 (Jason):
- Add assert.

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: add definition of double based data types
Samuel Iglesias Gonsálvez [Tue, 8 Nov 2016 15:45:37 +0000 (16:45 +0100)]
spirv: add definition of double based data types

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agospirv: fix typo in spec_constant_decoration_cb()
Samuel Iglesias Gonsálvez [Mon, 14 Nov 2016 09:04:48 +0000 (10:04 +0100)]
spirv: fix typo in spec_constant_decoration_cb()

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoradv: drop unused fields in physical device.
Dave Airlie [Tue, 13 Dec 2016 03:55:04 +0000 (13:55 +1000)]
radv: drop unused fields in physical device.

Signed-off-by: Dave Airlie <airlied@redhat.com>
7 years agoi965: call intel_prepare_render always when reading pixels
Tapani Pälli [Thu, 5 Jan 2017 11:40:35 +0000 (13:40 +0200)]
i965: call intel_prepare_render always when reading pixels

Currently we do this only in the fallback code (when tiled memcpy
version failed) but it needs to be done always so that we have
correct read and write buffer in place. No regressions seen in CI.

Fixes:
dEQP-EGL.functional.buffer_age.*

Signed-off-by: Tapani Pälli <tapani.palli@intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=98330
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Chad Versace <chadversary@chromium.org>
7 years agost/mesa: pass gl_program to st_bind_ubos()
Timothy Arceri [Wed, 9 Nov 2016 03:00:22 +0000 (14:00 +1100)]
st/mesa: pass gl_program to st_bind_ubos()

We no longer need anything from gl_linked_shader.

Reviewed-by: Eric Anholt <eric@anholt.net>
7 years agost/mesa: pass gl_program to st_bind_images()
Timothy Arceri [Wed, 9 Nov 2016 02:41:50 +0000 (13:41 +1100)]
st/mesa: pass gl_program to st_bind_images()

We no longer need anything from gl_linked_shader.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agost/mesa: stop passing gl_linked_shader to set_affected_state_flags()
Timothy Arceri [Wed, 9 Nov 2016 02:37:39 +0000 (13:37 +1100)]
st/mesa: stop passing gl_linked_shader to set_affected_state_flags()

We now get everything we need from the gl_program param.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agost/mesa/glsl: set num_images directly in shader_info
Timothy Arceri [Wed, 9 Nov 2016 02:35:11 +0000 (13:35 +1100)]
st/mesa/glsl: set num_images directly in shader_info

This change also removes the now duplicate NumImages field.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agost/mesa: pass gl_program to st_bind_ssbos()
Timothy Arceri [Wed, 9 Nov 2016 00:57:33 +0000 (11:57 +1100)]
st/mesa: pass gl_program to st_bind_ssbos()

We no longer need to pass gl_shader_program.

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agonir: add another comparison simplification
Timothy Arceri [Wed, 4 Jan 2017 05:21:34 +0000 (16:21 +1100)]
nir: add another comparison simplification

On BDW:

total instructions in shared programs: 13061877 -> 13060965 (-0.01%)
instructions in affected programs: 133569 -> 132657 (-0.68%)
helped: 566
HURT: 0

total cycles in shared programs: 256611784 -> 256599536 (-0.00%)
cycles in affected programs: 861016 -> 848768 (-1.42%)
helped: 379
HURT: 73

Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir: Turn bcsel of +/- 1.0 and 0.0 into b2f sequences.
Kenneth Graunke [Tue, 9 Aug 2016 08:44:38 +0000 (01:44 -0700)]
nir: Turn bcsel of +/- 1.0 and 0.0 into b2f sequences.

On BDW:

total instructions in shared programs: 13074882 -> 13068703 (-0.05%)
instructions in affected programs: 1823116 -> 1816937 (-0.34%)
helped: 4187
HURT: 537

total cycles in shared programs: 256622718 -> 256425382 (-0.08%)
cycles in affected programs: 123790120 -> 123592784 (-0.16%)
helped: 3823
HURT: 2037

total spills in shared programs: 15276 -> 14929 (-2.27%)
spills in affected programs: 9446 -> 9099 (-3.67%)
helped: 352
HURT: 1

total fills in shared programs: 20496 -> 20144 (-1.72%)
fills in affected programs: 13040 -> 12688 (-2.70%)
helped: 352
HURT: 1

LOST:   2
GAINED: 21

v2: Rely on 'a' being a well-formed boolean (Connor, Eric).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir: Convert ineg(b2i(a)) to a if it's a boolean.
Kenneth Graunke [Tue, 9 Aug 2016 00:05:18 +0000 (17:05 -0700)]
nir: Convert ineg(b2i(a)) to a if it's a boolean.

On BDW:

total instructions in shared programs: 13071119 -> 13070371 (-0.01%)
instructions in affected programs: 83424 -> 82676 (-0.90%)
helped: 505
HURT: 45 (all TCS, all hurt by a single instruction)

total cycles in shared programs: 256601322 -> 256588932 (-0.00%)
cycles in affected programs: 819410 -> 807020 (-1.51%)
helped: 450
HURT: 57

total loops in shared programs: 2950 -> 2942 (-0.27%)
loops in affected programs: 8 -> 0
helped: 7
HURT: 0

v2: Drop unnecessary 'a@bool' annotation (Connor, Eric).
    Add a comment explaining the rule (Ian).

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> [v1]
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Matt Turner <mattst88@gmail.com>
7 years agoi965: Move TES input VUE map calculation out a layer.
Kenneth Graunke [Mon, 7 Mar 2016 23:46:47 +0000 (15:46 -0800)]
i965: Move TES input VUE map calculation out a layer.

In Vulkan, we'll compile the TCS and TES at the same time, so I can just
pass the TCS output VUE map to brw_compile_tes as the TES input VUE map.

So, we only need to do this in GL.  Move it to the GL-specific layer.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoi965: Pass NULL for gl_program when compiling TES.
Kenneth Graunke [Thu, 25 Feb 2016 19:55:23 +0000 (11:55 -0800)]
i965: Pass NULL for gl_program when compiling TES.

This isn't needed, and Vulkan doesn't have one.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoi965: Move TES spacing/domain/topology setup to brw_compile_tes().
Kenneth Graunke [Mon, 26 Sep 2016 00:59:42 +0000 (17:59 -0700)]
i965: Move TES spacing/domain/topology setup to brw_compile_tes().

Moving this down a layer lets us share code between Vulkan and GL.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoi965: Access TES shader info via NIR.
Kenneth Graunke [Tue, 15 Nov 2016 06:17:44 +0000 (22:17 -0800)]
i965: Access TES shader info via NIR.

NIR exists in both GL and Vulkan, but gl_program is GL specific.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agomesa: Introduce a compiler enum for tessellation spacing.
Kenneth Graunke [Sun, 25 Sep 2016 00:59:55 +0000 (17:59 -0700)]
mesa: Introduce a compiler enum for tessellation spacing.

It feels weird using GL_* enums in a Vulkan driver.

v2: Fix the TESS_SPACING -> PIPE_TESS_SPACING conversion.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agocompiler: Change shader_info->tes.vertex_order into a ccw boolean.
Kenneth Graunke [Tue, 22 Nov 2016 22:43:57 +0000 (14:43 -0800)]
compiler: Change shader_info->tes.vertex_order into a ccw boolean.

The vertex order is either clockwise or counterclockwise.  We can just
store a "ccw" boolean rather than GLenum values.  I don't want to use
GLenums in a Vulkan driver, and even in GL a simple boolean works fine.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoanv/pipeline: Call NIR passes using NIR_PASS_V
Jason Ekstrand [Sat, 7 Jan 2017 01:22:56 +0000 (17:22 -0800)]
anv/pipeline: Call NIR passes using NIR_PASS_V

This lets us get validation without having to do it manually.

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoanv/pipeline: Only call remove_dead_variables once
Jason Ekstrand [Sat, 7 Jan 2017 01:25:35 +0000 (17:25 -0800)]
anv/pipeline: Only call remove_dead_variables once

It can handle multiple modes at a time now so there's no reason to call
it repeatedly.

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoRevert recent GLSL slot counting fiasco.
Kenneth Graunke [Sat, 7 Jan 2017 21:58:42 +0000 (13:58 -0800)]
Revert recent GLSL slot counting fiasco.

I apparently broke mark_whole_variable in ir_set_program_inouts.
It was passing a type that wasn't var->type, so the wrapper didn't
work out.  It's all broken, revert it and start over.

Fixes all kinds of things on other drivers.

Revert "glsl: Make is_fixed_function_array actually check for varyings."

This reverts commit 42699e12711668a142b7acf11c168cf4301c1295.

Revert "glsl: Mark whole variable used for ClipDistance and TessLevel*."

This reverts commit 5c580e64cc206ab160e1767c42e4d6c81f67da4d.

Revert "glsl: Override the # of varying slots for ClipDistance and TessLevel*."

This reverts commit 8b5749f65ac434961308ccb579fb8a816e4f29d5.

Revert "glsl: Create and use a new ir_variable::count_attribute_slots() wrapper."

This reverts commit 6aa5cb34d03765b7be8611aa516bc201bd337f73.

7 years agoglsl: Make is_fixed_function_array actually check for varyings.
Kenneth Graunke [Sat, 7 Jan 2017 20:55:17 +0000 (12:55 -0800)]
glsl: Make is_fixed_function_array actually check for varyings.

We can't check VARYING_SLOT_* locations until we've determined that
the variable is actually a varying.

Fixes assert failures in drivers which actually use this path,
such as radeonsi and i915.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99314
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
7 years agodrirc: Allow extension midshader for Divinity: Original Sin (EE)
Kai Wasserbäch [Sat, 7 Jan 2017 13:38:23 +0000 (14:38 +0100)]
drirc: Allow extension midshader for Divinity: Original Sin (EE)

See also <https://bugs.freedesktop.org/show_bug.cgi?id=93551#c27> where
this was first observed as a requirement.

Signed-off-by: Kai Wasserbäch <kai@dev.carbon-project.org>
Signed-off-by: Marek Olšák <marek.olsak@amd.com>
7 years agoglsl: fix opt_minmax redundancy checks against baserange
Timothy Arceri [Thu, 5 Jan 2017 23:26:24 +0000 (10:26 +1100)]
glsl: fix opt_minmax redundancy checks against baserange

Marking operations as redundant if they are equal to the base
range is fine when the tree structure is something like this:

        max
      /     \
     max     b
    /   \
   3    max
       /   \
      3     a

But the opt falls apart with a tree like this:

        max
     /       \
    max     max
   /   \   /   \
  3    a   b    3

The problem is that both branches are treated the same: descending in
the left branch will prune the constant, and then descending the right
branch will prune the constant there as well, because limits[0] wasn't
updated to take the change on the left branch into account, and so we
still get [3,\infty) as baserange.

In order to fix the bug we just disable the marking of redundant expressions
when they match the baserange.

NIR algebraic opt will clean up the first tree for anyway, hopefully
other backends are smart enough to do this also.

Cc: "13.0" <mesa-stable@lists.freedesktop.org>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoi965/compiler: Use the new nir_opt_copy_prop_vars pass
Jason Ekstrand [Sat, 10 Dec 2016 06:32:08 +0000 (22:32 -0800)]
i965/compiler: Use the new nir_opt_copy_prop_vars pass

We run this after nir_lower_vars_to_ssa so that as many load/store_var
intrinsics as possible before copy_prop_vars executes.  This is because the
pass isn't particularly efficient (it does a lot of linear walks of a
linked list) so we'd like as much of the work as possible to be done before
copy_prop_vars runs.

Shader DB results on Sky Lake:

   total instructions in shared programs: 12020290 -> 12013627 (-0.06%)
   instructions in affected programs: 26033 -> 19370 (-25.59%)
   helped: 16
   HURT: 13

   total cycles in shared programs: 137772848 -> 137549012 (-0.16%)
   cycles in affected programs: 6955660 -> 6731824 (-3.22%)
   helped: 217
   HURT: 237

   total loops in shared programs: 3208 -> 3208 (0.00%)
   loops in affected programs: 0 -> 0
   helped: 0
   HURT: 0

   total spills in shared programs: 4112 -> 4057 (-1.34%)
   spills in affected programs: 483 -> 428 (-11.39%)
   helped: 2
   HURT: 0

   total fills in shared programs: 5519 -> 5102 (-7.56%)
   fills in affected programs: 993 -> 576 (-41.99%)
   helped: 2
   HURT: 0

   LOST:   0
   GAINED: 0

Broadwell had similar results.  On older hardware, the impact isn't as
large because they don't advertise GL 4.5.  Of the hurt programs, all but
one are hurt by a single instruction and the one is hurt by 3 instructions.
All of the helped programs, on the other hand, are helped by at least 3
instructions and one kerbal space program shader is helped by 44.59%.

The real star of the show, however, is the Gl43CSDof synmark2 benchmark
which has two shaders which are cut by 28% and 40% and the over-all runtime
performance of the benchmark on my Sky Lake laptop is improved by around
25-30% (it's a bit hard to be exact due to thermal throttling).

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agonir: Add a local variable-based copy propagation pass
Jason Ekstrand [Sat, 10 Dec 2016 06:31:26 +0000 (22:31 -0800)]
nir: Add a local variable-based copy propagation pass

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agonir/builder: Add a helper for getting the most recently added instruction
Jason Ekstrand [Sat, 10 Dec 2016 20:00:12 +0000 (12:00 -0800)]
nir/builder: Add a helper for getting the most recently added instruction

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agonir/builder: Add a load_deref_var helper
Jason Ekstrand [Sat, 10 Dec 2016 19:32:29 +0000 (11:32 -0800)]
nir/builder: Add a load_deref_var helper

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agonir/dead_variables: Remove shader-local variables that are only written
Jason Ekstrand [Sat, 10 Dec 2016 03:37:12 +0000 (19:37 -0800)]
nir/dead_variables: Remove shader-local variables that are only written

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agonir/dead_variables: Removed shared variables when requested
Jason Ekstrand [Fri, 6 Jan 2017 23:33:35 +0000 (15:33 -0800)]
nir/dead_variables: Removed shared variables when requested

Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoanv/formats: Use the real format for B4G4R4A4_UNORM_PACK16 on gen8
Jason Ekstrand [Fri, 6 Jan 2017 20:50:47 +0000 (12:50 -0800)]
anv/formats: Use the real format for B4G4R4A4_UNORM_PACK16 on gen8

Because border color is handled pre-swizzle, when we move the alpha
channel around in the format, the OPAQUE_BLACK border colors don't work
correctly on B4G4R4A4_UNORM_PACK16 with the hack.  This fixes the
following Vulkan CTS tests on Broadwell:

dEQP-VK.pipeline.sampler.view_type.2d_array.format.b4g4r4a4_unorm_pack16.address_modes.all_mode_clamp_to_border_opaque_black
dEQP-VK.pipeline.sampler.view_type.1d_array.format.b4g4r4a4_unorm_pack16.address_modes.all_mode_clamp_to_border_opaque_black
dEQP-VK.pipeline.sampler.view_type.2d.format.b4g4r4a4_unorm_pack16.address_modes.all_mode_clamp_to_border_opaque_black
dEQP-VK.pipeline.sampler.view_type.1d.format.b4g4r4a4_unorm_pack16.address_modes.all_mode_clamp_to_border_opaque_black
dEQP-VK.pipeline.sampler.view_type.3d.format.b4g4r4a4_unorm_pack16.address_modes.all_mode_clamp_to_border_opaque_black

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "13.0" <mesa-stable@lists.freedesktop.org>
7 years agoisl: Mark A4B4G4R4_UNORM as supported on gen8
Jason Ekstrand [Fri, 6 Jan 2017 20:20:14 +0000 (12:20 -0800)]
isl: Mark A4B4G4R4_UNORM as supported on gen8

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
Cc: "13.0" <mesa-dev@lists.freedesktop.org>
7 years agoradv: fix depth transitions with layerCount = VK_REMAINING_ARRAY_LAYERS
Pierre-Loup A. Griffais [Fri, 6 Jan 2017 20:57:17 +0000 (12:57 -0800)]
radv: fix depth transitions with layerCount = VK_REMAINING_ARRAY_LAYERS

Interpreting layerCount literally would try to create billions of image
views in radv_process_depth_image_inplace().

Signed-off-by: Pierre-Loup A. Griffais <pgriffais@valvesoftware.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
7 years agoi965: Rework gl_TessLevel*[] handling to use NIR compact arrays.
Kenneth Graunke [Thu, 24 Nov 2016 09:50:10 +0000 (01:50 -0800)]
i965: Rework gl_TessLevel*[] handling to use NIR compact arrays.

Treating everything as scalar arrays allows us to drop a bunch of
special case input/output munging all throughout the backend.
Instead, we just need to remap the TessLevel components to the
appropriate patch URB header locations in remap_patch_urb_offsets().

We also switch to treating the TES input versions of these as ordinary
shader inputs rather than system values, as remap_patch_urb_offsets()
just makes everything work out without special handling.

This regresses one Piglit test:
arb_tessellation_shader-large-uniforms/GL_TESS_CONTROL_SHADER-array-at-limit

The compiler starts promoting the constant arrays assigned to gl_TessLevel*
to uniform arrays.  Since the shader also has a uniform array that uses
the maximum number of uniform components, this puts it over the uniform
component limit enforced by the linker.  This is arguably a bug in the
constant array promotion code (it should avoid pushing us over limits),
but is unlikely to penalize any real application.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoi965: Inline store_output helper in quads workaround code.
Kenneth Graunke [Wed, 14 Dec 2016 03:50:25 +0000 (19:50 -0800)]
i965: Inline store_output helper in quads workaround code.

It's only used in one place, it ignores the offset parameter currently,
and I want to add more parameters...at which point, passing in a bunch
of integers seems less obvious than writing it out.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agonir: Make glsl_to_nir compact scalar TessLevel arrays.
Kenneth Graunke [Tue, 6 Dec 2016 07:09:18 +0000 (23:09 -0800)]
nir: Make glsl_to_nir compact scalar TessLevel arrays.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoi965: Make unify_interfaces not spread VARYING_BIT_TESS_LEVEL_*.
Kenneth Graunke [Tue, 6 Dec 2016 10:45:52 +0000 (02:45 -0800)]
i965: Make unify_interfaces not spread VARYING_BIT_TESS_LEVEL_*.

This is harmless today because gl_TessLevelInner/Outer in the TES is
currently treated as system values.  However, when we move to treating
them as inputs, this would cause a bug: with no TCS present, it would
propagate TES reads of VARYING_SLOT_TESS_LEVEL into the VS output VUE
map slots.  This is totally bogus - those don't even exist in the VS.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoglsl: Support gl_TessLevelInner/Outer[] as TES input variables.
Kenneth Graunke [Tue, 6 Dec 2016 09:50:03 +0000 (01:50 -0800)]
glsl: Support gl_TessLevelInner/Outer[] as TES input variables.

Upcoming reworks in i965 are going to make it easy to handle this
like any other input.  Having it as a system value will just require
additional code for no benefit.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoglsl: Mark whole variable used for ClipDistance and TessLevel*.
Kenneth Graunke [Sun, 15 Nov 2015 12:22:10 +0000 (04:22 -0800)]
glsl: Mark whole variable used for ClipDistance and TessLevel*.

There's no point in trying to mark partial array access for
gl_ClipDistance, gl_TessLevelOuter, or gl_TessLevelInner - they're
special built-in variables that control fixed function hardware,
and will likely be used in an all-or-nothing fashion.

Since these arrays only occupy 1-2 varying slots, we have to avoid
our normal processing which increments the slot value by the array
index.

(I wrote this code before i965 switched from ir_set_program_inouts
to nir_shader_gather_info.  It's not used by anyone today, and I'm
not sure how valuable it is...the alternative to GLSL IR lowering
is NIR compact arrays, at which point you should use nir_gather_info.)

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoglsl: Override the # of varying slots for ClipDistance and TessLevel*.
Kenneth Graunke [Sun, 15 Nov 2015 12:37:50 +0000 (04:37 -0800)]
glsl: Override the # of varying slots for ClipDistance and TessLevel*.

Right now, this shouldn't have any effect, as all drivers use
LowerClipDist and LowerTessFactors to turn the float[] arrays into
vectors.

However, it should help make it possible for drivers to avoid that
lowering.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agoglsl: Create and use a new ir_variable::count_attribute_slots() wrapper.
Kenneth Graunke [Sun, 15 Nov 2015 12:32:52 +0000 (04:32 -0800)]
glsl: Create and use a new ir_variable::count_attribute_slots() wrapper.

This wraps glsl_type::count_attribute_slots(), but will soon contain a
couple of overrides for a couple of GLSL built-ins variables.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
7 years agogallium/radeon: use the internal clear_buffer callback to fix r600g
Marek Olšák [Fri, 6 Jan 2017 21:01:46 +0000 (22:01 +0100)]
gallium/radeon: use the internal clear_buffer callback to fix r600g

r600g doesn't set pipe_context::clear_buffer.

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

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
7 years agollvmpipe: do transpose/untwiddle after conversion for 8bit formats
Roland Scheidegger [Thu, 22 Dec 2016 02:55:17 +0000 (03:55 +0100)]
llvmpipe: do transpose/untwiddle after conversion for 8bit formats

Generally we should do tranpose after conversion, if the format has less than
32 bits per channel (if it has 32 bits, conversion is going to be a no-op
anyway...). This is obviously because there's less vectors to deal with.
Though the advantage for 16 bit formats isn't that big, and in fact with AVX
there isn't really any (as the 32bit unpacks can be done with 256bit, but
the smaller ones cannot, although that would change again with proper AVX2
support).
Only makes sense for 2d and not 1d cases. And to keep things easy, only handle
1,2 and 4 channels (rgbx is just fine).
For rgba unorm8 format the backend conversion sums up to these instruction
totals (not counting the movs for SSE2 due to 2-op syntax - generally every 2
unpacks need an additional mov).
                     SSE2                    AVX
transpose:           32 unpack               16 unpack
untwiddle:           0                       8 (128bit low/high permutes)
convert:             16 mul + 16 cvt         8 mul + 8 cvt
32->8bit:            12 pack                 8 (128bit extract) + 12 pack

When doing transpose/untwiddle afterwards we get:
convert:             16 mul + 16 cvt         8 mul + 8 cvt
32->8bit:            12 pack                 8 (128bit extract) + 12 pack
transpose/untwiddle  12 unpack               12 unpack

So for SSE2, this drops 20 unpacks (total instruction count 76->56)
whereas for AVX it replaces the 16 256bit unpacks with 8 128bit ones
and drops the 8 lo/hi permutes (in total 60->48). (Albeit to be fair,
the permutes could be dropped even when doing the transpose first,
they are extremely pointless but we'd need to be able to tell
lp_build_conv to reorder the vectors, for AVX2 we're going to need to
be able to tell lp_build_conv about ordering in any case.)

(With different ordering going into conversion, it would be possible
to do 4 unpacks + 4 pshufbs instead of 12 unpacks, but that might not
be better, and not all cpus can do it. Proper AVX2 support should eliminate
the 8 128bit extracts, reduce these 12 packs to 6 and the 12 unpacks to 2
pshufb + 2 permq ideally (+ 2 final 128bit extracts).)

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
7 years agogallivm: generalize 4x4f->1x16ub special case conversion
Roland Scheidegger [Thu, 22 Dec 2016 02:51:40 +0000 (03:51 +0100)]
gallivm: generalize 4x4f->1x16ub special case conversion

This special packing path can be easily extended to handle not just
float->unorm8 but also float->snorm8 and uint32->uint8 and int32->int8
(i.e. all interesting cases for llvmpipe fs backend code).
The packing parts all stay the same (only the last step packing will
be signed->signed instead of signed->unsigned but luckily even sse2 can do
both).
While here also note some bugs with that (we keep the bugs identical to
what we did before on x86, albeit other archs may differ). In particular
float->unorm8 too large values will still get clamped to 0, not 255, and for
float->snorm8 NaNs will end up as -1, not 0 (but we do the clamp against 1.0
there to prevent too large values ending up as -1.0 - this is inconsistent
to unorm8 handling but is what we ended up before, I'm not sure we can get
away without it). This is quite fishy in any case as we depend on
arch-dependent behavior of the iround (my understanding is in fact with
altivec the conversion would actually saturate although I've no idea about
NaNs, so probably wouldn't need to do anything for snorm).
(There are only minimal piglit tests for unorm clamping behavior AFAICT, in
particular nothing seems to test values which are too large to be handled by
the float->int conversion.)
For uint32->uint8 we also do a min against MAX_INT, since the source for
the packs is always signed (again, on x86 - should probably be able to
express these arch-dependent bits better some day).

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
7 years agollvmpipe: use alpha from already converted color if possible
Roland Scheidegger [Thu, 22 Dec 2016 02:49:22 +0000 (03:49 +0100)]
llvmpipe: use alpha from already converted color if possible

For rgbx formats, there is no point in doing alpha conversion again (and
with different tranpose even, so llvm can't eliminate it).
Albeit it looks like there's some minimal changes needed in the blend code
(found by code inspection, no test seemed to complain) if we do this -
the blend factors are already sanitized if we have no destination alpha,
however for src_alpha_saturate it looks like it still might make a
difference (note that we forced has_alpha to true before for some formats
and nothing complained, but this seems safer).

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
7 years agollvmpipe: use scalar load instead of vectors for small vectors in fs backend
Roland Scheidegger [Thu, 22 Dec 2016 02:48:05 +0000 (03:48 +0100)]
llvmpipe: use scalar load instead of vectors for small vectors in fs backend

llvm has _huge_ problems trying to load things like <4 x i8> vectors and
stitching such loads together to form 128bit vectors. My understanding
of the problem is that the type legalizer tries to extend that to
really a <4 x i32> vector and not a <16 x i8> vector with the 4 elements
first then followed by padding, so the shuffles for then combining things
together are more or less impossible - you can in fact see the pmovzxd
llvm generates. Pre-4.0 llvm just gives up on it completely and does a 30+
pextrb/pinsrb sequence instead.
It looks like current llvm has fixed this behavior (my guess would be
due to better shuffle combination and load/shuffle folds), but we can
avoid this by just loading as <1 x i32> values, combine that and only
cast at the end. (I suspect it might also work if we'd pad the loaded
vectors immediately before shuffling them together, instead of directly
stitching 2 such vectors together pairwise before combining the pair.
But this _might_ lose the ability to load the values directly into
their right place in the vector with pinsrd.). But using 32bit values
is probably easier for llvm as it will never give it funny ideas how
the vector should look like.
(This is possibly only a problem for 1x8bit formats, since 2x8bit will
end up fetching 64bit hence only two vectors are stitched together,
not 4, but we use the same strategy anyway.)

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
7 years agoi965: Enable several GLES 3.1 extensions on HSW+
Ian Romanick [Tue, 8 Nov 2016 18:10:35 +0000 (10:10 -0800)]
i965: Enable several GLES 3.1 extensions on HSW+

The only reason we didn't previously enable this was the dependency on
OpenGL ES 3.1.  These should have been enabled as soon as HSW got
stencil texturing.  We also needed to fixup setting MaxViewports.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
7 years agoi965: Always set MaxViewports and related limits
Ian Romanick [Tue, 8 Nov 2016 18:10:34 +0000 (10:10 -0800)]
i965: Always set MaxViewports and related limits

Since 9d6ca7c3, there should be no performance hit for having
MaxViewports > 1.  Always set this context state.  This eliminates the
need to update this conditional as we add support for OES_viewport_array
on older GPUs.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
7 years agowinsys/amdgpu: fix a race condition between fence updates and IB submissions
Marek Olšák [Thu, 29 Dec 2016 12:41:42 +0000 (13:41 +0100)]
winsys/amdgpu: fix a race condition between fence updates and IB submissions

The CS thread is needed to ensure proper ordering of operations and can't
be disabled (without complicating the code).

Discovered by Nine CSMT, which ended up in a deadlock.

Acked-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: add TC L2 prefetch for shaders and VBO descriptors
Marek Olšák [Sun, 25 Dec 2016 17:11:59 +0000 (18:11 +0100)]
radeonsi: add TC L2 prefetch for shaders and VBO descriptors

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: add CP DMA flags for greater control over synchronization
Marek Olšák [Thu, 13 Oct 2016 10:09:36 +0000 (12:09 +0200)]
radeonsi: add CP DMA flags for greater control over synchronization

for L2 prefetch

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: cleanly communicate which CP DMA packet is first
Marek Olšák [Thu, 13 Oct 2016 09:40:09 +0000 (11:40 +0200)]
radeonsi: cleanly communicate which CP DMA packet is first

Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agogallium/radeon: add new HUD query num-SDMA-IBs
Marek Olšák [Tue, 27 Dec 2016 17:35:32 +0000 (18:35 +0100)]
gallium/radeon: add new HUD query num-SDMA-IBs

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agogallium/radeon: rename the num-ctx-flushes query to num-GFX-IBs
Marek Olšák [Tue, 27 Dec 2016 16:54:18 +0000 (17:54 +0100)]
gallium/radeon: rename the num-ctx-flushes query to num-GFX-IBs

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: add HUD queries for cache flush stats
Marek Olšák [Sun, 25 Dec 2016 18:48:55 +0000 (19:48 +0100)]
radeonsi: add HUD queries for cache flush stats

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: don't count fast clears and prefetches into CP DMA stats
Marek Olšák [Sun, 25 Dec 2016 17:34:16 +0000 (18:34 +0100)]
radeonsi: don't count fast clears and prefetches into CP DMA stats

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: don't wait for compute shaders in texture_barrier
Marek Olšák [Mon, 26 Dec 2016 21:33:46 +0000 (22:33 +0100)]
radeonsi: don't wait for compute shaders in texture_barrier

it doesn't interact with compute shaders in any way

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: assume that a TES without POSITION precedes GS
Marek Olšák [Wed, 21 Dec 2016 14:16:54 +0000 (15:16 +0100)]
radeonsi: assume that a TES without POSITION precedes GS

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: unduplicate VS color export code
Marek Olšák [Wed, 21 Dec 2016 14:15:30 +0000 (15:15 +0100)]
radeonsi: unduplicate VS color export code

it's exactly the same as the other ones

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoradeonsi: clean up more HAVE_LLVM #ifdefs
Marek Olšák [Tue, 13 Dec 2016 17:42:08 +0000 (18:42 +0100)]
radeonsi: clean up more HAVE_LLVM #ifdefs

Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agogallium/radeon: clean up HAVE_LLVM #ifdefs in r600_get_llvm_processor_name
Marek Olšák [Tue, 13 Dec 2016 17:37:08 +0000 (18:37 +0100)]
gallium/radeon: clean up HAVE_LLVM #ifdefs in r600_get_llvm_processor_name

Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
7 years agoi965: Properly flush in hsw_pause_transform_feedback().
Kenneth Graunke [Fri, 6 Jan 2017 08:09:53 +0000 (00:09 -0800)]
i965: Properly flush in hsw_pause_transform_feedback().

Fixes a number of transform feedback tests when run with Linux 4.8,
which allows us to use the MI_LOAD_REGISTER_REG command, at which point
we started using this new broken path.

ES3-CTS.functional.transform_feedback.array_element.interleaved.lines.*
and Piglit's arb_transform_feedback2/draw-auto are both fixed by this
patch, for example.

Thanks to Chris Wilson for catching this mistake!

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=99030
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Anuj Phogat <anuj.phogat@gmail.com>
7 years agoi965: Fix texturing in the vec4 TCS and GS backends.
Kenneth Graunke [Fri, 6 Jan 2017 09:13:24 +0000 (01:13 -0800)]
i965: Fix texturing in the vec4 TCS and GS backends.

We were failing to zero m0.2 of the sampler message header for TCS and
GS messages in the simple case.  fs_generator has done this for about
a year now, but we missed it in vec4_generator.

Fixes ES31-CTS.core.texture_cube_map_array.sampling,
GL45-CTS.texture_cube_map_array.sampling, and many
dEQP-GLES31.functional.shaders.opaque_type_indexing.sampler subtests:
- dynamically_uniform.tessellation_control.isampler3d
- dynamically_uniform.tessellation_control.isamplercube
- dynamically_uniform.tessellation_control.sampler2d
- dynamically_uniform.tessellation_control.usamplercube
- dynamically_uniform.tessellation_control.sampler2darray
- dynamically_uniform.tessellation_control.isampler2darray
- dynamically_uniform.tessellation_control.usampler3d
- dynamically_uniform.tessellation_control.usampler2darray
- dynamically_uniform.tessellation_control.usampler2d
- dynamically_uniform.tessellation_control.sampler3d
- dynamically_uniform.tessellation_control.samplercube
- dynamically_uniform.tessellation_control.isampler2d
- uniform.tessellation_control.isampler3d
- uniform.tessellation_control.isamplercube
- uniform.tessellation_control.usampler2d
- uniform.tessellation_control.usampler3d
- uniform.tessellation_control.sampler2darray
- uniform.tessellation_control.isampler2darray
- uniform.tessellation_control.usampler2darray
- uniform.tessellation_control.sampler2d
- uniform.tessellation_control.usamplercube
- uniform.tessellation_control.sampler3d
- uniform.tessellation_control.samplercube
- uniform.tessellation_control.isampler2d

Cc: mesa-stable@lists.freedesktop.org
Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
7 years agoswr: [rasterizer core] rename OutputMerger functions
Tim Rowley [Wed, 4 Jan 2017 22:54:00 +0000 (16:54 -0600)]
swr: [rasterizer core] rename OutputMerger functions

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
7 years agoswr: [rasterizer core] fix SIMD16 Transpose_16_16
Tim Rowley [Thu, 22 Dec 2016 00:06:42 +0000 (18:06 -0600)]
swr: [rasterizer core] fix SIMD16 Transpose_16_16

Fix incorrect swizzling in SIMD16 Transpose_16_16 breaking the
two-channel 16-bpc formats like R16G16_FLOAT.

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>