From 8b756a0d0e5e6abd4ded2efced54017f2b8d696e Mon Sep 17 00:00:00 2001 From: Maaz Mombasawala Date: Wed, 14 Feb 2024 14:36:35 -0800 Subject: [PATCH] svga: Replace shared surface flag and simplify surface creation The shared flag vmw_svga_winsys_surface was used to create shareable surfaces and these surfaces are not discarded. Since all surfaces created right now are shareable, there is no need for this flag except to mark surfaces which should not be discarded. Renaming it to nodiscard accordingly. This also simplifies surface creation. Signed-off-by: Maaz Mombasawala Reviewed-by: Martin Krastev Reviewed-by: Ian Forbes Reviewed-by: Jose Fonseca Part-of: --- src/gallium/winsys/svga/drm/vmw_screen_svga.c | 76 ++++--------------- src/gallium/winsys/svga/drm/vmw_surface.c | 2 +- src/gallium/winsys/svga/drm/vmw_surface.h | 2 +- 3 files changed, 18 insertions(+), 62 deletions(-) diff --git a/src/gallium/winsys/svga/drm/vmw_screen_svga.c b/src/gallium/winsys/svga/drm/vmw_screen_svga.c index aa18a58c618..606e51ee68f 100644 --- a/src/gallium/winsys/svga/drm/vmw_screen_svga.c +++ b/src/gallium/winsys/svga/drm/vmw_screen_svga.c @@ -486,8 +486,8 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, p_atomic_set(&surface->validated, 0); surface->screen = vws; (void) mtx_init(&surface->mutex, mtx_plain); - surface->shared = !!(usage & SVGA_SURFACE_USAGE_SHARED); - provider = (surface->shared) ? vws->pools.dma_base : vws->pools.dma_fenced; + surface->nodiscard = !!(usage & SVGA_SURFACE_USAGE_SHARED); + provider = (surface->nodiscard) ? vws->pools.dma_base : vws->pools.dma_fenced; /* * When multisampling is not supported sample count received is 0, @@ -517,75 +517,31 @@ vmw_svga_winsys_surface_create(struct svga_winsys_screen *sws, } if (sws->have_gb_objects) { - SVGAGuestPtr ptr = {0,0}; - - /* - * If the backing buffer size is small enough, try to allocate a - * buffer out of the buffer cache. Otherwise, let the kernel allocate - * a suitable buffer for us. - */ - if (buffer_size < VMW_TRY_CACHED_SIZE && !surface->shared) { - struct pb_buffer *pb_buf; - - surface->size = buffer_size; - desc.pb_desc.alignment = 4096; - desc.pb_desc.usage = 0; - pb_buf = provider->create_buffer(provider, buffer_size, &desc.pb_desc); - surface->buf = vmw_svga_winsys_buffer_wrap(pb_buf); - if (surface->buf && !vmw_dma_bufmgr_region_ptr(pb_buf, &ptr)) - assert(0); - } + struct pb_buffer *pb_buf; surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, size, numLayers, - numMipLevels, sampleCount, - ptr.gmrId, + numMipLevels, sampleCount, 0, multisample_pattern, quality_level, - surface->buf ? NULL : &desc.region); - - if (surface->sid == SVGA3D_INVALID_ID) { - if (surface->buf == NULL) { - goto no_sid; - } else { - /* - * Kernel refused to allocate a surface for us. - * Perhaps something was wrong with our buffer? - * This is really a guard against future new size requirements - * on the backing buffers. - */ - vmw_svga_winsys_buffer_destroy(sws, surface->buf); - surface->buf = NULL; - surface->sid = vmw_ioctl_gb_surface_create(vws, flags, format, usage, - size, numLayers, - numMipLevels, sampleCount, - 0, multisample_pattern, - quality_level, - &desc.region); - if (surface->sid == SVGA3D_INVALID_ID) - goto no_sid; - } - } + if (surface->sid == SVGA3D_INVALID_ID) + goto no_sid; /* - * If the kernel created the buffer for us, wrap it into a + * The kernel created the buffer for us, wrap it into a * vmw_svga_winsys_buffer. */ + surface->size = vmw_region_size(desc.region); + desc.pb_desc.alignment = 4096; + desc.pb_desc.usage = VMW_BUFFER_USAGE_SHARED; + pb_buf = provider->create_buffer(provider, surface->size, + &desc.pb_desc); + surface->buf = vmw_svga_winsys_buffer_wrap(pb_buf); if (surface->buf == NULL) { - struct pb_buffer *pb_buf; - - surface->size = vmw_region_size(desc.region); - desc.pb_desc.alignment = 4096; - desc.pb_desc.usage = VMW_BUFFER_USAGE_SHARED; - pb_buf = provider->create_buffer(provider, surface->size, - &desc.pb_desc); - surface->buf = vmw_svga_winsys_buffer_wrap(pb_buf); - if (surface->buf == NULL) { - vmw_ioctl_region_destroy(desc.region); - vmw_ioctl_surface_destroy(vws, surface->sid); - goto no_sid; - } + vmw_ioctl_region_destroy(desc.region); + vmw_ioctl_surface_destroy(vws, surface->sid); + goto no_sid; } } else { /* Legacy surface only support 32-bit svga3d flags */ diff --git a/src/gallium/winsys/svga/drm/vmw_surface.c b/src/gallium/winsys/svga/drm/vmw_surface.c index a868b2c5ffd..407cc7cd2f4 100644 --- a/src/gallium/winsys/svga/drm/vmw_surface.c +++ b/src/gallium/winsys/svga/drm/vmw_surface.c @@ -108,7 +108,7 @@ vmw_svga_winsys_surface_map(struct svga_winsys_context *swc, * If we intend to read, there's no point discarding the * data if busy. */ - if (flags & PIPE_MAP_READ || vsrf->shared) + if (flags & PIPE_MAP_READ || vsrf->nodiscard) flags &= ~PIPE_MAP_DISCARD_WHOLE_RESOURCE; /* diff --git a/src/gallium/winsys/svga/drm/vmw_surface.h b/src/gallium/winsys/svga/drm/vmw_surface.h index 1f8757b8e80..b0b273f8224 100644 --- a/src/gallium/winsys/svga/drm/vmw_surface.h +++ b/src/gallium/winsys/svga/drm/vmw_surface.h @@ -44,7 +44,7 @@ struct vmw_svga_winsys_surface uint32_t mapcount; /* Number of mappers */ uint32_t map_mode; /* PIPE_MAP_[READ|WRITE] */ void *data; /* Pointer to data if mapcount != 0*/ - bool shared; /* Shared surface. Never discard */ + bool nodiscard; /* Never discard */ uint32_t size; /* Size of backing buffer */ bool rebind; /* Surface needs a rebind after next unmap */ };