svga: add new svga_check_sampler_framebuffer_resource_collision()

Reviewed-by: Neha Bhende <bhenden@vmware.com>
This commit is contained in:
Brian Paul 2016-08-25 18:01:57 -06:00
parent d3d20d650d
commit ff500ed5a1
2 changed files with 36 additions and 1 deletions

View File

@ -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);

View File

@ -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.