summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDeepak Rawat <drawat@vmware.com>2018-08-09 16:21:51 -0700
committerDeepak Rawat <drawat@vmware.com>2018-08-09 16:34:05 -0700
commit63ecf75d3fcac53edaa2a181b7aa186a78dc46e4 (patch)
tree20b51666ccffe45533bc2f56da277b715eb08ff0
parent52d0ec0dffce8d6c39bc26cdf55e5e6b20f4d032 (diff)
vmwgfx: Add support for multisampling
Support for SVGA3D_SURFACE_MULTISAMPLE and surface mob size according to sample count. Signed-off-by: Deepak Rawat <drawat@vmware.com> Reviewed-by: Sinclair Yeh <syeh@vmware.com> Reviewed-by: Brian Paul <brianp@vmware.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com> Reviewed-by: Charmaine Lee <charmainel@vmware.com> Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
-rw-r--r--device_include/svga3d_surfacedefs.h20
-rw-r--r--vmwgfx_drv.h2
-rw-r--r--vmwgfx_surface.c17
3 files changed, 34 insertions, 5 deletions
diff --git a/device_include/svga3d_surfacedefs.h b/device_include/svga3d_surfacedefs.h
index e05149d..4a07431 100644
--- a/device_include/svga3d_surfacedefs.h
+++ b/device_include/svga3d_surfacedefs.h
@@ -1235,6 +1235,26 @@ svga3dsurface_get_serialized_size(SVGA3dSurfaceFormat format,
return total_size * num_layers;
}
+/**
+ * svga3dsurface_get_serialized_size_extended - Returns the number of bytes
+ * required for a surface with given parameters. Support for sample count.
+ */
+static inline u32
+svga3dsurface_get_serialized_size_extended(SVGA3dSurfaceFormat format,
+ surf_size_struct base_level_size,
+ u32 num_mip_levels,
+ u32 num_layers,
+ u32 num_samples)
+{
+ uint64_t total_size =
+ svga3dsurface_get_serialized_size(format,
+ base_level_size,
+ num_mip_levels,
+ num_layers);
+ total_size *= max_t(u32, 1, num_samples);
+
+ return min_t(uint64_t, total_size, (uint64_t)U32_MAX);
+}
/**
* svga3dsurface_get_pixel_offset - Compute the offset (in bytes) to a pixel
diff --git a/vmwgfx_drv.h b/vmwgfx_drv.h
index 765ede5..093b623 100644
--- a/vmwgfx_drv.h
+++ b/vmwgfx_drv.h
@@ -82,7 +82,7 @@
struct vmw_fpriv {
struct drm_master *locked_master;
struct ttm_object_file *tfile;
- bool gb_aware;
+ bool gb_aware; /* user-space is guest-backed aware */
};
struct vmw_buffer_object {
diff --git a/vmwgfx_surface.c b/vmwgfx_surface.c
index 6a8d04f..646a375 100644
--- a/vmwgfx_surface.c
+++ b/vmwgfx_surface.c
@@ -1396,6 +1396,7 @@ int vmw_surface_gb_priv_define(struct drm_device *dev,
struct vmw_surface *srf;
int ret;
u32 num_layers = 1;
+ u32 sample_count = 1;
*srf_out = NULL;
@@ -1478,11 +1479,15 @@ int vmw_surface_gb_priv_define(struct drm_device *dev,
else if (svga3d_flags & SVGA3D_SURFACE_CUBEMAP)
num_layers = SVGA3D_MAX_SURFACE_FACES;
+ if (srf->flags & SVGA3D_SURFACE_MULTISAMPLE)
+ sample_count = srf->multisample_count;
+
srf->res.backup_size =
- svga3dsurface_get_serialized_size(srf->format,
- srf->base_size,
- srf->mip_levels[0],
- num_layers);
+ svga3dsurface_get_serialized_size_extended(srf->format,
+ srf->base_size,
+ srf->mip_levels[0],
+ num_layers,
+ sample_count);
if (srf->flags & SVGA3D_SURFACE_BIND_STREAM_OUTPUT)
srf->res.backup_size += sizeof(SVGA3dDXSOState);
@@ -1592,6 +1597,10 @@ vmw_gb_surface_define_internal(struct drm_device *dev,
return -EINVAL;
}
+ if ((svga3d_flags_64 & SVGA3D_SURFACE_MULTISAMPLE) &&
+ req->base.multisample_count == 0)
+ return -EINVAL;
+
if (req->base.mip_levels > DRM_VMW_MAX_MIP_LEVELS)
return -EINVAL;