Skip to content

Commit 26b8287

Browse files
deepak-rawatRoland Scheidegger
authored andcommitted
drm/vmwgfx: Split surface metadata from struct vmw_surface
Create a new structure vmw_surface_metadata representing the metadata used for creating surface. With this can make the surface_define_priv a bit cleaner. Signed-off-by: Deepak Rawat <[email protected]> Reviewed-by: Brian Paul <[email protected]> Reviewed-by: Thomas Hellström (VMware) <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]> Signed-off-by: Roland Scheidegger <[email protected]>
1 parent e8bead9 commit 26b8287

File tree

4 files changed

+202
-154
lines changed

4 files changed

+202
-154
lines changed

drivers/gpu/drm/vmwgfx/vmwgfx_drv.h

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -225,24 +225,56 @@ struct vmw_cursor_snooper {
225225
struct vmw_framebuffer;
226226
struct vmw_surface_offset;
227227

228-
struct vmw_surface {
229-
struct vmw_resource res;
230-
SVGA3dSurfaceAllFlags flags;
231-
uint32_t format;
232-
uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES];
228+
/**
229+
* struct vmw_surface_metadata - Metadata describing a surface.
230+
*
231+
* @flags: Device flags.
232+
* @format: Surface SVGA3D_x format.
233+
* @mip_levels: Mip level for each face. For GB first index is used only.
234+
* @multisample_count: Sample count.
235+
* @multisample_pattern: Sample patterns.
236+
* @quality_level: Quality level.
237+
* @autogen_filter: Filter for automatically generated mipmaps.
238+
* @array_size: Number of array elements for a 1D/2D texture. For cubemap
239+
texture number of faces * array_size. This should be 0 for pre
240+
SM4 device.
241+
* @num_sizes: Size of @sizes. For GB surface this should always be 1.
242+
* @base_size: Surface dimension.
243+
* @sizes: Array representing mip sizes. Legacy only.
244+
* @scanout: Whether this surface will be used for scanout.
245+
*
246+
* This tracks metadata for both legacy and guest backed surface.
247+
*/
248+
struct vmw_surface_metadata {
249+
u64 flags;
250+
u32 format;
251+
u32 mip_levels[DRM_VMW_MAX_SURFACE_FACES];
252+
u32 multisample_count;
253+
u32 multisample_pattern;
254+
u32 quality_level;
255+
u32 autogen_filter;
256+
u32 array_size;
257+
u32 num_sizes;
233258
struct drm_vmw_size base_size;
234259
struct drm_vmw_size *sizes;
235-
uint32_t num_sizes;
236260
bool scanout;
237-
uint32_t array_size;
238-
/* TODO so far just a extra pointer */
261+
};
262+
263+
/**
264+
* struct vmw_surface: Resource structure for a surface.
265+
*
266+
* @res: The base resource for this surface.
267+
* @metadata: Metadata for this surface resource.
268+
* @snooper: Cursor data. Legacy surface only.
269+
* @offsets: Legacy surface only.
270+
* @view_list: List of views bound to this surface.
271+
*/
272+
struct vmw_surface {
273+
struct vmw_resource res;
274+
struct vmw_surface_metadata metadata;
239275
struct vmw_cursor_snooper snooper;
240276
struct vmw_surface_offset *offsets;
241-
SVGA3dTextureFilter autogen_filter;
242-
uint32_t multisample_count;
243277
struct list_head view_list;
244-
SVGA3dMSPattern multisample_pattern;
245-
SVGA3dMSQualityLevel quality_level;
246278
};
247279

248280
struct vmw_marker_queue {

drivers/gpu/drm/vmwgfx/vmwgfx_kms.c

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -905,14 +905,14 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
905905
*/
906906

907907
/* Surface must be marked as a scanout. */
908-
if (unlikely(!surface->scanout))
908+
if (unlikely(!surface->metadata.scanout))
909909
return -EINVAL;
910910

911-
if (unlikely(surface->mip_levels[0] != 1 ||
912-
surface->num_sizes != 1 ||
913-
surface->base_size.width < mode_cmd->width ||
914-
surface->base_size.height < mode_cmd->height ||
915-
surface->base_size.depth != 1)) {
911+
if (unlikely(surface->metadata.mip_levels[0] != 1 ||
912+
surface->metadata.num_sizes != 1 ||
913+
surface->metadata.base_size.width < mode_cmd->width ||
914+
surface->metadata.base_size.height < mode_cmd->height ||
915+
surface->metadata.base_size.depth != 1)) {
916916
DRM_ERROR("Incompatible surface dimensions "
917917
"for requested mode.\n");
918918
return -EINVAL;
@@ -941,7 +941,7 @@ static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
941941
* For DX, surface format validation is done when surface->scanout
942942
* is set.
943943
*/
944-
if (!has_sm4_context(dev_priv) && format != surface->format) {
944+
if (!has_sm4_context(dev_priv) && format != surface->metadata.format) {
945945
DRM_ERROR("Invalid surface format for requested mode.\n");
946946
return -EINVAL;
947947
}
@@ -2516,7 +2516,7 @@ int vmw_kms_update_proxy(struct vmw_resource *res,
25162516
int increment)
25172517
{
25182518
struct vmw_private *dev_priv = res->dev_priv;
2519-
struct drm_vmw_size *size = &vmw_res_to_srf(res)->base_size;
2519+
struct drm_vmw_size *size = &vmw_res_to_srf(res)->metadata.base_size;
25202520
struct {
25212521
SVGA3dCmdHeader header;
25222522
SVGA3dCmdUpdateGBImage body;

drivers/gpu/drm/vmwgfx/vmwgfx_stdu.c

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ static void vmw_stdu_bo_cpu_commit(struct vmw_kms_dirty *dirty)
590590
return;
591591

592592
/* Assume we are blitting from Guest (bo) to Host (display_srf) */
593-
dst_pitch = stdu->display_srf->base_size.width * stdu->cpp;
593+
dst_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp;
594594
dst_bo = &stdu->display_srf->res.backup->base;
595595
dst_offset = ddirty->top * dst_pitch + ddirty->left * stdu->cpp;
596596

@@ -1058,8 +1058,9 @@ vmw_stdu_primary_plane_prepare_fb(struct drm_plane *plane,
10581058
vfb = vmw_framebuffer_to_vfb(new_fb);
10591059
new_vfbs = (vfb->bo) ? NULL : vmw_framebuffer_to_vfbs(new_fb);
10601060

1061-
if (new_vfbs && new_vfbs->surface->base_size.width == hdisplay &&
1062-
new_vfbs->surface->base_size.height == vdisplay)
1061+
if (new_vfbs &&
1062+
new_vfbs->surface->metadata.base_size.width == hdisplay &&
1063+
new_vfbs->surface->metadata.base_size.height == vdisplay)
10631064
new_content_type = SAME_AS_DISPLAY;
10641065
else if (vfb->bo)
10651066
new_content_type = SEPARATE_BO;
@@ -1082,38 +1083,41 @@ vmw_stdu_primary_plane_prepare_fb(struct drm_plane *plane,
10821083

10831084
switch (new_fb->format->cpp[0]*8) {
10841085
case 32:
1085-
content_srf.format = SVGA3D_X8R8G8B8;
1086+
content_srf.metadata.format = SVGA3D_X8R8G8B8;
10861087
break;
10871088

10881089
case 16:
1089-
content_srf.format = SVGA3D_R5G6B5;
1090+
content_srf.metadata.format = SVGA3D_R5G6B5;
10901091
break;
10911092

10921093
case 8:
1093-
content_srf.format = SVGA3D_P8;
1094+
content_srf.metadata.format = SVGA3D_P8;
10941095
break;
10951096

10961097
default:
10971098
DRM_ERROR("Invalid format\n");
10981099
return -EINVAL;
10991100
}
11001101

1101-
content_srf.flags = 0;
1102-
content_srf.mip_levels[0] = 1;
1103-
content_srf.multisample_count = 0;
1104-
content_srf.multisample_pattern =
1102+
content_srf.metadata.flags = 0;
1103+
content_srf.metadata.mip_levels[0] = 1;
1104+
content_srf.metadata.multisample_count = 0;
1105+
content_srf.metadata.multisample_pattern =
11051106
SVGA3D_MS_PATTERN_NONE;
1106-
content_srf.quality_level = SVGA3D_MS_QUALITY_NONE;
1107+
content_srf.metadata.quality_level =
1108+
SVGA3D_MS_QUALITY_NONE;
11071109
} else {
11081110
content_srf = *new_vfbs->surface;
11091111
}
11101112

11111113
if (vps->surf) {
1112-
struct drm_vmw_size cur_base_size = vps->surf->base_size;
1114+
struct drm_vmw_size cur_base_size =
1115+
vps->surf->metadata.base_size;
11131116

11141117
if (cur_base_size.width != display_base_size.width ||
11151118
cur_base_size.height != display_base_size.height ||
1116-
vps->surf->format != content_srf.format) {
1119+
vps->surf->metadata.format !=
1120+
content_srf.metadata.format) {
11171121
WARN_ON(vps->pinned != 0);
11181122
vmw_surface_unreference(&vps->surf);
11191123
}
@@ -1125,15 +1129,15 @@ vmw_stdu_primary_plane_prepare_fb(struct drm_plane *plane,
11251129
(crtc->dev,
11261130
/* Kernel visible only */
11271131
0,
1128-
content_srf.flags,
1129-
content_srf.format,
1132+
content_srf.metadata.flags,
1133+
content_srf.metadata.format,
11301134
true, /* a scanout buffer */
1131-
content_srf.mip_levels[0],
1132-
content_srf.multisample_count,
1135+
content_srf.metadata.mip_levels[0],
1136+
content_srf.metadata.multisample_count,
11331137
0,
11341138
display_base_size,
1135-
content_srf.multisample_pattern,
1136-
content_srf.quality_level,
1139+
content_srf.metadata.multisample_pattern,
1140+
content_srf.metadata.quality_level,
11371141
&vps->surf);
11381142
if (ret != 0) {
11391143
DRM_ERROR("Couldn't allocate STDU surface.\n");
@@ -1311,7 +1315,7 @@ vmw_stdu_bo_populate_update_cpu(struct vmw_du_update_plane *update, void *cmd,
13111315
diff.cpp = stdu->cpp;
13121316

13131317
dst_bo = &stdu->display_srf->res.backup->base;
1314-
dst_pitch = stdu->display_srf->base_size.width * stdu->cpp;
1318+
dst_pitch = stdu->display_srf->metadata.base_size.width * stdu->cpp;
13151319
dst_offset = bb->y1 * dst_pitch + bb->x1 * stdu->cpp;
13161320

13171321
src_bo = &vfbbo->buffer->base;

0 commit comments

Comments
 (0)