mesa.git
8 years agonvc0: reduce the initial code segment size to 512KB
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:47 +0000 (22:52 +0200)]
nvc0: reduce the initial code segment size to 512KB

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonvc0: allow to resize the code segment dynamically
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:46 +0000 (22:52 +0200)]
nvc0: allow to resize the code segment dynamically

When an application uses a ton of shaders, we need to evict them
when the code segment is full but this is not really a good solution
if monster shaders are used because code eviction will happen a lot.

To avoid this, it seems better to dynamically resize the code
segment area after each eviction. The maximum size is arbitrary
fixed to 8MB which should be enough.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonvc0: add a new bin for the code segment
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:45 +0000 (22:52 +0200)]
nvc0: add a new bin for the code segment

To avoid the bins list to grow up indefinitely when the code segment
size will be bumped, we need to separate that bin from the SCREEN
one because it contains other resources like the uniform bo.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonvc0: add nvc0_screen_resize_text_area() helper
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:44 +0000 (22:52 +0200)]
nvc0: add nvc0_screen_resize_text_area() helper

This function will be helpful for resizing the code segment
area when we need to evict all shaders.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonvc0: re-upload currently bound shaders after code eviction
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:43 +0000 (22:52 +0200)]
nvc0: re-upload currently bound shaders after code eviction

This fixes a very old issue which happens when the code segment
size is full. A bunch of real applications like Tomb Raider,
F1 2015, Elemental, hit that issue because they use a ton of shaders.

In this case, all shaders are evicted (for freeing space) but all
currently bound shaders also need to be re-uploaded and SP_START_ID
have to be updated accordingly.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonvc0: refactor the program upload process
Samuel Pitoiset [Wed, 31 Aug 2016 20:52:42 +0000 (22:52 +0200)]
nvc0: refactor the program upload process

This refactoring will help for fixing the "out of code space"
eviction issue because we will need to reupload the code for
all currently bound shaders but it's slightly different than
uploading a new fresh code.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agoi965: fix noop_scissor range issue on width/height
Jordan Justen [Fri, 18 Oct 2013 22:03:09 +0000 (15:03 -0700)]
i965: fix noop_scissor range issue on width/height

If scissor X or Y was set to a negative value then the previous
code might have indicated noop scissors when the scissor range
actually was masking a portion of the framebuffer.

Since fb->_Xmin, _Xmax, _Ymin and _Ymax take scissors into
account, we can use these to test for a noop scissor.

Cc: mesa-stable@lists.freedesktop.org
Reviewed-by: Matt Turner <mattst88@gmail.com>
Signed-off-by: Jordan Justen <jordan.l.justen@intel.com>
8 years agoglsl: Only force varyings to be flat when varying packing.
Kenneth Graunke [Wed, 31 Aug 2016 05:51:25 +0000 (22:51 -0700)]
glsl: Only force varyings to be flat when varying packing.

Varying packing would like to mark certain variables as flat.
This works as long as both sides of the interfaces are changed
accordingly.  However, with SSO, we disable varying packing on
the outermost stages.  We also disable varying packing for
certain tessellation stages.

With SSO, we operate on the producer and consumer separately.
Checks based on the consumer stage and variable are risky, and
can easily lead to altering one half of the interface between
stages, breaking SSO pipeline IO validation.

Just stop monkeying around with interpolation modes unless
required for varying packing.  There's no point.  This also
disables it in unsafe SSO cases.

Fixes CTS tests:
*.tessellation_shader.tessellation_control_to_tessellation_evaluation.gl_MaxPatchVertices_Position_PointSize

Also fixes Piglit's spec/oes_geometry_shader/sso_validation:
- user-defined-gs-input-not-in-block.shader_test
- user-defined-gs-input-in-block.shader_test

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Timothy Arceri <timothy.arceri@collabora.com>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agoglsl: Reject TCS/TES input arrays not sized to gl_MaxPatchVertices.
Kenneth Graunke [Wed, 31 Aug 2016 07:16:24 +0000 (00:16 -0700)]
glsl: Reject TCS/TES input arrays not sized to gl_MaxPatchVertices.

We handled the unsized case, implicitly sizing arrays to the value
of gl_MaxPatchVertices.  But if a size was present, we failed to
raise a compile error if it wasn't the value of gl_MaxPatchVertices.

Fixes CTS tests:

  *.tessellation_shader.compilation_and_linking_errors.
  {tc,te}_invalid_array_size_used_for_input_blocks

Piglit's tcs-input-read-nonconst-* tests have recently been fixed.
This patch will break older copies of those tests, but the latest
should continue working.  Update to Piglit 75819c13af2ed5.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Francisco Jerez <currojerez@riseup.net>
8 years agowayland-drm: add missing NULL check
Frank Binns [Thu, 4 Aug 2016 14:15:40 +0000 (15:15 +0100)]
wayland-drm: add missing NULL check

