A transfer won't occur in context zero if the transfer command
comes from submit_cmd. We need to restore prior state.
With the recent framebuffer binding cleanups, we really only need
to worry about the framebuffer.
Reviewed-by: Gert Wollny <gert.wollny@collabora.com>
d9a4be4d0a broke a number of tests
when running on a GLES host because tgsitargettogltarget may
return PIPE_BUFFER which is 0. So, instead of simply reverting the commit
make it more explicit that we check for PIPE_BUFFER to make it clearer
that this condition may actually trigger.
Reviewed-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Instead of enumerating all the GL buffer types, just use the
is_buffer flag.
Reviewed-by: Elie Tournier <elie.tournier@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This uses the string array helpers to pass around the glsl strings
for the program.
This could be expanded on to provide more than 2 strings easily
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
We can't cache the current states on the texture-view, as multiple views
can point to the same texture. Instead, we need to cache the state on
the texture.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Fixes: 8d288c4 ("vrend: update texture state on a per view base")
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
tgsitargettogltarget never returns a value that evaluates to zero, so
this condition can't trigger. Let's drop the code.
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>
Texture views with emulated alpha also needs to get their border-color
swizzled. So let's check the texture-view instead of the resource.
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>
This is going to make a difference for the next patch.
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>
Using GLenum here makes it sound like this is used for OpenGL formats,
and not for pipe_format, which it really is. So let's change the type to
reflect what it really is.
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>
This toggle only affect fixed-function fragment-shading, which we don't
use at all. So let's not waste time setting unused state.
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>
We shouldn't call glTexBuffer unless we know the feature is enabled,
otherwise a rouge client might be able to crash the host.
Signed-off-by: Erik Faye-Lund <erik.faye-lund@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
[airlied: fix whitespace]
Signed-off-by: Dave Airlie <airlied@redhat.com>
v2: Instead of releasing the UBO's at the end don't reference count them.
The guest keeps track of these resources and their reference counts,
so it will not release the UBO's without re-setting the binding during
the live time of a client progra, However, at final clean up the UBO's
are not rebound before the resourse is released in the guest side resulting
in the memory leak. When we skip the ref-counting on the host side the
resourses are cleaned up correctly without breaking the program otherwise.
Fixes resource leaks:
Direct leak of 2448 byte(s) in 9 object(s) allocated from:
#0 0x7fe3151aba68 in __interceptor_calloc (/usr/lib64/gcc/x86_64-pc-linux-gnu/7.3.0/libasan.so+0xdba68)
#1 0x7fe314b89ea6 in vrend_renderer_resource_create ../../../../virgl-gitlab/src/vrend_renderer.c:5834
#2 0x7fe314b52b44 in virgl_renderer_resource_create ../../../../virgl-gitlab/src/virglrenderer.c:63
#3 0x560533f27852 in vtest_create_resource2 ../../../../virgl-gitlab/vtest/vtest_renderer.c:432
#4 0x560533f254fa in vtest_main_run_renderer ../../../../virgl-gitlab/vtest/vtest_server.c:359
#5 0x560533f244df in main ../../../../virgl-gitlab/vtest/vtest_server.c:105
#6 0x7fe313919ac9 in __libc_start_main (/lib64/libc.so.6+0x21ac9)
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This is helpful to get the name of the guest program that may trigger a
memory leak. One can also pass a custom string as program name by setting
the environment variable GALLIUM_PROCESS_NAME in the guest accordingly.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This way all output originating from virglrenderer will be redirected.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: David Riley <davidriley@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This patch adds the infrastructure and replaces the debug calls to fprintf
by calls to vrend_printf that internally may be redirected.
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Reviewed-by: David Riley <davidriley@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Signed-off-by: Dave Airlie <airlied@redhat.com>
We need to dirty the compute shader if we bind a new non-compute program,
this fixes a bug in the qbo tests when qbo is merged.
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
There's no point in keeping updating all the constant buffers for every
draw; we only need to update those who has changed since last draw.
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 allows us to allocate UBO ids based on the linked result, rather
than the currently bound UBOs. This gives us a per-program stable
result, which means we don't need to keep updating them.
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>
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>
We shouldn't clobber this state any more, so this assumption should be
safe.
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
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>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Both of these functions clobber the framebuffer-binding on
general-purpose GL contexts, which is bad for performance.
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
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>
Signed-off-by: Dave Airlie <airlied@redhat.com>
This is already handled by calling vrend_hw_switch_context with the
now-argument as true, as we do one line above.
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
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>
Signed-off-by: Dave Airlie <airlied@redhat.com>
When the host GL version is < 4.0 then the GLSL shader language level is set
to a value below 400, but if geometry shaders, tesselation shaders, and the
gpu_shader5 are supported, then we can expect that the GLSL language level
400 is actually supported, so advertice it also on a GL host.
Tested-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>
depth_clamp is actually provided also by the extensions GL_ARB_depth_clamp or
GL_NV_depth_clamp, so lets also use these to test for this functionality.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
GL_FRAMEBUFFER_SRGB is available on desktop GL and also when GLES exposes
the extension EXT_sRGB_write control. Add a feature to handle the use
of GL_FRAMEBUFFER_SRGB accordingly.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
This adds a new api to set/get a private pointer.
v2: add private ptr test
Reviewed-By: Gert Wollny <gert.wollny@collabora.com>
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>
There's no point in eagerly setting the blend-state, when we need to
also know the framebuffers to get it right.
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>
In the only codepath that leads here, this exact binding has already
been made, so let's avoid double-work.
This one makes sense on it's own.
Signed-off-by: Dave Airlie <airlied@redhat.com>
This is only updated from one place, and it's usually going to stay
zero. So let's cache it to prevent excessive state emission.
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>
This is always passed as zero, so let's make the code a bit easier to
grok by removing this unused argument. We still need to pass zero to the
externally passed callback, though.
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>
This should help a bit with CPU overhead when running on top of OpenGL 4.4
(or newer).
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>
When changing the from a one-by-one upload to an array upload the test for the
array pointer to the uniform IDs was replaced by testing the uniform array ID
against -1. However, this is not enough, because when the context is allocated
all is cleared to zero, and apparently the structure is re-used in different
invocations of shader programs. Here, one shader might have been removed but
the const field was still allocated resulting in a sigsegv. This happens e.g.
by running
dEQP-GLES31.functional.primitive_bounding_box.wide_points.
global_state.vertex_tessellation_geometry_fragment.fbo_bbox_larger
global_state.vertex_tessellation_geometry_fragment.fbo_bbox_smaller
tessellation_set_per_draw.vertex_tessellation_fragment.default_framebuffer_bbox_equal
tessellation_set_per_draw.vertex_tessellation_fragment.default_framebuffer_bbox_larger
resulting in
AddressSanitizer: SEGV on unknown address 0x00000000001c
The signal is caused by a READ memory access.
Hint: address points to the zero page.
#0 0x7f595b9eb875 in vrend_draw_bind_const_shader src/vrend_renderer.c:3677
#1 0x7f595b9ed37f in vrend_draw_bind_objects src/vrend_renderer.c:3810
Work around this by checking whether the shader type data is allocated.
Fixes: 172c9679b4
vrend/shader: handle uniforms as array
Tested-by: Jakob Bornecrantz <jakob@collabora.com>
Acked-by: Jakob Bornecrantz <jakob@collabora.com>
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
The sub-context holds a pointer to the last shader program used and this
is de-referenced , e.g. in vrend_vbo_draw. However, the guest may destroy
the program without notifying the sub-context, and as a result the pointer
becomes stale and may ber used after free.
As a solution add a pointer to the owning context when a program is
referenced and if the program gets destroyed, clean the pointer in the sub-context.
Closes: #52
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
In the shaders the uniforms are allocated as arrays, and they are also
passed from the guest as arrays, so let's also upload them to the host
driver as arrays.
Performance improvement (both measurements used Gurchetan's mesa/virgl
patches to improve transfers):
Measurements on r600 (AMD 6870 HD)
Unigine Valley (1024x768, Q:High, AA:2x)
Unigine Heaven (1024x768, Q:High, Tess: Disabled, AA:2x)
Unigine Valley Unigine Heaven
without 20.2 26.1
with this patch 22.0 31.5
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>
Also use memcpy to copy the constats. These two things might shave of some
cycles but the measureable performance benefit is marginal.
v2: Avoid the memcpy that ralloc does when increasing the size, the data
is overwritten anyway.
Reviewed-by: Gurchetan Singh <gurchetansingh@chromium.org>
Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Signed-off-by: Jakob Bornecrantz <jakob@collabora.com>