With that we can enable PIPE_CAP_TGSI_TEXCOORD in the guest
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Corentin Noël <corentin.noel@collabora.com>
With the NTT code path in the guest we might end up with
the generic array outputs also with GS and TES.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Corentin Noël <corentin.noel@collabora.com>
Make sure that the condition for which we are emitting the uniform
corresponds to the one in the iter_declaration function.
Signed-off-by: Corentin Noël <corentin.noel@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Currently, we always use the `tfout` variables when writing TF output
for geometry shaders, but only declare them under specific conditions,
causing GLSL errors in tests like ``
Fixes: 9157dcbca0
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Corentin Noël <corentin.noel@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Using a pointer for fs_info in the shader key is not really that useful
because the contents of the structure can change even though the pointer
remains the same, and the pointer can be different when the contents are
the same.
Fixes 5f488ed00d
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Tested-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
If we always emit the glip distance in GS we might end up
having too many outputs, which will result in failures.
Hence, for GS only emit the clip distance evaluation code
when the clip planes are enabled.
Fixes: 072f30955b
shader: Always write code to toggle clip plane
Closes: #254
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Italo Nicola <italonicola@collabora.com>
This fixes an issue where a shader would be emitted using
EXT_clip_cull_distance even if the host didn't support the extension.
Fixes 072f30955b
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
This prevents shader recompilation when the guest only wants to
enable/disable clip plane in a compatibility profile. Can improve
performance if many shaders have to be recompiled because of this,
which happens in some games like Portal 2.
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
This prevents shader recompilation when the guest wants to enable/disable
alpha test. Can make a performance difference when lots of fragment
shaders suddenly have to be recompiled only because the application
called `glEnable(GL_ALPHA_TEST)`.
Signed-off-by: Italo Nicola <italonicola@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
The swizzling didn't take into account that the destination might
actually only read a few components or just one, so that the
applied swizzling could even become invalid because code like
dest.z = vec4(dest.z.x, dest.z.y.dest.z.z. dest.z.w)
could be created. The check for when to apply the swizzling was also
not correct because the two values compared came from different
name-spaces.
To fix this, just check whether the TEXTURE_NEEDS_SWIZZLE is set,
and when loweing in the shader, take only the components into account
that are actually written.
This also needs a fix for the alpha-format override to add the
TEXTURE_NEEDS_SWIZZLE flag.
Finally take the shader type into account when checking the number
of sampler views.
v2: Correct the shader code to apply the swizzling (Maksym)
v3: Fix formatting (Maksym)
Fixes: 29c6b9177541f189ebed5158a432b21d0d82211
vrend: apply format swizzling during GLSL generation
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: maksym.wezdecki@collabora.com
To query the size and number of levels we have to obtain the
sampler as source for the size query, but also the index for
the emulated level lookup, so default to always obtaining the
right sampler, and add a special case for obtaining the sampler
index.
v2: - Fix possible endless loop (John)
- Use the sampler source index to find find the real index
v3: Make loop easier to read, and rename variables (John)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
Sometimes we receive FS shaders where some output was optimized away.
In this case we have to set the output locations explicitly, but it is
no problem if we always do this. On GL this can always be done by using
glBindFragDataLocationIndexed, it is supported since at least GL 3.3,
and the alternative, setting the layouts in the shader, requires the same
OpenGL. On GLES we have to emit explict locations if EXT_blend_func_extended
is not supported. This fises rendering of "The Long Dark".
v2: - Emit EXT_blend_func_extended in FS if extension is available
since this is required when not emitting the explicit locations
(Robert Wenzel)
- call glBindFragDataLocationIndexedEXT on GLES because that's what the
extension requires
v3: use sizoef(buf) instead of hard-coding size (John)
Related: #223
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: maksym.wezdecki@collabora.com (v2)
Reviewed-by: John Bates <jbates@chromium.org>
A shader that writes only depth will have num_outputs > 0, but since
there are no color outputs, we must not add the swizzling.
This fixes silicon city on GLES/crosvm
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
Legacy FS shaders may use glColor and glSecondaryColor without the VS
actually emitting it. However, on GLES the interfaces between stages must
be matched, so replace FS input colors with a constant when they are not
emitted by the VS.
v2: - revert how the color_in_mask is populated
- handle back color too
- correctly appply the interface matching only on GLES (Bug reported
by David Riley).
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
This fixes shader compilation with
STAR WARS™ Knights of the Old Republic™ II: The Sith Lords
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
This is needed when the guest applications uses a compatibility
context.
v2: remove superfluous break (Italo)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
For glsl >= 140 glClipVertex is only available in compatibility context
and needs to be lowered in the last vertex stage.
In addition, reworks the handling of clip and cull distances, and add
handling for gl_PointSize to the gl_PerVertex emission.
v2: - reorder patches and remove debug messages (Rohan)
v3: - don't force require glsl 1.50 for non-last vertex stage VS (Italo)
v4: - Move expression into common if branch (John)
- fix ws (John)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
NIR-to-TGSI doesn't necessarily sort the outputs, and that breaks some
CTS tests.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: John Bates <jbates@chromium.org>
The warnings that they are unused are just silenced, but there
is actually no need for these parameters, they are not even asserted.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Ryan Neph <ryanneph@google.com>
MAYBE_UNUSED is replaced by ASSERTED. CLAMP in u_math.h is updated to
avoid a compile error.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Yiwei Zhang <zzyiwei@chromium.org>
Reviewed-by: Ryan Neph <ryanneph@google.com>
Acked-by: Gert Wollny <gert.wollny@collabora.com>
v2: cherry pick virglrenderer-specirfic e1e6d3cb ("Include sys/types.h
in p_compiler.h")
If the guest is creating texture and the memory
comes from buffer object by creating GL_TEXTURE_BUFFER,
then host creates GL_TEXTURE_BUFFER too.
No texture parameters can be set for GL_TEXTURE_BUFFER.
If there is mismatch between the guest texture format and
the host texture format, for example GL_ALPHA8(guest) and
GL_R8(host), then we can't apply swizzling for such textures.
In such case, add manually swizzling in GLSL shader generation
step.
The logic of this patch:
1. Add additional fields in shader key struct
2. During draw_vbo call check if "manual swizzling" is needed
3. If yes, the add fields in key struct and generate shader again
4. During generation of for example texelFetch instruction
in GLSL put additional instruction for swizzling
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
If the OUT[] wasn't .xyzw, then the types wouldn't match and we'd
compile fail. GLSL-to-TGSI always emitted a full vec4 write, but that
shouldn't be required.
Closes: #193
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Probably for some time now the generics are moved from index 0-31
to 9-40, and this doesn't fit the masks we were using, so use
64 bit masks.
Apparently this only triggered an assert and didn't lead to further
failures when the assertion was not enabled so that the CTS didin't
catch this.
We could also use 32 bit masks and shift the index by 9, but if
this would get us into trouble we ever decide to switch the
PIPE_CAP_TGSI_TEXCOORD in mesa/virgl.
Fixes a number of piglits from the glsl-1.10 set that otherwise trigger
an assertion.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
Cleanup and make things a little more concise by handling atomic_uint
arrays separately.
Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
When emitting GLSL for atomic_uint variables, use the binding location
and offset instead of a generic index as this might lead to cases where
the same variable is bound to two locations with different offsets
causing a linking error on the host.
This fixes:
KHR-GL43.shader_atomic_counters.basic-usage-cs
KHR-GL43.shader_atomic_counters.advanced-usage-switch-programs
Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
The GLSL spec does not mention a memoryBarrierAtomic function, and the
GLSL to TGSI compiler indicates that a TGSI_MEMBAR_ATOMIC_BUFFER is
created from GLSL's memoryBarrierAtomicCounter.
Ref: 526f7d7790/src/mesa/state_tracker/st_glsl_to_tgsi.cpp (L3737)
This fixes:
KHR-GL43.compute_shader.shared-struct
Signed-off-by: Rohan Garg <rohan.garg@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
There is also a num_in_clip_dist, so this makes it clearer what is what.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
Let the value found in the properties takes preference.
This fixes all compilation and link errors with
KHR-GL43.cull_distance.functional
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
Since we patch the shaders right away only print the shader debug output
after the conversion and the pathcing is finished. This requires that the
tcs pass-through shader printing is moved to the according function.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
By using the string buffer that automatically grows we avoid that
the argument string gets cut off at a certain size when we switch
to pass immediate texop args
v2: free buffers on early error return
Closes: #235
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Emma Anholt <emma@anholt.net>
Up until now sme of the info stored in sinfo was changed
based on the shader key, and since this info is used for
all shader variants when evaluating the key for shaders
to be linked, this may result in the wrong shader
variant being picked up.
Instead track the shader info that can be changed like this
in the shader variant itself.
Closes: #239
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Tested-by: Dave Airlie <airlied@redhat.com>
Fixes e5fabecbe0
vrend: pass texture levels per shader on GLES as uniform
v2: - only emit texlod uniform when textureQueryLevels is called
- initialize uniform location to -1 if the mask shows that
the texture lod levels arenot needed and ony test this when
uploading the data
(all suggested in a way by Chia-I Wu)
Closes: #237
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
Previously, virgl generated invalid GLSL for atomicCompSwap leading
to compile errors.
Signed-off-by: John Bates <jbates@chromium.org>
Reviewed-by: Lepton Wu <lepton@chromium.org>
Resources imported from dma-bufs as EGL images are given internal format
GL_RGB8 (24bpp) by host mesa. When placing srgb texture views on such
resources, the appropriate view format would be GL_SRGB8, but this is
not color-renderable for GL or GLES and results in an incomplete
framebuffer. Instead, GL_RGB8 must be used as the attachment format and
linear->srgb colorspace conversions must be applied manually in the frag
shader and for calls to glClearColor() involving these surfaces.
This resolves a
dEQP-EGL.functional.wide_color.window_888_colorspace_srgb test failure
for GBM-enabled hosts with newer host mesa, which imports
B8G8R8X8_UNORM and R8G8B8X8_UNORM as 24bpp instead of the more
compatible 32bpp.
Signed-off-by: Ryan Neph <ryanneph@google.com>
Reviewed-by: Lepton Wu <lepton@chromium.org>
Reviewed-by: John Bates <jbates@chromium.org>
For fragment ARB programs, the fog co-ordinate input
can be requested independently of any other part of the
graphics pipeline. Through the use of an OPTION declaration.
This can lead to a case where a fragment shader expects
a fog co-ordinate input, but it is not being supplied
by the preceding shader stage.
This patch will fix it by forcing it to 0 when it detects
the case, which should neutralize the fog color.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
These variables don't support swizzling, but are accessed as
arrays.
v2: Fix copy-paste error (David Riley)
Closes: #230
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: David Riley <davidriley@chromium.org>
This fixes all piglits from:
spec@arb_texture_query_levels
v2: use tgsi_proc_to_prefix
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Acked-by: Rohan Garg <rohan.garg@collabora.com>
This is needed to reduce the size occupied by these fields.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
Seperate more elements into the shader stages that they are used in
and evaluate them only for the stage they are relevant for.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>
Mesa clamps the number of cbufs to eight, so we can use uint8_t bitmask for
cbufs states. Be save for the future by only reporting support for
at most eight cbufs.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Rohan Garg <rohan.garg@collabora.com>