Although malloc is unlikely to fail check its return value nevertheless.

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
8 years agoloader: fix sysfs uevent file parsing
Frank Binns [Thu, 4 Aug 2016 14:15:23 +0000 (15:15 +0100)]
loader: fix sysfs uevent file parsing

When trying to get a device name for an fd using sysfs, it would always fail
as it was expecting key/value pairs to be delimited by '\0', which is not the
case.

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Eric Engestrom <eric.engestrom@imgtec.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
8 years agoegl: only store device name when Wayland support is built
Frank Binns [Fri, 17 Jun 2016 17:41:22 +0000 (18:41 +0100)]
egl: only store device name when Wayland support is built

The device name is only needed for WL_bind_wayland_display so make this clear
by only storing the device name when Wayland support is built.

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Emil Velikov <emil.velikov@collabora.com>
8 years agoisl: round format alignment to nearest power of 2
Lionel Landwerlin [Fri, 19 Aug 2016 23:38:05 +0000 (00:38 +0100)]
isl: round format alignment to nearest power of 2

A few inline asserts in anv assume alignments are power of 2, but with
formats like R8G8B8 we have odd alignments.

v2: round up to power of 2 (Ilia)

v3: reuse util_next_power_of_two() from gallium/aux/util/u_math.h (Ilia)

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
8 years agogallium/postprocess: Fix resource freeing
Thomas Hellstrom [Thu, 26 May 2016 09:16:28 +0000 (11:16 +0200)]
gallium/postprocess: Fix resource freeing

The code was triggering asserts in DEBUG builds of the SVGA driver since
the reference count of the resource was never decremented before destroy.

Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
8 years agost/mesa: expose OES_geometry_shader and OES_texture_cube_map_array
Ilia Mirkin [Sat, 27 Aug 2016 21:47:37 +0000 (17:47 -0400)]
st/mesa: expose OES_geometry_shader and OES_texture_cube_map_array

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Marek Olšák <marek.olsak@amd.com>
8 years agoIntroduce .editorconfig
Eric Engestrom [Tue, 30 Aug 2016 20:02:18 +0000 (21:02 +0100)]
Introduce .editorconfig

A few weeks ago, Jose Fonseca suggested [0] we use .editorconfig files
to try and enforce the formatting of the code, to which Michel Dänzer
suggested [1] we start by importing the existing .dir-locals.el
settings. The first draft was discussed in the RFC [2].

These .editorconfig are a first step, one that has the advantage of
requiring little to no intervention from the devs once the settings
files are in place, but the settings are very limited. This does have
the advantage of applying while the code is being written.
This doesn't replace the need for more comprehensive formatting tools
such as clang-format & clang-tidy, but those reformat the code after
the fact.

[0] https://lists.freedesktop.org/archives/mesa-dev/2016-June/121545.html
[1] https://lists.freedesktop.org/archives/mesa-dev/2016-June/121639.html
[2] https://lists.freedesktop.org/archives/mesa-dev/2016-July/123431.html

Acked-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
Acked-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Eric Engestrom <eric@engestrom.ch>
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
8 years agovc4: Add missing break statement.
Eric Anholt [Mon, 29 Aug 2016 18:23:35 +0000 (11:23 -0700)]
vc4: Add missing break statement.

This opcode isn't used yet, so it didn't affect anything.  Caught by
Coverity, reported to me by imirkin.

8 years agogallium/docs: clarify render_condition_enabled parameter to clear functions
Brian Paul [Wed, 31 Aug 2016 16:03:53 +0000 (10:03 -0600)]
gallium/docs: clarify render_condition_enabled parameter to clear functions

If false, it means do the clear unconditionally.

Reviewed-by: Marek Olšák <marek.olsak@amd.com>
8 years agomesa: Add some more .gitignore
Jason Ekstrand [Wed, 31 Aug 2016 20:45:27 +0000 (13:45 -0700)]
mesa: Add some more .gitignore

8 years agoi965: Pass start_offset to brw_set_uip_jip().
Matt Turner [Mon, 29 Aug 2016 22:57:41 +0000 (15:57 -0700)]
i965: Pass start_offset to brw_set_uip_jip().

Without this, we would pass over the instructions in the SIMD8 program
(which is located earlier in the buffer) when brw_set_uip_jip() is
called to handle the SIMD16 program.

The assertion about compacted control flow was bogus: halt, cont, break
cannot be compacted because they have both JIP and UIP. Instead, we
should never see a compacted instruction in this code at all.

Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
8 years agoi965: Merge gen7_clip_state atom into gen6_clip_state atom.
Kenneth Graunke [Tue, 30 Aug 2016 20:16:02 +0000 (13:16 -0700)]
i965: Merge gen7_clip_state atom into gen6_clip_state atom.

