diff options
author | Deepak Rawat <drawat@vmware.com> | 2018-08-09 16:21:51 -0700 |
---|---|---|
committer | Deepak Rawat <drawat@vmware.com> | 2018-08-09 16:34:05 -0700 |
commit | 63ecf75d3fcac53edaa2a181b7aa186a78dc46e4 (patch) | |
tree | 20b51666ccffe45533bc2f56da277b715eb08ff0 | |
parent | 52d0ec0dffce8d6c39bc26cdf55e5e6b20f4d032 (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.h | 20 | ||||
-rw-r--r-- | vmwgfx_drv.h | 2 | ||||
-rw-r--r-- | vmwgfx_surface.c | 17 |
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; |