emit_ios handles all the shader types so that it is difficult to
follow what is emitted for which shader type. Start refactoring by
moving the common initialization into a separate function.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
We already track samplers, images and ssbos using bitmasks, so this is a
bit more familiar to the rest of the code.
Also, this is going to enable some other nifty optimizations later on.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
This just makes the code a bit more semantically strong, and reduce the
chance of typos in the future.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
TGSI_OPCODE_BFI and TGSI_OPCODE_ATOMCAS takes four source arguments,
so we actually need to support up to four members here. Luckily, the
storage passed to this function was large enough, so no actual harm
happened, just a small semantic issue when reading the source code.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This moves the body generation code to the same scheme as the
header, and fixes a lot of the printf related warnings.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This moves to using the strbuf variadic append.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This avoids all the return checks in favour of setting
the error state in the string buffer, and cleans up the
result.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This should avoid all the unnecessary return overheads, at the
expense of some extra runtime overheads in the unwanted error case.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
We definitely want to check for errors after each instruction
and after iteration and header generation.
This should allow the explicit checks to be removed now.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This converts the current string tracking code to using strbuf.
The indent code and tracking for the main + header strings is moved
over.
Now we know the string lengths this also optimises the concatentation.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Fixes error in shader generation triggered by piglit:
arb_texture_view-rendering-layers-image
(It doesn't fix the piglit itself though)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
This aligns the header generation code with the main body code as much
as possible. The glsl_hdr is now stored in the context to save the
passing around.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Use the buffer emitters, this makes sure we get the indents
right, but also makes it easier to cleanup this codebase later.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Fix the return checks.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
This is *always* going to be the same, so let's drop it. Even though
it's just a few bytes, it seems silly to store the same prefix over
and over again.
Signed-off-by: Dave Airlie <airlied@redhat.com>
If more then one input variable is tagged as requiring winsys_adjust_y then
this variable would be declared more then once and consequently compiling the
shader would fail.
Keep track of whether the variable was already declared to make sure it is emitted
only once.
Closes: #72
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Fixes: tests/spec/arb_compute_shader/execution/basic-local-id-atomic.shader_test
Reviewed-by: Robert Foss <robert.foss@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This fixes rendering in Minecraft (Java Edition), where we would
otherwise incorrectly mark a fog-inputs as flat.
While we're at it, fix a similar issue for auxprefix.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
The buffer size is not an vector, and consequently we can't add a swizzle
operator. (This was probably the reason why the write mask was only emmited
when the it was larger then 1 before).
v2: Also handle 1D and Shadow1D textures (Dave)
Fixes: 70dedae465
shader: TXQ: also emit a write mask if only one bit is set.
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
The following leaks can be triggered by running this test series:
dEQP-GLES31.functional.tessellation_geometry_interaction.feedback.*
Direct leak of 56 byte(s) in 8 object(s) allocated from:
in __interceptor_strdup (/usr/lib64/gcc/x86_64-pc-linux-gnu/7.3.0/
libasan.so+0x761c8)
in emit_so_movs ../../../../virgl-gitlab/src/vrend_shader.c:1623
in iter_instruction ../../../../virgl-gitlab/src/vrend_shader.c:3873
in tgsi_iterate_shader ../../../../../../virgl-gitlab/src/gallium/
auxiliary/tgsi/tgsi_iterate.c:53
in vrend_convert_shader ../../../../virgl-gitlab/src/vrend_shader.c:
5131
...
Direct leak of 56 byte(s) in 7 object(s) allocated from:
in __interceptor_calloc (/usr/lib64/gcc/x86_64-pc-linux-gnu/7.3.0/libasan.so+0xdba68)
in vrend_convert_shader ../../../../virgl-gitlab/src/vrend_shader.c:5109
in vrend_shader_create ../../../../virgl-gitlab/src/vrend_renderer.c:2906
in vrend_shader_select ../../../../virgl-gitlab/src/vrend_renderer.c:2958
...
Closes: #55
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
v2: remove biotcount check since it is always >0 (Dave)
Closes: #58
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Add flags tgsi,glsl,stream, and shader and change the corresponding
logging code.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
It is not necessary to emit both statements, and on a GLES 3.1 host that doesn't
support ARB_gpu_shader5 this actually breaks some shaders.
Fixes: 36c919e139
shader: rework precise-emitting for built-ins
Fixes on the softpipe host driver:
dEQP-GLES3.functional.shaders.qualification_order.variables.
valid.invariant_interp_storage
valid.invariant_interp_storage_precision
valid.invariant_storage
valid.invariant_storage_precision
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
operations
The GLES 3.1 standard already requires support for shadow samplers,
components, and offsets, so it is not needed to specify the requirement
for the extensions.
Closes: #40
Out of the tests that pass on the softpipe host and fail when runing it
through vtest/host:gles-softpipe this fixes the failures:
dEQP-GLES31.functional.texture.gather.*
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
TGSI defines TGSI_SEMANTIC_SAMPLEPOS as a 4-component vector with
Z and W set to 0. However, if we ever try to reach thez and w
compoents, we run into trouble because this is implemented as a
swizzle on gl_SamplePosition instead. And gl_SamplePosition only
has x and y.
It seems that recent versions of mesa does just this, causing
shader-compilation errors during dEQP tests.
This fixes regressions in the following tests:
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.singlesample_texture
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_texture_1
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_texture_2
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_texture_4
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_texture_8
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.singlesample_rbo
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_rbo_1
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_rbo_2
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_rbo_4
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.correctness.multisample_rbo_8
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.distribution.multisample_texture_1
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.distribution.multisample_texture_2
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.distribution.multisample_texture_4
dEQP-GLES31.functional.shaders.sample_variables.sample_pos.distribution.multisample_texture_8
dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.at_sample_position.default_framebuffer
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
TXP implements perspective correction, and uses a 4D vector as input.
Apply the according perspective correction in the 1D case and use only
the relevant components.
Closes: #34
Signed-off-by: Dave Airlie <airlied@redhat.com>
When running a GL 2.1 program in that guest on a GLES host that uses 1D
textures then the emitted shaders must not declare 1D sampler, since they
are not supported. Instead, use 2D samplers since 1D textures are emulated
by 2D textures, and also fix the texture shader call.
Closes: #33
Signed-off-by: Dave Airlie <airlied@redhat.com>
it seems that both extensions GL_OES_gpu_shader5 and
GL_OES_shader_multisample_interpolation are required to accept this
keyword on GLSL 310 ES.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
The extension is part of GLSL 320 es, but must be enabled manually for a
gles 3.1 host. Closes: #32
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
As we use that temp to address memory files, make sure it's declared.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
In 4732489 (shader: do not redeclare built-ins as precise), I confused a
mesa shader-compiler bug with a spec problem. Turns out, redeclaring
built-ins as precise is allowed by the spec, just the same as invariant
variables. And even mesa allows this.
What mesa doesn't currently allow, is to redeclare a variable as *both*
invariant *and* precise. This problem does not extend to new
declarations, where this is already handled correctly.
So, let's avoid emitting both; it's not really needed to emit both, as
they essentially have the same effect (disable reordering), just with
some different usage-semantics. And for the cases we support, these are
effectively the same.
This fixes dEQP-GLES31.functional.tessellation.common_edge.*_precise
without breaking dEQP-GLES2.functional.shaders.algorithm.hsl_to_rgb_vertex
this time.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
The enhanced layout extension allows for gaps in the streamout bindings
so we have to be able to handle no-handles in the middle of the target array.
TGSI also has to deal with components outputs where multiple outputs
can be mentioned in the TGSI. It's safe for use to just skip the
extra outputs at least for the tests I've been able to run.
Once we have those changes in place, the renderer can expose the
new CAP bit to the host without any further host extension checks.
Reviewed-by: Jakob Bornecrantz <jakob@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
The extension is already included in this GLSL version and adding it results
in compilation failures.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
In 47387e4 (emit precise keyword), I added code to try to declare
outputs as 'precise' if an instruction flagged as precise wrote to it.
Turns out, redeclaring built-ins as 'precise' isn't allowed, so that bit
was a mistake. And because mesa transforms "invariant" into instructions
with the precise-flag set, we can end up writing to built-ins with the
precise-flag, leading to shaders that doesn't compile correctly.
So let's remove the code that emits the precise-keyword when re-declaring
built-ins.
This fixes a regression in dEQP-GLES2.functional.shaders.algorithm.hsl_to_rgb_vertex
when ran right after dEQP-GLES2.functional.shaders.invariance.highp.subexpression_precision_lowp.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Just like we do for normal GL, we also need to generate the extension
require string for OpenGL ES.
This fixes dEQP-GLES31.functional.blend_equation_advanced.*
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Tested-by: Gert Wollny gert.wollny@collabora.com
Signed-off-by: Dave Airlie <airlied@redhat.com>