The original motivation was that gen6_clip_state ignored _NEW_POLYGON
as it didn't care about early culling.  The only other change was that
Gen6 ignored BRW_NEW_TES_PROG_DATA as it doesn't have tessellation
shaders, but listening to this is harmless as it'll never be signalled.

Now that we've added _NEW_POLYGON for is_drawing_lines/points, we can
merge the two as the distinction is meaningless.

This actually fixes a bug, though: Gen8+ was using the gen6_clip_state
atom because it doesn't care about early culling, but it also needs
BRW_NEW_TES_PROG_DATA, which was missing.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
8 years agoi965: Use gs_prog_data in is_drawing_points/lines().
Kenneth Graunke [Fri, 26 Aug 2016 05:52:22 +0000 (22:52 -0700)]
i965: Use gs_prog_data in is_drawing_points/lines().

State upload code should use prog_data rather than poking at core
Mesa shader data structures wherever possible.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
8 years agoi965: Fix missing dirty bits related to is_drawing_points/lines.
Kenneth Graunke [Fri, 26 Aug 2016 06:00:13 +0000 (23:00 -0700)]
i965: Fix missing dirty bits related to is_drawing_points/lines.

calculate_attr_overrides() uses is_drawing_points(), which depends
on tessellation and geometry program state, as well as polygon state.

v2: Add missing _NEW_POLYGON as well.  Caught by Iago Toral.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>
8 years agonvc0: remove an attempt at uploading all IMMD into a CB
Samuel Pitoiset [Wed, 31 Aug 2016 15:42:05 +0000 (17:42 +0200)]
nvc0: remove an attempt at uploading all IMMD into a CB

This has never been used because info->immd.bufSize is always 0
and anyways this is an experimental code which has never been
completed.

This gets rid of some unused code in the program validation process.

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonv50: remove unused nv50_program::immd_size field
Samuel Pitoiset [Wed, 31 Aug 2016 15:42:04 +0000 (17:42 +0200)]
nv50: remove unused nv50_program::immd_size field

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agonv30: set usage to staging so that the buffer is allocated in GART
Ilia Mirkin [Wed, 31 Aug 2016 06:12:08 +0000 (02:12 -0400)]
nv30: set usage to staging so that the buffer is allocated in GART

The code a few lines below expects to migrate the bo in question to
VRAM. Since we're filling the initial data via CPU, it's more efficient
to create the temporary buffer in GART. There is no "push" method
implemented, otherwise we'd use that instead.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
8 years agoegl/x11_dri3: provide an authentication function
Frank Binns [Fri, 17 Jun 2016 17:41:21 +0000 (18:41 +0100)]
egl/x11_dri3: provide an authentication function

To support WL_bind_wayland_display an authentication function needs to be
provided but this was not being done for this platform as it's not strictly
necessary. However, as this isn't an optional function there's the potential
for a segfault to occur if authentication is mistakenly performed. Protect
against this by providing a function that prints an error.

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Axel Davy <axel.davy@ens.fr>
8 years agoegl/x11_dri3: disable WL_bind_wayland_display for devices without render nodes
Frank Binns [Fri, 17 Jun 2016 17:41:20 +0000 (18:41 +0100)]
egl/x11_dri3: disable WL_bind_wayland_display for devices without render nodes

Up until now, DRI3 was only used for devices that have render nodes, unless
overridden via an environment variable, with it falling back to DRI2 otherwise.
This limitation was there in order to support WL_bind_wayland_display as it
requires client opened device node fds to be authenticated, which isn't possible
when using DRI3. This is an unfortunate compromise as DRI3 provides security
benefits over DRI2.

Instead, allow DRI3 to be used for devices without render nodes but don't
advertise WL_bind_wayland_display in this case. Applications that need this
extension can still be run by disabling DRI3 support via the LIBGL_DRI3_DISABLE
environment variable.

Signed-off-by: Frank Binns <frank.binns@imgtec.com>
Reviewed-by: Axel Davy <axel.davy@ens.fr>
8 years agoscons: Fix MinGW cross compilation.
Jose Fonseca [Wed, 31 Aug 2016 11:16:32 +0000 (12:16 +0100)]
scons: Fix MinGW cross compilation.

The generated GLSL header files were only being built for the host
platform, and not the target platform.

Trivial.

8 years agonv30: only bail on color/depth bpp mismatch when surfaces are swizzled
Ilia Mirkin [Wed, 31 Aug 2016 04:54:17 +0000 (00:54 -0400)]
nv30: only bail on color/depth bpp mismatch when surfaces are swizzled

The actual restriction is a little weaker than I originally thought. See
https://bugs.freedesktop.org/show_bug.cgi?id=92306#c17 for the
suggestion. This also explain why things weren't *always* failing
before, only sometimes. We will allocate a non-swizzled depth buffer for
NPOT winsys buffer sizes, which they almost always are.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Cc: mesa-stable@lists.freedesktop.org
8 years agoglsl: Handle patch qualifier on interface blocks.
Kenneth Graunke [Thu, 2 Jun 2016 02:27:02 +0000 (19:27 -0700)]
glsl: Handle patch qualifier on interface blocks.

