winsys/drm: Add GL4.1 support in drm winsys

This is to check whether virtual hardware has SM5 support

Reviewed-by: Brian Paul <brianp@vmware.com>
Reviewed-by: Charmaine Lee <charmainel@vmware.com>
Signed-off-by: Neha Bhende <bhenden@vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/5317>
This commit is contained in:
Neha Bhende
2020-05-26 21:15:23 +05:30
committed by Marge Bot
parent 48a7456f4d
commit dc3505f87e
4 changed files with 34 additions and 6 deletions
+3
View File
@@ -767,6 +767,9 @@ struct svga_winsys_screen
/** Have SM4_1 hardware? */
boolean have_sm4_1;
/** Have SM5 hardware? */
boolean have_sm5;
/** To rebind resources at the beginnning of a new command buffer */
boolean need_to_rebind_resources;
+1
View File
@@ -80,6 +80,7 @@ struct vmw_winsys_screen
boolean have_drm_2_15;
boolean have_drm_2_16;
boolean have_drm_2_17;
boolean have_drm_2_18;
} ioctl;
struct {
+23 -2
View File
@@ -52,7 +52,7 @@
#include <unistd.h>
#define VMW_MAX_DEFAULT_TEXTURE_SIZE (128 * 1024 * 1024)
#define VMW_FENCE_TIMEOUT_SECONDS 60
#define VMW_FENCE_TIMEOUT_SECONDS 3600UL
#define SVGA3D_FLAGS_64(upper32, lower32) (((uint64_t)upper32 << 32) | lower32)
#define SVGA3D_FLAGS_UPPER_32(svga3d_flags) (svga3d_flags >> 32)
@@ -64,6 +64,7 @@ struct vmw_region
uint32_t handle;
uint64_t map_handle;
void *data;
uint32_t map_count;
int drm_fd;
uint32_t size;
};
@@ -234,6 +235,7 @@ vmw_ioctl_gb_surface_create(struct vmw_winsys_screen *vws,
req->version = drm_vmw_gb_surface_v1;
req->multisample_pattern = multisamplePattern;
req->quality_level = qualityLevel;
req->buffer_byte_stride = 0;
req->must_be_zero = 0;
req->base.svga3d_flags = SVGA3D_FLAGS_LOWER_32(flags);
req->svga3d_flags_upper_32_bits = SVGA3D_FLAGS_UPPER_32(flags);
@@ -636,6 +638,7 @@ vmw_ioctl_region_create(struct vmw_winsys_screen *vws, uint32_t size)
region->data = NULL;
region->handle = rep->handle;
region->map_handle = rep->map_handle;
region->map_count = 0;
region->size = size;
region->drm_fd = vws->ioctl.drm_fd;
@@ -657,7 +660,10 @@ vmw_ioctl_region_destroy(struct vmw_region *region)
vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
region->ptr.gmrId, region->ptr.offset);
assert(region->data == NULL);
if (region->data) {
os_munmap(region->data, region->size);
region->data = NULL;
}
memset(&arg, 0, sizeof(arg));
arg.handle = region->handle;
@@ -696,6 +702,8 @@ vmw_ioctl_region_map(struct vmw_region *region)
region->data = map;
}
++region->map_count;
return region->data;
}
@@ -705,6 +713,7 @@ vmw_ioctl_region_unmap(struct vmw_region *region)
vmw_printf("%s: gmrId = %u, offset = %u\n", __FUNCTION__,
region->ptr.gmrId, region->ptr.offset);
--region->map_count;
os_munmap(region->data, region->size);
region->data = NULL;
}
@@ -992,6 +1001,8 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
(version->version_major == 2 && version->version_minor > 15);
vws->ioctl.have_drm_2_17 = version->version_major > 2 ||
(version->version_major == 2 && version->version_minor > 16);
vws->ioctl.have_drm_2_18 = version->version_major > 2 ||
(version->version_major == 2 && version->version_minor > 17);
vws->ioctl.drm_execbuf_version = vws->ioctl.have_drm_2_9 ? 2 : 1;
@@ -1102,6 +1113,16 @@ vmw_ioctl_init(struct vmw_winsys_screen *vws)
}
}
if (vws->ioctl.have_drm_2_18 && vws->base.have_sm4_1) {
memset(&gp_arg, 0, sizeof(gp_arg));
gp_arg.param = DRM_VMW_PARAM_SM5;
ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
&gp_arg, sizeof(gp_arg));
if (ret == 0 && gp_arg.value != 0) {
vws->base.have_sm5 = TRUE;
}
}
memset(&gp_arg, 0, sizeof(gp_arg));
gp_arg.param = DRM_VMW_PARAM_3D_CAPS_SIZE;
ret = drmCommandWriteRead(vws->ioctl.drm_fd, DRM_VMW_GET_PARAM,
+7 -4
View File
@@ -103,6 +103,7 @@ extern "C" {
#define DRM_VMW_PARAM_DX 12
#define DRM_VMW_PARAM_HW_CAPS2 13
#define DRM_VMW_PARAM_SM4_1 14
#define DRM_VMW_PARAM_SM5 15
/**
* enum drm_vmw_handle_type - handle type for ref ioctls
@@ -1144,6 +1145,7 @@ enum drm_vmw_surface_version {
* @svga3d_flags_upper_32_bits: Upper 32 bits of svga3d flags.
* @multisample_pattern: Multisampling pattern when msaa is supported.
* @quality_level: Precision settings for each sample.
* @buffer_byte_stride: Buffer byte stride.
* @must_be_zero: Reserved for future usage.
*
* Input argument to the DRM_VMW_GB_SURFACE_CREATE_EXT Ioctl.
@@ -1152,10 +1154,11 @@ enum drm_vmw_surface_version {
struct drm_vmw_gb_surface_create_ext_req {
struct drm_vmw_gb_surface_create_req base;
enum drm_vmw_surface_version version;
uint32_t svga3d_flags_upper_32_bits;
SVGA3dMSPattern multisample_pattern;
SVGA3dMSQualityLevel quality_level;
uint64_t must_be_zero;
__u32 svga3d_flags_upper_32_bits;
__u32 multisample_pattern;
__u32 quality_level;
__u32 buffer_byte_stride;
__u32 must_be_zero;
};
/**