diff options
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/drivers/svga/svga_sampler_view.h | 4 | ||||
-rw-r--r-- | src/gallium/drivers/svga/svga_state_sampler.c | 33 |
2 files changed, 36 insertions, 1 deletions
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 */ @@ -88,6 +89,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. */ |