Signed-off-by: Kenneth Graunke <kenneth@whitecape.org>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agoi965: enable OES_primitive_bounding_box with the no-op implementation
Ilia Mirkin [Sun, 28 Aug 2016 20:03:21 +0000 (16:03 -0400)]
i965: enable OES_primitive_bounding_box with the no-op implementation

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agost/mesa: provide the null implementation of bounding box outputs in tcs
Ilia Mirkin [Mon, 30 May 2016 17:28:02 +0000 (13:28 -0400)]
st/mesa: provide the null implementation of bounding box outputs in tcs

Until hardware appears (in a gallium driver) that can make use of the
TCS-outputted gl_BoundingBox, we just request that the variable gets
assigned as a regular patch variable.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agoglsl: add gl_BoundingBox and associated varying slots
Ilia Mirkin [Mon, 30 May 2016 15:50:07 +0000 (11:50 -0400)]
glsl: add gl_BoundingBox and associated varying slots

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agomesa: add support for GL_PRIMITIVE_BOUNDING_BOX storage and query
Ilia Mirkin [Mon, 30 May 2016 16:54:23 +0000 (12:54 -0400)]
mesa: add support for GL_PRIMITIVE_BOUNDING_BOX storage and query

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agomesa: add scaffolding for OES/EXT_primitive_bounding_box
Ilia Mirkin [Mon, 30 May 2016 15:49:26 +0000 (11:49 -0400)]
mesa: add scaffolding for OES/EXT_primitive_bounding_box

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agodocs: add GL_OES_viewport_array to features
Ilia Mirkin [Tue, 30 Aug 2016 23:46:31 +0000 (19:46 -0400)]
docs: add GL_OES_viewport_array to features

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agoaubinator: fix if indentation and add brackets to multiline body
Timothy Arceri [Mon, 29 Aug 2016 23:53:35 +0000 (09:53 +1000)]
aubinator: fix if indentation and add brackets to multiline body

Fixes misleading indentation warning in gcc.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
8 years agoi965/fs: Assert that the number of color targets is one when dual-source blend is...
Francisco Jerez [Fri, 26 Aug 2016 01:35:06 +0000 (18:35 -0700)]
i965/fs: Assert that the number of color targets is one when dual-source blend is enabled.

Requested by Anuj during review of
4a87e4ade778e56d43333c65a58752b15a00ce69, adding as follow-up since it
led to assertion failures due to various GLSL bugs that should be
fixed now.

8 years agoglsl: Fix gl_program::OutputsWritten computation for dual-source blending.
Francisco Jerez [Sat, 20 Aug 2016 21:55:19 +0000 (14:55 -0700)]
glsl: Fix gl_program::OutputsWritten computation for dual-source blending.

In the fragment shader OutputsWritten is a bitset of FRAG_RESULT_*
enumerants, which represent the location of each color output written
by the shader.  The secondary and primary color outputs of a given
render target using dual-source blending have the same location, so
the 'idx' computation below will give the wrong bit as result if the
'var->data.index' term is non-zero -- E.g. if the shader writes the
primary and secondary colors of the FRAG_RESULT_COLOR output,
ir_set_program_inouts will think that the shader writes both
FRAG_RESULT_COLOR and FRAG_RESULT_SAMPLE_MASK, which is just bogus.

That would cause the brw_wm_prog_key::nr_color_regions computation
done in the i965 driver during fragment shader precompilation to be
wrong, which currently leads to unnecessary recompilation of shaders
that use dual-source blending, and triggers an assertion failure in
fs_visitor::emit_fb_writes() on my i965-fb-fetch branch.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agoglsl: Fix incorrect hard-coded location of the gl_SecondaryFragColorEXT built-in.
Francisco Jerez [Thu, 23 Jun 2016 07:05:37 +0000 (00:05 -0700)]
glsl: Fix incorrect hard-coded location of the gl_SecondaryFragColorEXT built-in.

gl_SecondaryFragColorEXT should have the same location as gl_FragColor
for the secondary fragment color to be replicated to all fragment
outputs.  The incorrect location of gl_SecondaryFragColorEXT would
cause the linker to mark both FRAG_RESULT_COLOR and FRAG_RESULT_DATA0
as being written to, which isn't allowed by the spec and would
ultimately lead to an assertion failure in
fs_visitor::emit_fb_writes() on my i965-fb-fetch branch.

This should also fix the code below for multiple dual-source-blended
render targets, which no driver currently supports but we have plans
to enable eventually in the i965 driver (the comment saying that no
hardware will ever support it seems rather hilarious).

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agost/glsl_to_tgsi: Use SecondaryOutputsWritten to determine dual-source fragment outputs.
Francisco Jerez [Tue, 23 Aug 2016 18:18:19 +0000 (11:18 -0700)]
st/glsl_to_tgsi: Use SecondaryOutputsWritten to determine dual-source fragment outputs.

