Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9261b30 authored by Deepak Rawat's avatar Deepak Rawat Committed by Thomas Hellstrom
Browse files

drm/vmwgfx: Add support for multisampling



Support for SVGA3D_SURFACE_MULTISAMPLE and surface mob size according
to sample count.

Signed-off-by: default avatarDeepak Rawat <drawat@vmware.com>
Reviewed-by: default avatarSinclair Yeh <syeh@vmware.com>
Reviewed-by: default avatarBrian Paul <brianp@vmware.com>
Reviewed-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: default avatarCharmaine Lee <charmainel@vmware.com>
Signed-off-by: default avatarThomas Hellstrom <thellstrom@vmware.com>
parent 14b1c33e
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -83,7 +83,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 {
+13 −4
Original line number Diff line number Diff line
@@ -1399,6 +1399,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;

@@ -1481,11 +1482,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,
		svga3dsurface_get_serialized_size_extended(srf->format,
							   srf->base_size,
							   srf->mip_levels[0],
						  num_layers);
							   num_layers,
							   sample_count);

	if (srf->flags & SVGA3D_SURFACE_BIND_STREAM_OUTPUT)
		srf->res.backup_size += sizeof(SVGA3dDXSOState);
@@ -1595,6 +1600,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;