diff --git a/src/gallium/drivers/virgl/virgl_encode.c b/src/gallium/drivers/virgl/virgl_encode.c index 509a67a14a3..ad0174ec9e1 100644 --- a/src/gallium/drivers/virgl/virgl_encode.c +++ b/src/gallium/drivers/virgl/virgl_encode.c @@ -355,7 +355,7 @@ static const enum virgl_formats virgl_formats_conv_table[PIPE_FORMAT_COUNT] = { CONV_FORMAT(Y8_400_UNORM) CONV_FORMAT(Y8_U8_V8_444_UNORM) CONV_FORMAT(Y8_U8_V8_422_UNORM) - [PIPE_FORMAT_NV16] = VIRGL_FORMAT_Y8_U8V8_422_UNORM, + CONV_FORMAT(NV16) CONV_FORMAT(Y8_UNORM) CONV_FORMAT(YVYU) CONV_FORMAT(Z16_UNORM_S8_UINT) @@ -473,6 +473,18 @@ static const enum virgl_formats virgl_formats_conv_table[PIPE_FORMAT_COUNT] = { CONV_FORMAT(Y410) CONV_FORMAT(Y412) CONV_FORMAT(Y416) + CONV_FORMAT(NV15) + CONV_FORMAT(NV20) + CONV_FORMAT(Y8_U8_V8_440_UNORM) + CONV_FORMAT(R10_G10B10_420_UNORM) + CONV_FORMAT(R10_G10B10_422_UNORM) + CONV_FORMAT(X6G10_X6B10X6R10_420_UNORM) + CONV_FORMAT(X4G12_X4B12X4R12_420_UNORM) + CONV_FORMAT(X6R10_UNORM) + CONV_FORMAT(X6R10X6G10_UNORM) + CONV_FORMAT(X4R12_UNORM) + CONV_FORMAT(X4R12X4G12_UNORM) + CONV_FORMAT(R8_G8B8_422_UNORM) }; #undef CONV_FORMAT diff --git a/src/gallium/drivers/virgl/virgl_screen.c b/src/gallium/drivers/virgl/virgl_screen.c index 7db3979b3be..609ae810603 100644 --- a/src/gallium/drivers/virgl/virgl_screen.c +++ b/src/gallium/drivers/virgl/virgl_screen.c @@ -439,7 +439,7 @@ virgl_get_shader_param(struct pipe_screen *screen, case PIPE_SHADER_CAP_SUBROUTINES: return 1; case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS: - return MIN2(vscreen->caps.caps.v2.max_shader_sampler_views, + return MIN2(vscreen->caps.caps.v2.max_texture_samplers, PIPE_MAX_SHADER_SAMPLER_VIEWS); case PIPE_SHADER_CAP_INTEGERS: return vscreen->caps.caps.v1.glsl_level >= 130; diff --git a/src/gallium/drivers/virgl/virgl_winsys.h b/src/gallium/drivers/virgl/virgl_winsys.h index bea877632cb..e61dd135dd4 100644 --- a/src/gallium/drivers/virgl/virgl_winsys.h +++ b/src/gallium/drivers/virgl/virgl_winsys.h @@ -180,7 +180,7 @@ static inline void virgl_ws_fill_new_caps_defaults(struct virgl_drm_caps *caps) caps->caps.v2.max_compute_work_group_invocations = 0; caps->caps.v2.max_compute_shared_memory_size = 0; caps->caps.v2.host_feature_check_version = 0; - caps->caps.v2.max_shader_sampler_views = 16; + caps->caps.v2.max_texture_samplers = 16; for (int shader_type = 0; shader_type < PIPE_SHADER_TYPES; shader_type++) { caps->caps.v2.max_const_buffer_size[shader_type] = 4096 * sizeof(float[4]); caps->caps.v2.max_shader_storage_blocks[shader_type] = INT_MAX; diff --git a/src/virtio/virtio-gpu/virgl_hw.h b/src/virtio/virtio-gpu/virgl_hw.h index e2b324b5b5d..e08374f45d1 100644 --- a/src/virtio/virtio-gpu/virgl_hw.h +++ b/src/virtio/virtio-gpu/virgl_hw.h @@ -405,7 +405,7 @@ enum virgl_formats { VIRGL_FORMAT_Y8_400_UNORM = 322, VIRGL_FORMAT_Y8_U8_V8_444_UNORM = 323, VIRGL_FORMAT_Y8_U8_V8_422_UNORM = 324, - VIRGL_FORMAT_Y8_U8V8_422_UNORM = 325, + VIRGL_FORMAT_NV16 = 325, /* aka Y8_U8V8_422_UNORM */ VIRGL_FORMAT_Y8_UNORM = 326, VIRGL_FORMAT_YVYU = 327, VIRGL_FORMAT_Z16_UNORM_S8_UINT = 328, @@ -523,6 +523,18 @@ enum virgl_formats { VIRGL_FORMAT_Y410 = 440, VIRGL_FORMAT_Y412 = 441, VIRGL_FORMAT_Y416 = 442, + VIRGL_FORMAT_NV15 = 443, + VIRGL_FORMAT_NV20 = 444, + VIRGL_FORMAT_Y8_U8_V8_440_UNORM = 445, + VIRGL_FORMAT_R10_G10B10_420_UNORM = 446, + VIRGL_FORMAT_R10_G10B10_422_UNORM = 447, + VIRGL_FORMAT_X6G10_X6B10X6R10_420_UNORM = 448, + VIRGL_FORMAT_X4G12_X4B12X4R12_420_UNORM = 449, + VIRGL_FORMAT_X6R10_UNORM = 450, + VIRGL_FORMAT_X6R10X6G10_UNORM = 451, + VIRGL_FORMAT_X4R12_UNORM = 452, + VIRGL_FORMAT_X4R12X4G12_UNORM = 453, + VIRGL_FORMAT_R8_G8B8_422_UNORM = 454, VIRGL_FORMAT_MAX /* = PIPE_FORMAT_COUNT */, /* Below formats must not be used in the guest. */ @@ -532,100 +544,101 @@ enum virgl_formats { }; /* These are used by the capability_bits field in virgl_caps_v2. */ -#define VIRGL_CAP_NONE 0 -#define VIRGL_CAP_TGSI_INVARIANT (1 << 0) -#define VIRGL_CAP_TEXTURE_VIEW (1 << 1) -#define VIRGL_CAP_SET_MIN_SAMPLES (1 << 2) -#define VIRGL_CAP_COPY_IMAGE (1 << 3) -#define VIRGL_CAP_TGSI_PRECISE (1 << 4) -#define VIRGL_CAP_TXQS (1 << 5) -#define VIRGL_CAP_MEMORY_BARRIER (1 << 6) -#define VIRGL_CAP_COMPUTE_SHADER (1 << 7) -#define VIRGL_CAP_FB_NO_ATTACH (1 << 8) -#define VIRGL_CAP_ROBUST_BUFFER_ACCESS (1 << 9) -#define VIRGL_CAP_TGSI_FBFETCH (1 << 10) -#define VIRGL_CAP_SHADER_CLOCK (1 << 11) -#define VIRGL_CAP_TEXTURE_BARRIER (1 << 12) -#define VIRGL_CAP_TGSI_COMPONENTS (1 << 13) -#define VIRGL_CAP_GUEST_MAY_INIT_LOG (1 << 14) -#define VIRGL_CAP_SRGB_WRITE_CONTROL (1 << 15) -#define VIRGL_CAP_QBO (1 << 16) -#define VIRGL_CAP_TRANSFER (1 << 17) -#define VIRGL_CAP_FBO_MIXED_COLOR_FORMATS (1 << 18) -#define VIRGL_CAP_HOST_IS_GLES (1 << 19) -#define VIRGL_CAP_BIND_COMMAND_ARGS (1 << 20) -#define VIRGL_CAP_MULTI_DRAW_INDIRECT (1 << 21) -#define VIRGL_CAP_INDIRECT_PARAMS (1 << 22) -#define VIRGL_CAP_TRANSFORM_FEEDBACK3 (1 << 23) -#define VIRGL_CAP_3D_ASTC (1 << 24) -#define VIRGL_CAP_INDIRECT_INPUT_ADDR (1 << 25) -#define VIRGL_CAP_COPY_TRANSFER (1 << 26) -#define VIRGL_CAP_CLIP_HALFZ (1 << 27) -#define VIRGL_CAP_APP_TWEAK_SUPPORT (1 << 28) -#define VIRGL_CAP_BGRA_SRGB_IS_EMULATED (1 << 29) -#define VIRGL_CAP_CLEAR_TEXTURE (1 << 30) +#define VIRGL_CAP_NONE 0u +#define VIRGL_CAP_TGSI_INVARIANT (1u << 0) +#define VIRGL_CAP_TEXTURE_VIEW (1u << 1) +#define VIRGL_CAP_SET_MIN_SAMPLES (1u << 2) +#define VIRGL_CAP_COPY_IMAGE (1u << 3) +#define VIRGL_CAP_TGSI_PRECISE (1u << 4) +#define VIRGL_CAP_TXQS (1u << 5) +#define VIRGL_CAP_MEMORY_BARRIER (1u << 6) +#define VIRGL_CAP_COMPUTE_SHADER (1u << 7) +#define VIRGL_CAP_FB_NO_ATTACH (1u << 8) +#define VIRGL_CAP_ROBUST_BUFFER_ACCESS (1u << 9) +#define VIRGL_CAP_TGSI_FBFETCH (1u << 10) +#define VIRGL_CAP_SHADER_CLOCK (1u << 11) +#define VIRGL_CAP_TEXTURE_BARRIER (1u << 12) +#define VIRGL_CAP_TGSI_COMPONENTS (1u << 13) +#define VIRGL_CAP_GUEST_MAY_INIT_LOG (1u << 14) +#define VIRGL_CAP_SRGB_WRITE_CONTROL (1u << 15) +#define VIRGL_CAP_QBO (1u << 16) +#define VIRGL_CAP_TRANSFER (1u << 17) +#define VIRGL_CAP_FBO_MIXED_COLOR_FORMATS (1u << 18) +#define VIRGL_CAP_HOST_IS_GLES (1u << 19) +#define VIRGL_CAP_BIND_COMMAND_ARGS (1u << 20) +#define VIRGL_CAP_MULTI_DRAW_INDIRECT (1u << 21) +#define VIRGL_CAP_INDIRECT_PARAMS (1u << 22) +#define VIRGL_CAP_TRANSFORM_FEEDBACK3 (1u << 23) +#define VIRGL_CAP_3D_ASTC (1u << 24) +#define VIRGL_CAP_INDIRECT_INPUT_ADDR (1u << 25) +#define VIRGL_CAP_COPY_TRANSFER (1u << 26) +#define VIRGL_CAP_CLIP_HALFZ (1u << 27) +#define VIRGL_CAP_APP_TWEAK_SUPPORT (1u << 28) +#define VIRGL_CAP_BGRA_SRGB_IS_EMULATED (1u << 29) +#define VIRGL_CAP_CLEAR_TEXTURE (1u << 30) #define VIRGL_CAP_ARB_BUFFER_STORAGE (1u << 31) // Legacy alias #define VIRGL_CAP_FAKE_FP64 VIRGL_CAP_HOST_IS_GLES /* These are used by the capability_bits_v2 field in virgl_caps_v2. */ -#define VIRGL_CAP_V2_BLEND_EQUATION (1 << 0) -#define VIRGL_CAP_V2_UNTYPED_RESOURCE (1 << 1) -#define VIRGL_CAP_V2_VIDEO_MEMORY (1 << 2) -#define VIRGL_CAP_V2_MEMINFO (1 << 3) -#define VIRGL_CAP_V2_STRING_MARKER (1 << 4) -#define VIRGL_CAP_V2_IMPLICIT_MSAA (1 << 6) -#define VIRGL_CAP_V2_COPY_TRANSFER_BOTH_DIRECTIONS (1 << 7) -#define VIRGL_CAP_V2_SCANOUT_USES_GBM (1 << 8) -#define VIRGL_CAP_V2_SSO (1 << 9) -#define VIRGL_CAP_V2_TEXTURE_SHADOW_LOD (1 << 10) -#define VIRGL_CAP_V2_VS_VERTEX_LAYER (1 << 11) -#define VIRGL_CAP_V2_VS_VIEWPORT_INDEX (1 << 12) -#define VIRGL_CAP_V2_PIPELINE_STATISTICS_QUERY (1 << 13) -#define VIRGL_CAP_V2_DRAW_PARAMETERS (1 << 14) -#define VIRGL_CAP_V2_GROUP_VOTE (1 << 15) -#define VIRGL_CAP_V2_MIRROR_CLAMP_TO_EDGE (1 << 16) -#define VIRGL_CAP_V2_MIRROR_CLAMP (1 << 17) +#define VIRGL_CAP_V2_BLEND_EQUATION (1u << 0) +#define VIRGL_CAP_V2_UNTYPED_RESOURCE (1u << 1) +#define VIRGL_CAP_V2_VIDEO_MEMORY (1u << 2) +#define VIRGL_CAP_V2_MEMINFO (1u << 3) +#define VIRGL_CAP_V2_STRING_MARKER (1u << 4) +#define VIRGL_CAP_V2_DIFFERENT_GPU (1u << 5) +#define VIRGL_CAP_V2_IMPLICIT_MSAA (1u << 6) +#define VIRGL_CAP_V2_COPY_TRANSFER_BOTH_DIRECTIONS (1u << 7) +#define VIRGL_CAP_V2_SCANOUT_USES_GBM (1u << 8) +#define VIRGL_CAP_V2_SSO (1u << 9) +#define VIRGL_CAP_V2_TEXTURE_SHADOW_LOD (1u << 10) +#define VIRGL_CAP_V2_VS_VERTEX_LAYER (1u << 11) +#define VIRGL_CAP_V2_VS_VIEWPORT_INDEX (1u << 12) +#define VIRGL_CAP_V2_PIPELINE_STATISTICS_QUERY (1u << 13) +#define VIRGL_CAP_V2_DRAW_PARAMETERS (1u << 14) +#define VIRGL_CAP_V2_GROUP_VOTE (1u << 15) +#define VIRGL_CAP_V2_MIRROR_CLAMP_TO_EDGE (1u << 16) +#define VIRGL_CAP_V2_MIRROR_CLAMP (1u << 17) /* virgl bind flags - these are compatible with mesa 10.5 gallium. * but are fixed, no other should be passed to virgl either. */ -#define VIRGL_BIND_DEPTH_STENCIL (1 << 0) -#define VIRGL_BIND_RENDER_TARGET (1 << 1) -#define VIRGL_BIND_SAMPLER_VIEW (1 << 3) -#define VIRGL_BIND_VERTEX_BUFFER (1 << 4) -#define VIRGL_BIND_INDEX_BUFFER (1 << 5) -#define VIRGL_BIND_CONSTANT_BUFFER (1 << 6) -#define VIRGL_BIND_DISPLAY_TARGET (1 << 7) -#define VIRGL_BIND_COMMAND_ARGS (1 << 8) -#define VIRGL_BIND_STREAM_OUTPUT (1 << 11) -#define VIRGL_BIND_SHADER_BUFFER (1 << 14) -#define VIRGL_BIND_QUERY_BUFFER (1 << 15) -#define VIRGL_BIND_CURSOR (1 << 16) -#define VIRGL_BIND_CUSTOM (1 << 17) -#define VIRGL_BIND_SCANOUT (1 << 18) +#define VIRGL_BIND_DEPTH_STENCIL (1u << 0) +#define VIRGL_BIND_RENDER_TARGET (1u << 1) +#define VIRGL_BIND_SAMPLER_VIEW (1u << 3) +#define VIRGL_BIND_VERTEX_BUFFER (1u << 4) +#define VIRGL_BIND_INDEX_BUFFER (1u << 5) +#define VIRGL_BIND_CONSTANT_BUFFER (1u << 6) +#define VIRGL_BIND_DISPLAY_TARGET (1u << 7) +#define VIRGL_BIND_COMMAND_ARGS (1u << 8) +#define VIRGL_BIND_STREAM_OUTPUT (1u << 11) +#define VIRGL_BIND_SHADER_BUFFER (1u << 14) +#define VIRGL_BIND_QUERY_BUFFER (1u << 15) +#define VIRGL_BIND_CURSOR (1u << 16) +#define VIRGL_BIND_CUSTOM (1u << 17) +#define VIRGL_BIND_SCANOUT (1u << 18) /* Used for buffers that are backed by guest storage and * are only read by the host. */ -#define VIRGL_BIND_STAGING (1 << 19) -#define VIRGL_BIND_SHARED (1 << 20) +#define VIRGL_BIND_STAGING (1u << 19) +#define VIRGL_BIND_SHARED (1u << 20) -#define VIRGL_BIND_PREFER_EMULATED_BGRA (1 << 21) +#define VIRGL_BIND_PREFER_EMULATED_BGRA (1u << 21) /* non-functional */ -#define VIRGL_BIND_LINEAR (1 << 22) +#define VIRGL_BIND_LINEAR (1u << 22) -#define VIRGL_BIND_SHARED_SUBFLAGS (0xff << 24) +#define VIRGL_BIND_SHARED_SUBFLAGS (0xffu << 24) -#define VIRGL_BIND_MINIGBM_CAMERA_WRITE (1 << 24) -#define VIRGL_BIND_MINIGBM_CAMERA_READ (1 << 25) -#define VIRGL_BIND_MINIGBM_HW_VIDEO_DECODER (1 << 26) -#define VIRGL_BIND_MINIGBM_HW_VIDEO_ENCODER (1 << 27) -#define VIRGL_BIND_MINIGBM_SW_READ_OFTEN (1 << 28) -#define VIRGL_BIND_MINIGBM_SW_READ_RARELY (1 << 29) -#define VIRGL_BIND_MINIGBM_SW_WRITE_OFTEN (1 << 30) -#define VIRGL_BIND_MINIGBM_SW_WRITE_RARELY (1 << 31) -#define VIRGL_BIND_MINIGBM_PROTECTED (0xf << 28) // Mutually exclusive with SW_ flags +#define VIRGL_BIND_MINIGBM_CAMERA_WRITE (1u << 24) +#define VIRGL_BIND_MINIGBM_CAMERA_READ (1u << 25) +#define VIRGL_BIND_MINIGBM_HW_VIDEO_DECODER (1u << 26) +#define VIRGL_BIND_MINIGBM_HW_VIDEO_ENCODER (1u << 27) +#define VIRGL_BIND_MINIGBM_SW_READ_OFTEN (1u << 28) +#define VIRGL_BIND_MINIGBM_SW_READ_RARELY (1u << 29) +#define VIRGL_BIND_MINIGBM_SW_WRITE_OFTEN (1u << 30) +#define VIRGL_BIND_MINIGBM_SW_WRITE_RARELY (1u << 31) +#define VIRGL_BIND_MINIGBM_PROTECTED (0xfu << 28) // Mutually exclusive with SW_ flags struct virgl_caps_bool_set1 { unsigned indep_blend_enable:1; @@ -762,7 +775,10 @@ struct virgl_caps_v2 { uint32_t max_video_memory; char renderer[64]; float max_anisotropy; - uint32_t max_shader_sampler_views; + // NOTE: this informs guest-side PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS, + // **NOT** GL_MAX_TEXTURE_IMAGE_UNITS!!! + // Guest-side driver has always used it as such. + uint32_t max_texture_samplers; struct virgl_supported_format_mask supported_multisample_formats; uint32_t max_const_buffer_size[6]; // PIPE_SHADER_TYPES uint32_t num_video_caps; @@ -799,7 +815,15 @@ enum virgl_ctx_errors { VIRGL_ERROR_CTX_ILLEGAL_FORMAT, VIRGL_ERROR_CTX_ILLEGAL_SAMPLER_VIEW_TARGET, VIRGL_ERROR_CTX_TRANSFER_IOV_BOUNDS, - VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND + VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND, + VIRGL_ERROR_CTX_UNSUPPORTED_FUNCTION, + VIRGL_ERROR_CTX_ILLEGAL_PROGRAM_PIPELINE, + VIRGL_ERROR_CTX_TOO_MANY_VERTEX_ATTRIBUTES, + VIRGL_ERROR_CTX_UNSUPPORTED_TEX_WRAP, + VIRGL_ERROR_CTX_CUBE_MAP_FACE_OUT_OF_RANGE, + VIRGL_ERROR_CTX_BLIT_AREA_OUT_OF_RANGE, + VIRGL_ERROR_CTX_SSBO_BINDING_RANGE, + VIRGL_ERROR_CTX_RESOURCE_OUT_OF_RANGE, }; enum virgl_statistics_query_index {