Currently the mesa state tracker relies on there being two bits set
per dual-source output in the gl_program::OutputsWritten bitset, but
that only worked due to a GLSL front-end bug that caused it to set the
OutputsWritten bit for both location and location+1 even though at the
GLSL level the primary and secondary color outputs used for
dual-source blending have the same location.  Fix it by extending
outputMapping[] to 2*FRAG_RESULT_MAX elements in order to represent a
mapping from a (location, index) pair to its TGSI output, which should
also make it slightly easier to add support for dual-source blending
in combination with multiple render targets in the long run.

No Piglit regressions on llvmpipe.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agoglsl: Calculate bitset of secondary outputs written in ir_set_program_inouts.
Francisco Jerez [Tue, 23 Aug 2016 18:15:57 +0000 (11:15 -0700)]
glsl: Calculate bitset of secondary outputs written in ir_set_program_inouts.

Reviewed-by: Ilia Mirkin <imirkin@alum.mit.edu>
8 years agoglsl: Fix typo in comment
Ian Romanick [Tue, 19 Jul 2016 22:45:03 +0000 (15:45 -0700)]
glsl: Fix typo in comment

Trivial.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agoglsl: Replace most assertions with unreachable()
Ian Romanick [Tue, 19 Jul 2016 00:38:19 +0000 (17:38 -0700)]
glsl: Replace most assertions with unreachable()

   text    data     bss     dec     hex filename
7669233  277176   28624 7975033  79b079 i965_dri.so before generated code
7647081  277176   28624 7952881  7959f1 i965_dri.so before this commit
7669289  277176   28624 7975089  79b0b1 i965_dri.so with this commit

Looking at the generated assembly, it appears that some of changes made
in the generated code prevent some loops from being unrolled.  Removing
the default cases (via unreachable()) allows these loops to unroll again.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Refactor handling of horizontal operations
Ian Romanick [Mon, 18 Jul 2016 18:16:18 +0000 (11:16 -0700)]
glsl: Refactor handling of horizontal operations

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Use constant_template_horizontal instead of constant_template_horizontal_single...
Ian Romanick [Mon, 18 Jul 2016 18:13:55 +0000 (11:13 -0700)]
glsl: Use constant_template_horizontal instead of constant_template_horizontal_single_implementation for unops

This changes the "shape" of all the pack and unpack operators, but they
should function the same.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Eliminate constant_template2
Ian Romanick [Mon, 18 Jul 2016 17:58:42 +0000 (10:58 -0700)]
glsl: Eliminate constant_template2

constant_template_common can now handle the case where the result type
is different from the input type by using type_signature_iter.  This
changes the "shape" of all the cast-style operators, but they should
function the same.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
8 years agoglsl: Eliminate constant_template5
Ian Romanick [Mon, 18 Jul 2016 17:49:07 +0000 (10:49 -0700)]
glsl: Eliminate constant_template5

constant_template_common can now handle the case where the result type
is different from the input type by using type_signature_iter.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Eliminate constant_template0
Ian Romanick [Fri, 15 Jul 2016 23:40:06 +0000 (16:40 -0700)]
glsl: Eliminate constant_template0

This template is mostly an artefact of the development of the original
patch series and to minimize the differences between the original code
and the generated code.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Eliminate one of the templates for simpler operations
Ian Romanick [Fri, 15 Jul 2016 00:42:59 +0000 (17:42 -0700)]
glsl: Eliminate one of the templates for simpler operations

The difference between these two templates were mostly an artefact of
the development of the original patch series and to minimize the
differences between the original code and the generated code.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Use the generated constant expression code
Ian Romanick [Tue, 12 Jul 2016 23:42:36 +0000 (16:42 -0700)]
glsl: Use the generated constant expression code

Immediately previous to this patch,

    diff -wud src/glsl/ir_constant_expression.cpp \
              src/glsl/ir_expression_operation_constant.h

should be "minimal."

