The name for the internal texture properies flags VIRGL_BIND_NEED-SWIZZLE
and VIRGL_BIND_CAN_TEXTURE_STORAGE is misleading, and the latter flag was
even mis-using the binding member of the texture format structure.
Rename these flags to make it clear that these are not binding flags and
correctly use the 'flags' member for CAN_TEXTURE_STORAGE. In addition, drop
adding the NEED_SWIZZLE flag to the binding in the alpha texture emulation.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
To properly use compute shaders in the guest when running on a GL ES host
it is better to advertice GLSL level 430, because otherwise compute shaders
that don't explicitely add the extension ARB_compute_shaders to the shader
will not compile.
Fixes#99
v2: Add comment about why we want to advertise this feature level (Gurchetan)
v3: Don't bypass checks for level 400
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
PIPE_BIND_CUSTOM is used for query buffers and fences by the guest.
We can safely replace VREND_RESOURCE_STORAGE_SYSTEM by
VREND_RESOURCE_STORAGE_IOVEC.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This allows a resource to use the guest pages as its storage when
the iovec is attached.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Check queries from within vrend_renderer_check_fences, after
glClientWaitSync but before write_fence. This makes sure query
results are available after the fence is waited for.
In other words, given this sequence of commands
BEGIN_QUERY > DRAW_VBO > END_QUERY > GET_QUERY_RESULT > FENCE
Waiting on the fence makes sure the query result becomes available
to the guest.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Handle these two command sequences,
VIRGL_CCMD_BEGIN_QUERY
VIRGL_CCMD_END_QUERY
VIRGL_CCMD_GET_QUERY_RESULT
VIRGL_CCMD_GET_QUERY_RESULT
or
VIRGL_CCMD_BEGIN_QUERY
VIRGL_CCMD_END_QUERY
VIRGL_CCMD_GET_QUERY_RESULT
(before the query result is available)
VIRGL_CCMD_BEGIN_QUERY
VIRGL_CCMD_END_QUERY
VIRGL_CCMD_GET_QUERY_RESULT
more carefully.
Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This patch uses GL_EXT_framebuffer_fetch_non_coherent (preferred)
or GL_EXT_framebuffer_fetch to emulate the logiops in the fragement
shader. If neither of these extension are available then only
GL_COPY, GL_COPY_INVERTED, GL_CLEAR, and GL_SET are emulated.
Fixes piglit gl-1.0-logicop on GLES hosts.
v2: Use non_coherent access when possible
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Pass a mask of the non-array generic inputs that the next shader expects
is passed to the shader that is currently converted. If, after emitting
all generic outputs, some are missing, then these are also generated.
Limitations: This doesn't take care of input arrays that may not be emitted
as outputs, but since this problem seems to be only related to IO variables
that are implicitely declared this is not a problem.
Fixes piglit: glsl-routing
v2: rebase and update names to new naming
v3: Declare TCS outputs as arrays as required
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Tested-by: Elie Tournier <elie.tournier@collabora.com> (v1)
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
If a texture is bound in a GL context the texture object will not be
destroyed by the driver even if the program using the texture freed it.
At least with mesa Gallium drivers the effect that these texture objects
also hold references to sampler views that might have been created and
destroyed in sub-contexts. Now, when a new texture is allocated and
bound to the corresponding texture target, the old texture will finally
be destroyed at this point, and by doing so it will try to access these
already destroyed sampler views, resulting in a use after free.
Consequently, unbind the texture in context 0 after it has been allocated,
so that the driver doesn't hold an additional reference to it that inhibits
its destruction of the texture when the guest program requests this.
v2: Make sure that the texture is also unbound when the allocation function
bails out with an error (Chia-I Wu)
Closes#98
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Chia-I Wu <olvaffe@gmail.com>
On one hand render_condition_enable might also be set when the
cond_render_gl_mode is empty, so no conditional rendering is
actually done and the copy path can be used. On the other hand,
on GLES rectangular textures are emulated, so the texture target
needs to be corrected, and for some reason different base formats
were required which doesn't make sense.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
The GL fallback also must be used on GLES if the target surface is
a multi-sample surface or if the region blitted from a multi-sample
surface is not equal to the target region.
This patch results in piglit reporing regressions with
multisample-blit * depth
on a GLES host. However, these piglits make bits to MS surfaces which
is not supported by glBlitFramebuffer on GLES. The old code took that
path, and mesa would actually report an error when compiled with -DDEBUG
butthe piglits still reported success. Unfortunately, resolving the MS
propperly is quite a challange for depth textures, and requires information
that is not available in the blit info (zNear and zFar), so getting these
piglits to act correcly on GLES hosts seems quite impossible.
v2: Also use fallback on GLES if the source is multi-sample and the formats
of source and dest are not equal
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
With that the srgb <-> linear handling can be simplified.
v2: Don't use texture views when TextureStorage can't be used to create
the texture, because then it is not immutable.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
later we need this function in the blitter
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
v2: Don't use texture views if the texture of the format can't be
allocated by using TextureStorage, since then it is not immutable
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
On GL 4.4 (and GLES with EXT_sRGB_write_control) blits will decode and
encode sRGB when GL_FRAMEBUFFER_SRGB is supported, and they don't decode
when it isn't supported. Enabling or disabling this is signalled from
the guest by using the according surfaces.
In summary, there is no need to use the GL fallback for a blit decoding
sRGB, because this can also be handled in a normal blit.
Fixes piglits on a GL host:
blit texture srgb_to_linear downsample enabled render
blit renderbuffer srgb_to_linear msaa enabled render
blit renderbuffer srgb_to_linear msaa enabled clear
blit renderbuffer srgb_to_linear downsample enabled clear
v2: Fix typo in commit message (Erik)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
The GL_EXT_color_buffer_float exptension spec defines that glReadPixels
can be done with the combination of GL_RGBA and GL_FLOAT, which matches
what OpenGL ES 3.2 allows. So let's enable the readback-format in this
case.
Thanks to Gert Wollny for pointing this out.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
On D-GL a program may contain a TE shader but no TC shader. On GLES either
both or none of TES and TCS need to be available. So if the guest sends a
shader program without a TCS, inject a passthrough shader using the
patch parameters given in the GL code.
Closes#84
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Given a source and destination image, consider the following sequence
of events:
1) glTexImage with src
2) virgl_resource_copy_region copies src to dst using GL
3) mesa attempts to readback dst, which returns the correct
result with vrend_transfer_send_getteximage only
Commands that reproduce this scenario on i965/qemu:
./bin/arb_copy_image-formats -auto
./bin/fbo-generatemipmap-formats GL_ARB_texture_float -auto
Signed-off-by: Gurchetan Singh <gurchetansingh@chromium.org>
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Closes: #74
v2: * Enable enhanced layouts in the guest only when the host supports
it, because with indirect arrays enabled we re-emit the layout
the guest send.
* enable indirect arrays independently from the host capabilities
(following Eriks comments)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-By: Gurchetan Singh <gurchetansingh@chromium.org>
Also check for GL_EXT_polygon_offset_clamp when deciding whether the
corresponding virgl feature is supported. This enables D3D11 in guest
Wine (and thus Steam/Proton), when running on GLES hosts that support
this extension.
Signed-off-by: Alexandros Frantzis <alexandros.frantzis@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This is useful for knowing if we can expose
KHR_texture_compression_astc_sliced_3d in the guest.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
The piglits and KHR tests that use TF3 (i.e. multiple output
streams) tend to hang, and since the GLES host doesn't support
this but we lie about the GLSL version it is better to signal
the guest correctly that this is not supported.
v2: Set flag only on caps v2 code path, otherwise we might read
from uninitialized memory
v3: Increment feature check version to indicate that the TF3
feature flag is valid.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
In order to properly propagate the output masks to the inputs of the next
shader the shader slection has do be done in the order the shaders will be
called later.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
This is useful to avoid unsupported format-conversions on GLES.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This code-path is never going to work on GLES, so let's avoid trying.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This just removes some duplicate complexity, and adds a few asserts to
notice format-list mismatches earlier.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This adds the support for ARB_indirect_parameters extension
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
The mesa state tracker can emulate this, but we should pass
it through properly to the host in case it has a more efficent path.
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
When I added indirect draw support, I forgot to add support
for the binding flag for command args, we need this later,
but in order to introduce support without breaking things,
we should fix the bug first and add a separate cap for it.
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
When we add new feature checks on the host side that is used to enable
a cap conditionally in the guest that was enabled unconditionally before
we might end up with a feature regression when a new mesa version is
used with an old virglrenderer version that doesn't check for that cap.
To work around this problem add a version id to the caps that corresponds
to the features that are actually checked on the host so that it can be
checked in the guest whether this cap was actually checked for or whether
it should be enabled unconditionally.
The id should be incremented whenever a new feature check is added that
might result in a feature regression in the guest when run on an old host.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Pohsien Wang <pwang@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
The shaders are issued backwards starting from the fragment
shader and, therefore, in the first pass when we fill out
the shader keys for the TES no TCS will be present.
So don't bail out in this case and assume there is a VS.
Later, when the VS shader is compiled it will check whether
a TES is present without a TCS and report the error.
Fixes: 956a6ceb8d
shader: Pass information about the layout of generics and patches to the next stage
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: <Gurchetan Singh gurchetansingh@chromium.org>
Softpipe doesn't support ARB_GLES3_1_compatibility but can support
NV_shader_atomic_float and this is needed for some dEQP-GLES31 tests to be
run on a softpipe GL host.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
(u|i)mulExtended are provided by ARB_gpu_shaders5 but also by
MESA_shader_integer_functions and only the latter is supported by softpipe
so fall back to this extension if needed.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
This is needed for using the right extension in the shaders.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
On GLES GL_EXT_disjoint_timer_query provides this functionality, so we
should make use of it.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Makes things a tiny bit more consistent and easier to read.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
[airlied: rebased and fixed these up]
Signed-off-by: Dave Airlie <airlied@redhat.com>
Use explicit named initializers for the enum to string mappings.
Makes the code tiny bit easier to follow and grep through.
Signed-off-by: Emil Velikov <emil.velikov@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
[airlied: rebased these and fix up the fallout]
Signed-off-by: Dave Airlie <airlied@redhat.com>
This fixes running Metro Redux 2033 on the GLES host.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Fixes:
KHR-GL41.viewport_array.dynamic_viewport_index
KHR-GL41.viewport_array.draw_mulitple_viewports_with_single_invocation
when run in a batch as KHR-GL41.viewport_array.*
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
With OES_viewport_array available the depth ranges can also be set
on GLES.
Fixes on GLES when run individually:
KHR-GL41.viewport_array.*
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Apart from fp64 about which we lie aynway the features required by
GLSL level 4.10 on top of 4.00 can be supported by GLES, so report
this higher feature level and it will give us GL 4.1 in the guest.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This enables indexed access to viewports on GLES hosts.
v2: Also add the extension to shaders when needed
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This helps a lot locating errors in the shaders.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Check args of the following function:
- vrend_decode_set_vertex_buffers
- vrend_decode_set_shader_buffers
- vrend_decode_set_atomic_buffers
- vrend_decode_set_shader_images
And change variable type to uint as the protocol should never send negative number.
Reviewed-by: Dave Airlie <airlied@redhat.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>