svga: simplify/improve the format compatibility check for region copies

The util_is_format_compatible() function didn't quite do what we wanted
for vgpu10.  This check is more flexible and allows copies between
formats such as R32G32B32A32_FLOAT and R32G32B32A32_INT.

Reviewed-by: Charmaine Lee <charmainel@vmware.com>
This commit is contained in:
Brian Paul 2016-09-20 17:36:32 -06:00
parent 2ad4ba0727
commit c42000545d
1 changed files with 25 additions and 5 deletions

View File

@ -26,6 +26,7 @@
#include "svga_context.h"
#include "svga_debug.h"
#include "svga_cmd.h"
#include "svga_format.h"
#include "svga_resource_buffer.h"
#include "svga_resource_texture.h"
#include "svga_surface.h"
@ -208,6 +209,27 @@ svga_resource_copy_region(struct pipe_context *pipe,
}
/**
* Are the given pipe formats compatible, in terms of vgpu10's
* PredCopyRegion() command?
*/
static bool
formats_compatible(const struct svga_screen *ss,
enum pipe_format src_fmt,
enum pipe_format dst_fmt)
{
SVGA3dSurfaceFormat src_svga_fmt, dst_svga_fmt;
src_svga_fmt = svga_translate_format(ss, src_fmt, PIPE_BIND_SAMPLER_VIEW);
dst_svga_fmt = svga_translate_format(ss, dst_fmt, PIPE_BIND_SAMPLER_VIEW);
src_svga_fmt = svga_typeless_format(src_svga_fmt);
dst_svga_fmt = svga_typeless_format(dst_svga_fmt);
return src_svga_fmt == dst_svga_fmt;
}
/**
* The state tracker implements some resource copies with blits (for
* GL_ARB_copy_image). This function checks if we should really do the blit
@ -248,11 +270,9 @@ can_blit_via_copy_region_vgpu10(struct svga_context *svga,
blit_info->scissor_enable)
return false;
/* check that src/dst surface formats are compatible for
the VGPU device.*/
return util_is_format_compatible(
util_format_description(blit_info->src.resource->format),
util_format_description(blit_info->dst.resource->format));
return formats_compatible(svga_screen(svga->pipe.screen),
blit_info->src.resource->format,
blit_info->dst.resource->format);
}