v3: With much help from José Fonseca, fix the SCons build.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Generate code for constant ir_triop_csel expressions
Ian Romanick [Tue, 12 Jul 2016 23:42:57 +0000 (16:42 -0700)]
glsl: Generate code for constant ir_triop_csel expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_triop_lrp expressions
Ian Romanick [Tue, 12 Jul 2016 23:42:36 +0000 (16:42 -0700)]
glsl: Generate code for constant ir_triop_lrp expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_quadop_vector expressions
Ian Romanick [Tue, 12 Jul 2016 23:42:09 +0000 (16:42 -0700)]
glsl: Generate code for constant ir_quadop_vector expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_quadop_bitfield_insert expressions
Ian Romanick [Tue, 12 Jul 2016 23:15:10 +0000 (16:15 -0700)]
glsl: Generate code for constant ir_quadop_bitfield_insert expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_triop_vector_insert expressions
Ian Romanick [Tue, 12 Jul 2016 23:02:02 +0000 (16:02 -0700)]
glsl: Generate code for constant ir_triop_vector_insert expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_binop_vector_extract expressions
Ian Romanick [Tue, 12 Jul 2016 19:52:45 +0000 (12:52 -0700)]
glsl: Generate code for constant ir_binop_vector_extract expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_binop_mul expressions
Ian Romanick [Tue, 12 Jul 2016 19:44:18 +0000 (12:44 -0700)]
glsl: Generate code for constant ir_binop_mul expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_triop_fma and ir_triop_bitfield_extract expressions
Ian Romanick [Tue, 12 Jul 2016 19:30:19 +0000 (12:30 -0700)]
glsl: Generate code for constant ir_triop_fma and ir_triop_bitfield_extract expressions

ir_triop_bitfield_extract is a little weird because the second and third
operand and aways int, so they may differ in type from the first
operand.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_binop_dot expressions
Ian Romanick [Tue, 12 Jul 2016 19:30:04 +0000 (12:30 -0700)]
glsl: Generate code for constant ir_binop_dot expressions

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_binop_lshift and ir_binop_rshift expressions
Ian Romanick [Tue, 12 Jul 2016 18:29:21 +0000 (11:29 -0700)]
glsl: Generate code for constant ir_binop_lshift and ir_binop_rshift expressions

The code generated is quite different from what was previously used.  I
believe that it is still correct by the GLSL spec, and I believe, due to
C rules about shifts, the behavior will be the same.

Section 5.9 (Expressions) of the GLSL 4.50 spec says:

    The result is undefined if the right operand is negative, or greater
    than or equal to the number of bits in the left expression's base
    type.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant ir_binop_ldexp expressions
Ian Romanick [Tue, 12 Jul 2016 17:53:11 +0000 (10:53 -0700)]
glsl: Generate code for constant ir_binop_ldexp expressions

ldexp is weird because its two operands have different types.  Add
support for directly specifying the exact signatures of all the possible
variations of an operation.

v2: Use tuple() instead of () for clarity.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant unary expressions that don't assign the destination
Ian Romanick [Tue, 12 Jul 2016 17:51:43 +0000 (10:51 -0700)]
glsl: Generate code for constant unary expressions that don't assign the destination

These are operations like the pack functions that have separate
functions that assign multiple outputs from a single input.

v2: Correct the source and destination types.  They were previously
transposed.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for some constant binary expression that are horizontal
Ian Romanick [Tue, 12 Jul 2016 17:12:57 +0000 (10:12 -0700)]
glsl: Generate code for some constant binary expression that are horizontal

Only operations where the implementation is identical code regardless of
type.  The only such operations are ir_binop_all_equal and
ir_binop_any_nequal.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant unary expression that are horizontal
Ian Romanick [Tue, 12 Jul 2016 00:38:16 +0000 (17:38 -0700)]
glsl: Generate code for constant unary expression that are horizontal

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant expressions that have an output type the differs...
Ian Romanick [Tue, 12 Jul 2016 00:09:22 +0000 (17:09 -0700)]
glsl: Generate code for constant expressions that have an output type the differs from the input types

v2: Remove extra int() cast in find_lsb.  Suggested by Matt.  'for (a,
b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant binary expressions that combine vector and scalar...
Ian Romanick [Mon, 11 Jul 2016 18:05:13 +0000 (11:05 -0700)]
glsl: Generate code for constant binary expressions that combine vector and scalar operands

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant binary expressions that have one operand type
Ian Romanick [Mon, 11 Jul 2016 17:19:31 +0000 (10:19 -0700)]
glsl: Generate code for constant binary expressions that have one operand type

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant unary expression that have different implementations...
Ian Romanick [Sat, 9 Jul 2016 01:40:58 +0000 (18:40 -0700)]
glsl: Generate code for constant unary expression that have different implementations for each source type

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate code for constant unary expression that map one type to another
Ian Romanick [Sat, 9 Jul 2016 00:12:33 +0000 (17:12 -0700)]
glsl: Generate code for constant unary expression that map one type to another

ir_unop_i2b is omitted because its source can either be int or uint.
That makes it special.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Begin generating code for the most basic constant expressions
Ian Romanick [Fri, 8 Jul 2016 07:20:43 +0000 (00:20 -0700)]
glsl: Begin generating code for the most basic constant expressions

Unary operations where all of the supported types use the same C
expression to evaluate them.

v2: 'for (a, b) in d' => 'for a, b in d'.  Suggested by Dylan.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Convert tuple into a class
Ian Romanick [Fri, 8 Jul 2016 06:03:44 +0000 (23:03 -0700)]
glsl: Convert tuple into a class

