aboutsummaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/drivers/svga/svga_sampler_view.h4
-rw-r--r--src/gallium/drivers/svga/svga_state_sampler.c33
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.
*/