From ff500ed5a1287eadc06fc19661f0aad8767b664d Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Thu, 25 Aug 2016 18:01:57 -0600 Subject: [PATCH] svga: add new svga_check_sampler_framebuffer_resource_collision() Reviewed-by: Neha Bhende --- src/gallium/drivers/svga/svga_sampler_view.h | 4 +++ src/gallium/drivers/svga/svga_state_sampler.c | 33 ++++++++++++++++++- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/gallium/drivers/svga/svga_sampler_view.h b/src/gallium/drivers/svga/svga_sampler_view.h index 15f2313c4c9..b36f089263a 100644 --- a/src/gallium/drivers/svga/svga_sampler_view.h +++ b/src/gallium/drivers/svga/svga_sampler_view.h @@ -104,6 +104,10 @@ svga_check_sampler_view_resource_collision(struct svga_context *svga, struct svga_winsys_surface *res, unsigned shader); +boolean +svga_check_sampler_framebuffer_resource_collision(struct svga_context *svga, + enum pipe_shader_type shader); + enum pipe_error svga_validate_pipe_sampler_view(struct svga_context *svga, struct svga_pipe_sampler_view *sv); diff --git a/src/gallium/drivers/svga/svga_state_sampler.c b/src/gallium/drivers/svga/svga_state_sampler.c index 420a5667efb..55bed027b57 100644 --- a/src/gallium/drivers/svga/svga_state_sampler.c +++ b/src/gallium/drivers/svga/svga_state_sampler.c @@ -40,9 +40,10 @@ #include "svga_format.h" #include "svga_resource_buffer.h" #include "svga_resource_texture.h" +#include "svga_sampler_view.h" #include "svga_shader.h" #include "svga_state.h" -#include "svga_sampler_view.h" +#include "svga_surface.h" /** Get resource handle for a texture or buffer */ @@ -87,6 +88,36 @@ svga_check_sampler_view_resource_collision(struct svga_context *svga, } +/** + * Check if there are any resources that are both bound to a render target + * and bound as a shader resource for the given type of shader. + */ +boolean +svga_check_sampler_framebuffer_resource_collision(struct svga_context *svga, + enum pipe_shader_type shader) +{ + struct svga_surface *surf; + unsigned i; + + for (i = 0; i < svga->curr.framebuffer.nr_cbufs; i++) { + surf = svga_surface(svga->curr.framebuffer.cbufs[i]); + if (surf && + svga_check_sampler_view_resource_collision(svga, surf->handle, + shader)) { + return TRUE; + } + } + + surf = svga_surface(svga->curr.framebuffer.zsbuf); + if (surf && + svga_check_sampler_view_resource_collision(svga, surf->handle, shader)) { + return TRUE; + } + + return FALSE; +} + + /** * Create a DX ShaderResourceSamplerView for the given pipe_sampler_view, * if needed. -- 2.30.2