This makes things a little more clear now, and it will make future
changes... possible.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Compact a bunch of things onto one line
Ian Romanick [Wed, 13 Jul 2016 01:25:30 +0000 (18:25 -0700)]
glsl: Compact a bunch of things onto one line

Even though they are much too long for that.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Sort constant expression handling by IR operand enum value
Ian Romanick [Wed, 13 Jul 2016 00:26:38 +0000 (17:26 -0700)]
glsl: Sort constant expression handling by IR operand enum value

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Trivial whitespace and punctuation changes
Ian Romanick [Tue, 12 Jul 2016 23:57:43 +0000 (16:57 -0700)]
glsl: Trivial whitespace and punctuation changes

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Sort GLSL type enums in switch-statements in enum order
Ian Romanick [Tue, 12 Jul 2016 23:51:35 +0000 (16:51 -0700)]
glsl: Sort GLSL type enums in switch-statements in enum order

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Always use correct float types in constant expression handling
Ian Romanick [Tue, 12 Jul 2016 23:49:15 +0000 (16:49 -0700)]
glsl: Always use correct float types in constant expression handling

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Extract ir_quadop_bitfield_insert implementation to a separate function
Ian Romanick [Wed, 13 Jul 2016 01:11:29 +0000 (18:11 -0700)]
glsl: Extract ir_quadop_bitfield_insert implementation to a separate function

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Extract ir_triop_bitfield_extract implementation to a separate function
Ian Romanick [Wed, 13 Jul 2016 01:07:51 +0000 (18:07 -0700)]
glsl: Extract ir_triop_bitfield_extract implementation to a separate function

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Extract ir_binop_ldexp implementation to a separate function
Ian Romanick [Wed, 13 Jul 2016 00:49:02 +0000 (17:49 -0700)]
glsl: Extract ir_binop_ldexp implementation to a separate function

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Use find_msb_uint to implement ir_unop_find_lsb
Ian Romanick [Wed, 13 Jul 2016 00:40:48 +0000 (17:40 -0700)]
glsl: Use find_msb_uint to implement ir_unop_find_lsb

(X & -X) calculates a value with only the least significant bit of X
set.  Since there is only one bit set, the LSB is the MSB.

v2: Remove extra int() cast.  Suggested by Matt.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Extract ir_unop_find_msb implementation to a separate function
Ian Romanick [Wed, 13 Jul 2016 00:39:26 +0000 (17:39 -0700)]
glsl: Extract ir_unop_find_msb implementation to a separate function

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Extract ir_unop_bitfield_reverse implementation to a separate function
Ian Romanick [Wed, 13 Jul 2016 00:32:24 +0000 (17:32 -0700)]
glsl: Extract ir_unop_bitfield_reverse implementation to a separate function

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Use _mesa_bitcount to implement constant ir_unop_bit_count
Ian Romanick [Mon, 11 Jul 2016 18:20:02 +0000 (11:20 -0700)]
glsl: Use _mesa_bitcount to implement constant ir_unop_bit_count

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Delete spurious comment about mod not taking integer operands
Ian Romanick [Fri, 8 Jul 2016 05:15:53 +0000 (22:15 -0700)]
glsl: Delete spurious comment about mod not taking integer operands

This hasn't been true since we added support for GLSL 1.30.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Delete spurious comment about updating ir_expression::get_num_operands
Ian Romanick [Fri, 8 Jul 2016 04:39:44 +0000 (21:39 -0700)]
glsl: Delete spurious comment about updating ir_expression::get_num_operands

This hasn't been necessary since 007f48815.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Do not generate comments or extra whitespace in expression files
Ian Romanick [Fri, 8 Jul 2016 04:37:22 +0000 (21:37 -0700)]
glsl: Do not generate comments or extra whitespace in expression files

The comments and whitespace can live in the Python code.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Just access the ir_expression_operation strings table directly
Ian Romanick [Thu, 16 Apr 2015 00:55:32 +0000 (17:55 -0700)]
glsl: Just access the ir_expression_operation strings table directly

The operator_string functions gave us some protection against a
malformed table.  Now that the table is generated from the same data
that generates the enum, this is not a concern.  Just cut out the middle
man.

   text    data     bss     dec     hex filename
7531892  273992   28584 7834468  778b64 i965_dri-64bit-before.so
7531828  273992   28584 7834404  778b24 i965_dri-64bit-after.so

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Generate ir_expression_operation_strings.h from Python
Ian Romanick [Thu, 16 Apr 2015 00:50:57 +0000 (17:50 -0700)]
glsl: Generate ir_expression_operation_strings.h from Python

'diff -ud' is clean.

v2: Massive rebase.

v3: With much help from José Fonseca, fix the SCons build.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Pull operator_strs out to its own file
Ian Romanick [Thu, 16 Apr 2015 00:34:56 +0000 (17:34 -0700)]
glsl: Pull operator_strs out to its own file

No change except to the copyright symbol.  The next patch will generate
this file with Python, and Unicode + Python = pure rage.

v2: Massive rebase.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
8 years agoglsl: Generate the ir_last_* values
Ian Romanick [Thu, 16 Apr 2015 00:19:04 +0000 (17:19 -0700)]
glsl: Generate the ir_last_* values

This ensures that they remain correct if the list is rearranged or new
opcodes are added.  I checked a diff of before and after to ensure that
each ir_last_ had the same value.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoglsl: Generate ir_expression_operation.h from Python
Ian Romanick [Wed, 15 Apr 2015 23:59:43 +0000 (16:59 -0700)]
glsl: Generate ir_expression_operation.h from Python

There are differences in where end-of-line comments are placed, but
'diff -wud' is clean.

v2: Massive rebase.

v3: With much help from José Fonseca, fix SCons build.

Signed-off-by: Ian Romanick <ian.d.romanick@intel.com>
Reviewed-by: Matt Turner <mattst88@gmail.com>
Acked-by: Dylan Baker <dylan@pnwbakers.com>
8 years agoanv: Rework pipeline caching
Jason Ekstrand [Thu, 25 Aug 2016 08:49:49 +0000 (01:49 -0700)]
anv: Rework pipeline caching

The original pipeline cache the Kristian wrote was based on a now-false
premise that the shaders can be stored in the pipeline cache.  The Vulkan
1.0 spec explicitly states that the pipeline cache object is transiant and
you are allowed to delete it after using it to create a pipeline with no
ill effects.  As nice as Kristian's design was, it doesn't jive with the
expectation provided by the Vulkan spec.

The new pipeline cache uses reference-counted anv_shader_bin objects that
are backed by a large state pool.  The cache itself is just a hash table
mapping keys hashes to anv_shader_bin objects.  This has the added
advantage of removing one more hand-rolled hash table from mesa.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=97476
Acked-by: Kristian Høgsberg Kristensen <krh@bitplanet.net>
8 years agoanv: Add a struct for storing a compiled shader
Jason Ekstrand [Thu, 25 Aug 2016 06:48:32 +0000 (23:48 -0700)]
anv: Add a struct for storing a compiled shader

This new anv_shader_bin struct stores the compiled kernel (as an anv_state)
as well as all of the metadata that is generated at shader compile time.
The struct is very similar to the old cache_entry struct except that it
is reference counted and stores the actual pipeline_bind_map.  Similarly to
cache_entry, much of the actual data is floating-size and stored after the
main struct.  Unlike cache_entry, which was storred in GPU-accessable
memory, the storage for anv_shader_bin kernels comes from a state pool.
The struct itself is reference-counted so that it can be used by multiple
pipelines at a time without fear of allocation issues.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
Acked-by: Kristian Høgsberg Kristensen <krh@bitplanet.net>
8 years agoanv: Add pipeline_has_stage guards a few places
Jason Ekstrand [Thu, 25 Aug 2016 19:22:28 +0000 (12:22 -0700)]
anv: Add pipeline_has_stage guards a few places

All of these worked before because they were depending on prog_data to be
null.  Soon, we won't be able to depend on a nice prog_data pointer and
it's nice to be more explicit anyway.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
8 years agoanv: Remove unused fields from anv_pipeline_bind_map
Jason Ekstrand [Thu, 25 Aug 2016 06:12:18 +0000 (23:12 -0700)]
anv: Remove unused fields from anv_pipeline_bind_map

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
8 years agoanv/pipeline: Properly handle OOM during shader compilation
Jason Ekstrand [Mon, 29 Aug 2016 15:30:37 +0000 (08:30 -0700)]
anv/pipeline: Properly handle OOM during shader compilation

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
8 years agoanv/allocator: Correctly set the number of buckets
Jason Ekstrand [Sat, 27 Aug 2016 02:31:05 +0000 (19:31 -0700)]
anv/allocator: Correctly set the number of buckets

The range from ANV_MIN_STATE_SIZE_LOG2 to ANV_MAX_STATE_SIZE_LOG2 should
be inclusive and we have asserts that ensure that you never try to allocate
a state larger than (1 << ANV_MAX_STATE_SIZE_LOG2).  However, without
adding 1 to the difference, we allocate 1 too few bucckts and so, even
though we have an assert, anything landing in the last bucket will fail to
allocate properly..

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>
8 years agoanv/pipeline: Fix bind maps for fragment output arrays
Jason Ekstrand [Thu, 25 Aug 2016 19:21:51 +0000 (12:21 -0700)]
anv/pipeline: Fix bind maps for fragment output arrays

Found by inspection.

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
Cc: "12.0" <mesa-stable@lists.freedesktop.org>