diff options
author | Sadaf Ebrahimi <sadafebrahimi@google.com> | 2023-01-24 18:44:57 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-01-24 18:44:57 +0000 |
commit | 3390aadf688cee87b97043f5236e5586fc5d64f9 (patch) | |
tree | f077cb6e83127e951533857ea5d6f241363b0edb | |
parent | 5fbaeb95136674231649045fa197897ad9bd3ff4 (diff) | |
parent | 9b631e492ace0beab88ca1ca6b4e52cd23b929b8 (diff) | |
download | virglrenderer-3390aadf688cee87b97043f5236e5586fc5d64f9.tar.gz |
Upgrade virglrenderer to 0.10.4 am: 056b3873e4 am: 9b631e492a
Original change: https://android-review.googlesource.com/c/platform/external/virglrenderer/+/2393713
Change-Id: Ic7131f1a0fc632b38d8d6df121191f586f4e1e5d
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
113 files changed, 11243 insertions, 2993 deletions
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9a27a93a..3955e386 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,6 +1,6 @@ variables: FDO_UPSTREAM_REPO: "virgl/virglrenderer" - MESA_TEMPLATES_COMMIT: &ci-templates-commit 290b79e0e78eab67a83766f4e9691be554fc4afd + MESA_TEMPLATES_COMMIT: &ci-templates-commit d5aa3941aa03c2f716595116354fb81eb8012acb MESA_BASE_TAG: ${DEBIAN_BASE_TAG} # # IMPORTANT! @@ -11,12 +11,17 @@ variables: # # Pick a pipeline on https://gitlab.freedesktop.org/mesa/mesa/-/pipelines/ # - MESA_PIPELINE_ID: 634658 + MESA_PIPELINE_ID: 743439 MESA_PROJECT_PATH: mesa/mesa - MINIO_HOST: minio-packet.freedesktop.org - # Per-pipeline artifact storage on MinIO - PIPELINE_ARTIFACTS_BASE: ${MINIO_HOST}/artifacts/${CI_PROJECT_PATH}/${CI_PIPELINE_ID} + STORAGE_HOST: s3.freedesktop.org CI_REGISTRY_IMAGE: "registry.freedesktop.org/${MESA_PROJECT_PATH}" + # per-pipeline artifact storage on MinIO + PIPELINE_ARTIFACTS_BASE: ${STORAGE_HOST}/artifacts/${CI_PROJECT_PATH}/${CI_PIPELINE_ID} + # per-job artifact storage on MinIO + JOB_ARTIFACTS_BASE: ${PIPELINE_ARTIFACTS_BASE}/${CI_JOB_ID} + # reference images stored for traces + PIGLIT_REPLAY_REFERENCE_IMAGES_BASE: "${STORAGE_HOST}/mesa-tracie-results/${FDO_UPSTREAM_REPO}" + include: - project: 'freedesktop/ci-templates' @@ -32,7 +37,7 @@ include: # IMPORTANT: Use a recent Mesa Git revision # The commit ref must be in sync with the pipeline picked above # It can be found on the pipeline page below the commit message - ref: 27c57b86500ce48154533d78b74350c31152b2f3 + ref: 1ec172646cd7f5b8c04173a6b45a871aa48aa12e file: - '/.gitlab-ci/image-tags.yml' @@ -134,7 +139,6 @@ make check venus: extends: .make_check_base variables: TEST_SUITE: make-check-venus - EXTRA_OPTION: "-D venus-experimental=true" # # Piglit & dEQP test jobs @@ -145,9 +149,12 @@ make check venus: extends: - .set-image-base-tag before_script: + - echo -n "${CI_JOB_JWT}" > "${CI_JOB_JWT_FILE}" + - unset CI_JOB_JWT - export CI_JOB_NAME_SANITIZED="$(echo $CI_JOB_NAME | tr ' /' '--')" variables: - MESA_IMAGE_PATH: ${DEBIAN_X86_TEST_IMAGE_PATH} + CI_JOB_JWT_FILE: /minio_jwt + MESA_IMAGE_PATH: ${DEBIAN_X86_TEST_IMAGE_GL_PATH} MESA_IMAGE_TAG: ${DEBIAN_X86_TEST_GL_TAG} script: - export DEQP_RESULTS_DIR="results/${CI_JOB_NAME_SANITIZED}" @@ -168,6 +175,37 @@ make check venus: when: never - when: on_success +.use-vk-test-image: + stage: test + extends: + - .set-image-base-tag + before_script: + - echo -n "${CI_JOB_JWT}" > "${CI_JOB_JWT_FILE}" + - unset CI_JOB_JWT + - export CI_JOB_NAME_SANITIZED="$(echo $CI_JOB_NAME | tr ' /' '--')" + variables: + CI_JOB_JWT_FILE: /minio_jwt + MESA_IMAGE_PATH: ${DEBIAN_X86_TEST_IMAGE_VK_PATH} + MESA_IMAGE_TAG: ${DEBIAN_X86_TEST_VK_TAG} + script: + - export DEQP_RESULTS_DIR="results/${CI_JOB_NAME_SANITIZED}" + - export PIGLIT_RESULTS_DIR="results/${CI_JOB_NAME_SANITIZED}" + - .gitlab-ci/container/debian/x86_test.sh + artifacts: + name: "venus-result" + when: always + paths: + - results/ + reports: + junit: results/junit.xml + needs: + - job: debian/x86_build + artifacts: true + rules: + - if: *is-post-merge + when: never + - when: on_success + .gl-host-test: extends: - .use-gl-test-image @@ -276,3 +314,36 @@ piglit-gles-virt: VIRGL_HOST_API: GLES GPU_VERSION: virgl-gles CROSVM_GPU_ARGS: *deqp-gles-crosvm-gpu-args + +virgl-traces: + extends: + - .piglit-virt + variables: + GPU_VERSION: virgl-gl + CROSVM_GPU_ARGS: *deqp-gl-crosvm-gpu-args + EGL_PLATFORM: "surfaceless" + PIGLIT_REPLAY_DESCRIPTION_FILE: "${CI_PROJECT_DIR}/install/traces-virgl.yml" + PIGLIT_REPLAY_DEVICE_NAME: "gl-virgl" + PIGLIT_RESULTS: "virgl-replay" + +.venus-lavapipe-test: + extends: + - .use-vk-test-image + variables: + VK_DRIVER: virtio + CROSVM_GALLIUM_DRIVER: "llvmpipe" + CROSVM_VK_DRIVER: "lvp" + +venus-lavapipe: + extends: + - .venus-lavapipe-test + variables: + DEQP_FRACTION: 15 + DEQP_SUITE: venus + GPU_VERSION: venus + LP_NUM_THREADS: 1 # There will be FDO_CI_CONCURRENT Crosvm processes, so each should use a single thread + FDO_CI_CONCURRENT: 32 # Seems to be the fastest value, more gets actually slower + CROSVM_MEMORY: 3072 + CROSVM_GPU_ARGS: "vulkan=true,gles=false,backend=virglrenderer,egl=true,surfaceless=true" + tags: + - mesa-swrast diff --git a/.gitlab-ci/container/debian/x86_test.sh b/.gitlab-ci/container/debian/x86_test.sh index 8450df15..01488b8a 100755 --- a/.gitlab-ci/container/debian/x86_test.sh +++ b/.gitlab-ci/container/debian/x86_test.sh @@ -7,9 +7,9 @@ mkdir -p ${MESA_CI_PROJECT_DIR} cd ${MESA_CI_PROJECT_DIR} # Deploy Mesa CI artifacts -MESA_CI_ARTIFACTS_URL="https://${MINIO_HOST}/artifacts/${MESA_PROJECT_PATH}/${MESA_PIPELINE_ID}/mesa-amd64.tar.gz" +MESA_CI_ARTIFACTS_URL="https://${STORAGE_HOST}/artifacts/${MESA_PROJECT_PATH}/${MESA_PIPELINE_ID}/mesa-amd64.tar.zst" if wget -q --method=HEAD ${MESA_CI_ARTIFACTS_URL}; then - wget -S --progress=dot:giga -O- ${MESA_CI_ARTIFACTS_URL} | tar -xvz + wget -S --progress=dot:giga -O- ${MESA_CI_ARTIFACTS_URL} | tar -xv --zstd else echo -e "\e[31mThe Mesa artifacts has expired, please update to newer Mesa pipeline!\e[0m" apt-get update && apt-get -y install jq @@ -38,7 +38,7 @@ fi cp -a ${CI_PROJECT_DIR}/install/bin/virgl_test_server /usr/local/bin/ cp -a ${CI_PROJECT_DIR}/install/lib/libvirglrenderer.so* /usr/local/lib/ -if [ "${GALLIUM_DRIVER}" = "virgl" ]; then +if [ "${VK_DRIVER}" = "virtio" ] || [ "${GALLIUM_DRIVER}" = "virgl" ]; then # # Run the tests on virtual platform (virgl/crosvm) # @@ -58,8 +58,13 @@ if [ "${GALLIUM_DRIVER}" = "virgl" ]; then set +e if [ -z "${DEQP_SUITE}" ]; then - FDO_CI_CONCURRENT=${FORCE_FDO_CI_CONCURRENT:-FDO_CI_CONCURRENT} \ - install/crosvm-runner.sh install/piglit/piglit-runner.sh + if [ -z "${PIGLIT_REPLAY_DESCRIPTION_FILE}" ]; then + FDO_CI_CONCURRENT=${FORCE_FDO_CI_CONCURRENT:-FDO_CI_CONCURRENT} \ + install/crosvm-runner.sh install/piglit/piglit-runner.sh + else + FDO_CI_CONCURRENT=${FORCE_FDO_CI_CONCURRENT:-FDO_CI_CONCURRENT} \ + install/crosvm-runner.sh install/piglit/piglit-traces.sh + fi else install/deqp-runner.sh fi diff --git a/.gitlab-ci/expectations/host/virgl-gl-fails.txt b/.gitlab-ci/expectations/host/virgl-gl-fails.txt index dd3f30d0..3cca2064 100644 --- a/.gitlab-ci/expectations/host/virgl-gl-fails.txt +++ b/.gitlab-ci/expectations/host/virgl-gl-fails.txt @@ -27,8 +27,6 @@ dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_corner,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_center,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_corner,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.8,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_required_draw_buffers.9,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_x,Fail @@ -107,95 +105,7 @@ shaders@point-vertex-id gl_vertexid gl_instanceid,Fail spec@arb_blend_func_extended@arb_blend_func_extended-fbo-extended-blend-pattern_gles2,Fail spec@arb_clear_texture@arb_clear_texture-depth,Fail spec@arb_copy_image@arb_copy_image-formats,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RED_RGTC1/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_BPTC_UNORM/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RG_RGTC2/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RED_RGTC1/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RG_RGTC2/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail spec@arb_copy_image@arb_copy_image-formats@Source: GL_DEPTH_COMPONENT24/Destination: GL_DEPTH_COMPONENT24,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-copypixels,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-drawpixels-24_8,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-drawpixels-32f_24_8_rev,Fail @@ -213,17 +123,14 @@ spec@arb_depth_texture@texwrap formats bordercolor-swizzled,Fail spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT16- swizzled- border color only,Fail spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT24- swizzled- border color only,Fail spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT32- swizzled- border color only,Fail +spec@arb_enhanced_layouts@matching_fp64_types_1,Crash +spec@arb_enhanced_layouts@matching_fp64_types_2,Crash +spec@arb_enhanced_layouts@matching_fp64_types_3,Crash spec@arb_es2_compatibility@texwrap formats bordercolor,Fail spec@arb_es2_compatibility@texwrap formats bordercolor@GL_RGB565- border color only,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled@GL_RGB565- swizzled- border color only,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample,Fail spec@arb_get_texture_sub_image@arb_get_texture_sub_image-getcompressed,Crash -spec@arb_get_texture_sub_image@arb_get_texture_sub_image-get,Fail spec@arb_occlusion_query@occlusion_query_conform,Fail spec@arb_occlusion_query@occlusion_query_conform@GetObjivAval_multi1,Fail spec@arb_occlusion_query@occlusion_query_meta_no_fragments,Fail @@ -233,8 +140,6 @@ spec@arb_program_interface_query@arb_program_interface_query-getprogramresourcei spec@arb_program_interface_query@arb_program_interface_query-getprogramresourceindex@'vs_input2[1][0]' on GL_PROGRAM_INPUT,Fail spec@arb_sample_shading@builtin-gl-sample-position 2,Fail spec@arb_shader_atomic_counter_ops@execution@add,Fail -spec@arb_shader_atomic_counters@fragment-discard,Fail -spec@arb_shader_atomic_counters@function-argument,Fail spec@arb_shader_image_load_store@early-z,Fail spec@arb_shader_image_load_store@early-z@occlusion query test/early-z pass,Fail spec@arb_shader_image_load_store@layer,Fail @@ -253,16 +158,8 @@ spec@arb_shader_image_load_store@semantics@imageLoad/Vertex shader/rgba32f/image spec@arb_shader_image_load_store@semantics@imageLoad/Vertex shader/rgba32f/image2DMS test,Fail spec@arb_shader_storage_buffer_object@execution@ssbo-atomiccompswap-int,Fail spec@arb_shader_storage_buffer_object@layout-std140-write-shader,Fail -spec@arb_shader_storage_buffer_object@layout-std430-write-shader,Fail spec@arb_shader_storage_buffer_object@maxblocks,Fail -spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgradcube,Fail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgrad,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-07,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-08,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-cumulative,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_rgb_bptc_signed_float,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_rgb_bptc_unsigned_float,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_srgb_alpha_bptc_unorm,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor@GL_COMPRESSED_RGBA_BPTC_UNORM- border color only,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor@GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT- border color only,Fail @@ -291,8 +188,6 @@ spec@arb_texture_cube_map_array@fbo-generatemipmap-cubemap array s3tc_dxt1,Fail spec@arb_texture_float@fbo-blending-formats,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA16F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA32F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY16F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY32F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_RGB32F,Fail spec@arb_texture_float@fbo-clear-formats,Fail spec@arb_texture_float@fbo-clear-formats@GL_ALPHA16F_ARB,Fail @@ -333,8 +228,6 @@ spec@arb_texture_float@texwrap formats bordercolor-swizzled@GL_RGBA32F- swizzled spec@arb_texture_rectangle@copyteximage rect,Fail spec@arb_texture_rectangle@copyteximage rect samples=2,Fail spec@arb_texture_rectangle@copyteximage rect samples=4,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-07,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-08,Fail spec@arb_texture_rectangle@texwrap rect bordercolor,Fail spec@arb_texture_rectangle@texwrap rect bordercolor@GL_RGBA8- border color only,Fail spec@arb_texture_rectangle@texwrap rect proj bordercolor,Fail @@ -372,32 +265,6 @@ spec@egl 1.4@eglterminate then unbind context,Fail spec@egl_ext_protected_content@conformance,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_depth_component24,Fail spec@egl_khr_surfaceless_context@viewport,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float,Fail spec@ext_framebuffer_multisample@alpha-blending-after-rendering 2,Fail spec@ext_framebuffer_multisample@blit-mismatched-formats,Fail spec@ext_framebuffer_multisample@interpolation 2 centroid-edges,Fail @@ -409,12 +276,6 @@ spec@ext_framebuffer_multisample@no-color 4 depth single,Fail spec@ext_framebuffer_multisample@sample-coverage 2 inverted,Fail spec@ext_framebuffer_multisample@sample-coverage 2 non-inverted,Fail spec@ext_framebuffer_object@fbo-blending-format-quirks,Fail -spec@ext_framebuffer_object@fbo-blending-formats,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY12,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY4,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY8,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats@GL_DEPTH_COMPONENT24/GL_FLOAT,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats@GL_DEPTH_COMPONENT/GL_FLOAT,Fail @@ -434,10 +295,6 @@ spec@ext_packed_float@texwrap formats bordercolor-swizzled,Fail spec@ext_packed_float@texwrap formats bordercolor-swizzled@GL_R11F_G11F_B10F- swizzled- border color only,Fail spec@ext_texture_array@fbo-generatemipmap-array s3tc_dxt1,Fail spec@ext_texture_array@gen-mipmap,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-08,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-08,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor@GL_COMPRESSED_RED_RGTC1- border color only,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor@GL_COMPRESSED_RG_RGTC2- border color only,Fail @@ -480,10 +337,6 @@ spec@ext_texture_shared_exponent@texwrap formats bordercolor,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor@GL_RGB9_E5- border color only,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled@GL_RGB9_E5- swizzled- border color only,Fail -spec@ext_texture_snorm@fbo-blending-formats,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY16_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY8_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY_SNORM,Fail spec@ext_texture_snorm@texwrap formats bordercolor,Fail spec@ext_texture_snorm@texwrap formats bordercolor@GL_ALPHA16_SNORM- border color only,Fail spec@ext_texture_snorm@texwrap formats bordercolor@GL_ALPHA8_SNORM- border color only,Fail @@ -546,80 +399,34 @@ spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SR spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB- swizzled- border color only,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-08,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-08,Fail +spec@ext_transform_feedback@builtin-varyings gl_culldistance,Fail spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-clamp-z,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quad-strip,Fail spec@glsl-1.50@execution@variable-indexing@gs-input-array-float-index-rd,Fail -spec@khr_texture_compression_astc@array-gl@12x12 Block Dim,Fail -spec@khr_texture_compression_astc@array-gl@5x5 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles@12x12 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles@5x5 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles,Fail -spec@khr_texture_compression_astc@array-gl,Fail -spec@khr_texture_compression_astc@miptree-gles ldr,Fail -spec@khr_texture_compression_astc@miptree-gles ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@miptree-gles srgb,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@miptree-gles srgb-sd,Fail -spec@khr_texture_compression_astc@miptree-gles srgb-sd@sRGB skip decode,Fail -spec@khr_texture_compression_astc@miptree-gles srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@miptree-gl ldr,Fail -spec@khr_texture_compression_astc@miptree-gl ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@miptree-gl srgb,Fail spec@khr_texture_compression_astc@miptree-gl srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gl srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@miptree-gl srgb-sd,Fail -spec@khr_texture_compression_astc@miptree-gl srgb-sd@sRGB skip decode,Fail -spec@khr_texture_compression_astc@miptree-gl srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles ldr,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl ldr,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb@sRGB decode,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 0 0x223344ff,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 0 0x76356278,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x223344ff,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x76356278,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color,Fail spec@nv_copy_image@nv_copy_image-formats,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RED_RGTC1/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_BPTC_UNORM/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RG_RGTC2/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RED_RGTC1/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RG_RGTC2/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail spec@nv_copy_image@nv_copy_image-formats@Source: GL_DEPTH_COMPONENT24/Destination: GL_DEPTH_COMPONENT24,Fail spec@nv_read_depth@read_depth_gles3,Fail spec@!opengl 1.0@depth-clear-precision-check@depth32,Fail spec@!opengl 1.0@depth-clear-precision-check,Fail -spec@!opengl 1.0@gl-1.0-dlist-bitmap,Fail spec@!opengl 1.0@gl-1.0-drawbuffer-modes,Fail spec@!opengl 1.0@gl-1.0-edgeflag,Fail spec@!opengl 1.0@gl-1.0-edgeflag-quads,Fail spec@!opengl 1.0@gl-1.0-swapbuffers-behavior,Fail -spec@!opengl 1.0@rasterpos,Crash +spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail spec@!opengl 1.1@depthstencil-default_fb-copypixels,Fail diff --git a/.gitlab-ci/expectations/host/virgl-gl-flakes.txt b/.gitlab-ci/expectations/host/virgl-gl-flakes.txt index f07a4988..5836e9f0 100644 --- a/.gitlab-ci/expectations/host/virgl-gl-flakes.txt +++ b/.gitlab-ci/expectations/host/virgl-gl-flakes.txt @@ -351,6 +351,8 @@ shaders@glsl-uniform-interstage-limits@subdivide 5 shaders@glsl-uniform-interstage-limits@subdivide 5- statechanges spec@arb_fragment_layer_viewport@layer-gs-writes-in-range spec@arb_fragment_layer_viewport@viewport-gs-writes-in-range +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4 spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor @@ -367,6 +369,7 @@ spec@arb_shader_storage_buffer_object@execution@ssbo-atomicexchange-int spec@arb_shader_storage_buffer_object@layout-std140-write-shader spec@arb_timer_query@query gl_timestamp spec@arb_timer_query@timestamp-get +spec@ext_timer_query@time-elapsed spec@ext_framebuffer_blit@fbo-blit-check-limits spec@ext_framebuffer_blit@fbo-sys-blit spec@ext_framebuffer_blit@fbo-sys-sub-blit diff --git a/.gitlab-ci/expectations/host/virgl-gl-skips.txt b/.gitlab-ci/expectations/host/virgl-gl-skips.txt index 494b5526..6c282d15 100644 --- a/.gitlab-ci/expectations/host/virgl-gl-skips.txt +++ b/.gitlab-ci/expectations/host/virgl-gl-skips.txt @@ -21,9 +21,6 @@ spec@ext_texture_integer@fbo-integer # Fails on iris too spec@arb_direct_state_access@gettextureimage-formats -spec@arb_texture_buffer_object@formats (fs- arb)* -spec@arb_texture_buffer_object@formats (vs- arb)* - # Skip these as they get skipped with the Intel driver + vtest spec@arb_shader_texture_image_samples@builtin-image* diff --git a/.gitlab-ci/expectations/host/virgl-gles-fails.txt b/.gitlab-ci/expectations/host/virgl-gles-fails.txt index f99a2220..e26206fe 100644 --- a/.gitlab-ci/expectations/host/virgl-gles-fails.txt +++ b/.gitlab-ci/expectations/host/virgl-gles-fails.txt @@ -11,8 +11,6 @@ dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.multisample_texture_2,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_center,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_corner,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.8,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_required_draw_buffers.9,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_x,Fail @@ -195,14 +193,17 @@ spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT32 spec@arb_draw_indirect@arb_draw_indirect-draw-elements-prim-restart-ugly,Fail spec@arb_enhanced_layouts@linker@component-layout@intrastage-vs,Fail spec@arb_enhanced_layouts@linker@component-layout@vs-to-fs,Fail +spec@arb_enhanced_layouts@matching_basic_types_3_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_1,Crash +spec@arb_enhanced_layouts@matching_fp64_types_1_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_2,Crash +spec@arb_enhanced_layouts@matching_fp64_types_2_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_3,Crash +spec@arb_enhanced_layouts@matching_fp64_types_3_loc_1,Fail spec@arb_es2_compatibility@texwrap formats bordercolor,Fail spec@arb_es2_compatibility@texwrap formats bordercolor@GL_RGB565- border color only,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled@GL_RGB565- swizzled- border color only,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@Basic,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@discard,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query,Fail @@ -262,137 +263,10 @@ spec@arb_sample_shading@samplemask 4@noms mask_in_one,Fail spec@arb_sample_shading@samplemask 4@noms partition,Fail spec@arb_sample_shading@samplemask 4@sample mask_in_one,Fail spec@arb_seamless_cube_map@arb_seamless_cubemap,Fail -spec@arb_shader_atomic_counters@fragment-discard,Fail spec@arb_shader_image_load_store@early-z,ExpectedFail spec@arb_shader_image_load_store@early-z@occlusion query test/early-z pass,ExpectedFail spec@arb_shader_image_load_store@early-z@occlusion query test/late-z pass,Fail spec@arb_shader_image_load_store@execution@disable_early_z,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@layer,Fail -spec@arb_shader_image_load_store@layer@image1DArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1DArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DRect/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DRect/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image3D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image3D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageBuffer/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageBuffer/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCubeArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCubeArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCube/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCube/non-layered binding test,Fail -spec@arb_shader_image_load_store@level@1DArray level binding test,Fail -spec@arb_shader_image_load_store@level@1D level binding test,Fail -spec@arb_shader_image_load_store@level@2DArray level binding test,Fail -spec@arb_shader_image_load_store@level@2D level binding test,Fail -spec@arb_shader_image_load_store@level@3D level binding test,Fail -spec@arb_shader_image_load_store@level@CubeArray level binding test,Fail -spec@arb_shader_image_load_store@level@Cube level binding test,Fail -spec@arb_shader_image_load_store@level,Fail spec@arb_shader_image_load_store@max-images@Combined max image uniforms test,Fail spec@arb_shader_image_load_store@max-images,Fail spec@arb_shader_image_load_store@max-size,Fail @@ -408,12 +282,8 @@ spec@arb_shader_storage_buffer_object@execution@memory-layouts-struct-deref,Fail spec@arb_shader_storage_buffer_object@execution@ssbo-atomiccompswap-int,ExpectedFail spec@arb_shader_storage_buffer_object@layout-std140-write-shader,Fail spec@arb_shader_storage_buffer_object@maxblocks,Fail -spec@arb_shader_storage_buffer_object@minmax,Fail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgradcube,ExpectedFail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgrad,ExpectedFail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-07,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-08,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-cumulative,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 1d,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 1dshadow,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 2d,Fail @@ -472,8 +342,6 @@ spec@arb_texture_cube_map_array@fbo-generatemipmap-cubemap array s3tc_dxt1,Fail spec@arb_texture_float@fbo-blending-formats,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA16F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA32F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY16F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY32F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_RGB32F,Fail spec@arb_texture_float@fbo-clear-formats,Fail spec@arb_texture_float@fbo-clear-formats@GL_ALPHA16F_ARB,Fail @@ -514,8 +382,6 @@ spec@arb_texture_float@texwrap formats bordercolor-swizzled@GL_RGBA32F- swizzled spec@arb_texture_multisample@arb_texture_multisample-dsa-texelfetch,Fail spec@arb_texture_multisample@arb_texture_multisample-dsa-texelfetch@Texture type: GL_RGB9_E5,Fail spec@arb_texture_query_lod@execution@fs-texturequerylod-nearest-biased,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-07,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-08,Fail spec@arb_texture_rectangle@texwrap rect bordercolor,Fail spec@arb_texture_rectangle@texwrap rect bordercolor@GL_RGBA8- border color only,Fail spec@arb_texture_rectangle@texwrap rect proj bordercolor,Fail @@ -638,11 +504,6 @@ spec@ext_framebuffer_multisample@upsample 4 stencil,Fail spec@ext_framebuffer_object@fbo-blending-formats,Fail spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA12,Fail spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY12,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY4,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY8,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY,Fail spec@ext_framebuffer_object@fbo-blending-snorm,Fail spec@ext_framebuffer_object@fbo-clear-formats,Fail spec@ext_framebuffer_object@fbo-clear-formats@GL_ALPHA12,Fail @@ -678,10 +539,6 @@ spec@ext_provoking_vertex@provoking-vertex,Fail spec@ext_texture_array@fbo-generatemipmap-array rgb9_e5,Fail spec@ext_texture_array@fbo-generatemipmap-array s3tc_dxt1,Fail spec@ext_texture_array@gen-mipmap,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-08,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-08,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed@GL_COMPRESSED_SIGNED_RED_RGTC1,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed@GL_COMPRESSED_SIGNED_RED_RGTC1 NPOT,Fail @@ -728,10 +585,6 @@ spec@ext_texture_shared_exponent@texwrap formats bordercolor,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor@GL_RGB9_E5- border color only,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled@GL_RGB9_E5- swizzled- border color only,Fail -spec@ext_texture_snorm@fbo-blending-formats,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY16_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY8_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY_SNORM,Fail spec@ext_texture_snorm@multisample-formats 2 gl_ext_texture_snorm,Fail spec@ext_texture_snorm@multisample-formats 4 gl_ext_texture_snorm,Fail spec@ext_texture_snorm@texwrap formats bordercolor,Fail @@ -796,12 +649,9 @@ spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SR spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB- swizzled- border color only,Fail +spec@ext_transform_feedback@builtin-varyings gl_culldistance,Fail spec@ext_transform_feedback@immediate-reuse-index-buffer,Fail spec@ext_transform_feedback@immediate-reuse-uniform-buffer,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-08,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-08,Fail spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-clamp-z,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:texture() 1d,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:texture() 1dshadow,Fail @@ -817,47 +667,6 @@ spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 2d_projvec4,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 2dshadow,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 3d,Fail spec@glsl-1.30@execution@fs-texturelod-miplevels-biased,Fail -spec@glsl-1.30@execution@interpolation@interpolation-mixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-vertex,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1darray,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1d,Fail @@ -867,7 +676,6 @@ spec@glsl-1.30@execution@tex-miplevel-selection texture() 2darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 2d,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 2dshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 3d,Fail -spec@glsl-1.30@execution@tex-miplevel-selection texture(bias) 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cubearray,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cubearrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cube,Fail @@ -920,7 +728,6 @@ spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2d,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2dshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 3d,Fail -spec@glsl-1.30@execution@tex-miplevel-selection textureoffset(bias) 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1d,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1d_projvec4,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1dshadow,Fail @@ -974,7 +781,6 @@ spec@glsl-1.50@execution@geometry@primitive-id-restart gl_triangle_fan other,Fai spec@glsl-1.50@execution@geometry@primitive-id-restart gl_triangle_strip other,Fail spec@glsl-1.50@execution@geometry@tri-strip-ordering-with-prim-restart gl_triangle_strip_adjacency other,Fail spec@glsl-1.50@execution@geometry@tri-strip-ordering-with-prim-restart gl_triangle_strip other,Fail -spec@glsl-1.50@execution@gs-also-uses-smooth-flat-noperspective,Fail spec@glsl-1.50@execution@primitive-id-no-gs-first-vertex,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quad-strip,Fail @@ -2555,7 +2361,7 @@ spec@!opengl 1.0@gl-1.0-logicop@GL_NOOP,Fail spec@!opengl 1.0@gl-1.0-logicop@GL_NOOP_MSAA,Fail spec@!opengl 1.0@gl-1.0-spot-light,Fail spec@!opengl 1.0@gl-1.0-swapbuffers-behavior,ExpectedFail -spec@!opengl 1.0@rasterpos,Crash +spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail spec@!opengl 1.1@clipflat,Fail @@ -3353,7 +3159,6 @@ spec@!opengl 2.0@gl-2.0-edgeflag-immediate,Fail spec@!opengl 2.0@gl-2.0-large-point-fs,Fail spec@!opengl 2.0@gl-2.0-vertexattribpointer,Crash spec@!opengl 2.0@occlusion-query-discard,Fail -spec@!opengl 3.0@required-texture-attachment-formats,Fail spec@!opengl 3.0@sampler-cube-shadow,Fail spec@!opengl 3.2@gl-3.2-adj-prims cull-back pv-first,ExpectedFail spec@!opengl 3.2@gl-3.2-adj-prims cull-front pv-first,ExpectedFail diff --git a/.gitlab-ci/expectations/host/virgl-gles-flakes.txt b/.gitlab-ci/expectations/host/virgl-gles-flakes.txt index 5027ae16..4aa4035b 100644 --- a/.gitlab-ci/expectations/host/virgl-gles-flakes.txt +++ b/.gitlab-ci/expectations/host/virgl-gles-flakes.txt @@ -4,6 +4,10 @@ shaders@glsl-uniform-interstage-limits@subdivide 5 shaders@glsl-uniform-interstage-limits@subdivide 5- statechanges spec@arb_fragment_layer_viewport@viewport-gs-writes-in-range spec@arb_fragment_layer_viewport@layer-gs-writes-in-range +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4 +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glViewport spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-roundup-samples @@ -19,16 +23,6 @@ spec@arb_shader_image_load_store@atomicity@imageAtomicMax spec@arb_shader_image_load_store@atomicity@imageAtomicMin spec@arb_shader_image_load_store@atomicity@imageAtomicOr spec@arb_shader_image_load_store@atomicity@imageAtomicXor -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 spec@arb_shader_storage_buffer_object@execution@memory-layouts-struct-deref spec@arb_shader_storage_buffer_object@execution@ssbo-atomicadd-int spec@arb_shader_storage_buffer_object@execution@ssbo-atomicexchange-int @@ -36,6 +30,7 @@ spec@arb_shader_storage_buffer_object@layout-std140-write-shader spec@arb_shader_storage_buffer_object@layout-std430-write-shader spec@arb_timer_query@query gl_timestamp spec@arb_timer_query@timestamp-get +spec@ext_timer_query@time-elapsed spec@ext_framebuffer_blit@fbo-blit-check-limits spec@ext_framebuffer_blit@fbo-sys-blit spec@ext_framebuffer_blit@fbo-sys-sub-blit diff --git a/.gitlab-ci/expectations/host/virgl-gles-skips.txt b/.gitlab-ci/expectations/host/virgl-gles-skips.txt index cc3cd4da..e7ff1c8b 100644 --- a/.gitlab-ci/expectations/host/virgl-gles-skips.txt +++ b/.gitlab-ci/expectations/host/virgl-gles-skips.txt @@ -13,8 +13,6 @@ spec@ext_texture_integer@fbo-integer # Fails on iris too spec@arb_direct_state_access@gettextureimage-formats -spec@arb_texture_buffer_object@formats (fs- arb)* -spec@arb_texture_buffer_object@formats (vs- arb)* spec@nv_primitive_restart@primitive-restart-draw-mode-polygon spec@nv_primitive_restart@primitive-restart-draw-mode-quad_strip spec@nv_primitive_restart@primitive-restart-draw-mode-quads @@ -31,3 +29,142 @@ spec@arb_enhanced_layouts@execution@component-layout@vs-attribs-array # GLES doesn't support more than one stream spec@arb_enhanced_layouts@gs-stream-location-aliasing + +# All these tests use a RGBA32F RW image and this is not supported on GLES +# so skip the tests +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@layer +spec@arb_shader_image_load_store@layer@image1DArray/layered binding test +spec@arb_shader_image_load_store@layer@image1DArray/non-layered binding test +spec@arb_shader_image_load_store@layer@image1D/layered binding test +spec@arb_shader_image_load_store@layer@image1D/non-layered binding test +spec@arb_shader_image_load_store@layer@image2DArray/layered binding test +spec@arb_shader_image_load_store@layer@image2DArray/non-layered binding test +spec@arb_shader_image_load_store@layer@image2D/layered binding test +spec@arb_shader_image_load_store@layer@image2D/non-layered binding test +spec@arb_shader_image_load_store@layer@image2DRect/layered binding test +spec@arb_shader_image_load_store@layer@image2DRect/non-layered binding test +spec@arb_shader_image_load_store@layer@image3D/layered binding test +spec@arb_shader_image_load_store@layer@image3D/non-layered binding test +spec@arb_shader_image_load_store@layer@imageBuffer/layered binding test +spec@arb_shader_image_load_store@layer@imageBuffer/non-layered binding test +spec@arb_shader_image_load_store@layer@imageCubeArray/layered binding test +spec@arb_shader_image_load_store@layer@imageCubeArray/non-layered binding test +spec@arb_shader_image_load_store@layer@imageCube/layered binding test +spec@arb_shader_image_load_store@layer@imageCube/non-layered binding test +spec@arb_shader_image_load_store@level@1DArray level binding test +spec@arb_shader_image_load_store@level@1D level binding test +spec@arb_shader_image_load_store@level@2DArray level binding test +spec@arb_shader_image_load_store@level@2D level binding test +spec@arb_shader_image_load_store@level@3D level binding test +spec@arb_shader_image_load_store@level@CubeArray level binding test +spec@arb_shader_image_load_store@level@Cube level binding test +spec@arb_shader_image_load_store@level diff --git a/.gitlab-ci/expectations/virt/deqp-venus.toml b/.gitlab-ci/expectations/virt/deqp-venus.toml new file mode 100644 index 00000000..752d7eca --- /dev/null +++ b/.gitlab-ci/expectations/virt/deqp-venus.toml @@ -0,0 +1,6 @@ +[[deqp]] +deqp = "/install/crosvm-runner.sh" +caselists = [ "/deqp/mustpass/vk-master.txt" ] +deqp_args = [ "/deqp/external/vulkancts/modules/vulkan/deqp-vk" ] +timeout = 30.0 # Starting lots of Crosvm instances simultaneously can take some time +renderer_check = "Virtio-GPU Venus.*llvmpipe" diff --git a/.gitlab-ci/expectations/virt/deqp-virgl-gl.toml b/.gitlab-ci/expectations/virt/deqp-virgl-gl.toml index fc874c49..10daea0d 100644 --- a/.gitlab-ci/expectations/virt/deqp-virgl-gl.toml +++ b/.gitlab-ci/expectations/virt/deqp-virgl-gl.toml @@ -11,7 +11,7 @@ deqp_args = [ ] timeout = 360.0 # Starting 8 Crosvm instances simultaneously can take some time version_check = "GL ES 3.2.*git" -renderer_check = "virgl.*llvmpipe" +renderer_check = "virgl.*LLVMPIPE" [[deqp]] deqp = "/install/crosvm-runner.sh" diff --git a/.gitlab-ci/expectations/virt/deqp-virgl-gles.toml b/.gitlab-ci/expectations/virt/deqp-virgl-gles.toml index fc874c49..10daea0d 100644 --- a/.gitlab-ci/expectations/virt/deqp-virgl-gles.toml +++ b/.gitlab-ci/expectations/virt/deqp-virgl-gles.toml @@ -11,7 +11,7 @@ deqp_args = [ ] timeout = 360.0 # Starting 8 Crosvm instances simultaneously can take some time version_check = "GL ES 3.2.*git" -renderer_check = "virgl.*llvmpipe" +renderer_check = "virgl.*LLVMPIPE" [[deqp]] deqp = "/install/crosvm-runner.sh" diff --git a/.gitlab-ci/expectations/virt/traces-virgl.yml b/.gitlab-ci/expectations/virt/traces-virgl.yml new file mode 100644 index 00000000..bb4d8b30 --- /dev/null +++ b/.gitlab-ci/expectations/virt/traces-virgl.yml @@ -0,0 +1,311 @@ +traces-db: + download-url: "https://s3.freedesktop.org/mesa-tracie-public/" + +traces: + - path: glmark2/desktop:windows=4:effect=blur:blur-radius=5:passes=1:separable=true-v2.trace + expectations: + - device: gl-virgl + checksum: 2fc8433c4a38b796173bda2bcfb924cc + - path: glmark2/jellyfish-v2.trace + expectations: + - device: gl-virgl + checksum: 2112a9a5519f39483735509f2ccc61af + - path: glxgears/glxgears-2-v2.trace + expectations: + - device: gl-virgl + checksum: f8eba0fec6e3e0af9cb09844bc73bdc8 + - path: gputest/furmark-v2.trace + expectations: + - device: gl-virgl + checksum: 2762c809316c58d4eefad6677ecfcb2e + - path: gputest/pixmark-piano-v2.trace + expectations: + - device: gl-virgl + checksum: 0d875bda7edc01698342b157c6f51500 + - path: gputest/triangle-v2.trace + expectations: + - device: gl-virgl + checksum: 7812de00011a3a059892e36cea19c696 + - path: humus/Portals-v2.trace + expectations: + - device: gl-virgl + checksum: b697edce7776f1afe294a7e80dfc013e + - path: 0ad/0ad-v2.trace + expectations: + - device: gl-virgl + checksum: 350e0cf64d124ba98d90106f61775eb4 + - path: glmark2/buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=map:interleave=false-v2.trace + expectations: + - device: gl-virgl + checksum: f80431e56327354b4c88cc45c7e6633a + - path: glmark2/buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=subdata:interleave=false-v2.trace + expectations: + - device: gl-virgl + checksum: 81e12bfa4ae3b7e63b01edbed71a5941 + - path: glmark2/buffer:update-fraction=0.5:update-dispersion=0.9:columns=200:update-method=map:interleave=true-v2.trace + expectations: + - device: gl-virgl + checksum: 08e6d00fe3f4414ebfadc9e5f3c3bf0e + - path: glmark2/bump:bump-render=height-v2.trace + expectations: + - device: gl-virgl + checksum: 4d5211dfb0fd82a1a1dbb498dc2e5b8b + - path: glmark2/bump:bump-render=high-poly-v2.trace + expectations: + - device: gl-virgl + checksum: 4b4d4a4b7bb1341bbd0299c7eb3a6ac9 + - path: glmark2/bump:bump-render=normals-v2.trace + expectations: + - device: gl-virgl + checksum: 832e5baf289b27dd84a665f1c85f57c2 + - path: glmark2/conditionals:vertex-steps=0:fragment-steps=0-v2.trace + expectations: + - device: gl-virgl + checksum: b78f28d97b675fcc7649cced3930650a + - path: glmark2/conditionals:vertex-steps=0:fragment-steps=5-v2.trace + expectations: + - device: gl-virgl + checksum: d0782a516f06a6dddac4f1e1249f41e7 + - path: glmark2/conditionals:vertex-steps=5:fragment-steps=0-v2.trace + expectations: + - device: gl-virgl + checksum: 1ae280a9c6cae495f2d272516a52167e + - path: glmark2/desktop:windows=4:effect=shadow-v2.trace + expectations: + - device: gl-virgl + checksum: d4b3e8338327859a029c7267c9916524 + - path: glmark2/effect2d:kernel=0,1,0;1,-4,1;0,1,0;-v2.trace + expectations: + - device: gl-virgl + checksum: 35584880539813436d87bfcbe22cf59b + - path: glmark2/effect2d:kernel=1,1,1,1,1;1,1,1,1,1;1,1,1,1,1;-v2.trace + expectations: + - device: gl-virgl + checksum: b80963dae6ecf40c83bfb16943ef1011 + - path: glmark2/function:fragment-steps=5:fragment-complexity=low-v2.trace + expectations: + - device: gl-virgl + checksum: da10cb29cab30c5c068e722b5da7c2e5 + - path: glmark2/function:fragment-steps=5:fragment-complexity=medium-v2.trace + expectations: + - device: gl-virgl + checksum: 8e40504d9f2ead8c0d02604291bff1b6 + - path: glmark2/build:use-vbo=false-v2.trace + expectations: + - device: gl-virgl + checksum: 024fc485e1f33461313c956ab1b73bdf + - path: glmark2/build:use-vbo=true-v2.trace + expectations: + - device: gl-virgl + checksum: 48c45d16cd410a71aea1a12a73e257d3 + - path: glmark2/ideas:speed=10000-v2.trace + expectations: + - device: gl-virgl + checksum: db78cfb035213e31e1435b637b1a8f19 + - path: glmark2/loop:vertex-steps=5:fragment-steps=5:fragment-loop=false-v2.trace + expectations: + - device: gl-virgl + checksum: 7fee2e864e015353ace431d51d41bb22 + - path: glmark2/loop:vertex-steps=5:fragment-steps=5:fragment-uniform=false-v2.trace + expectations: + - device: gl-virgl + checksum: c87127a5c3256c1fe7c79f7931b8f9df + - path: glmark2/loop:vertex-steps=5:fragment-steps=5:fragment-uniform=true-v2.trace + expectations: + - device: gl-virgl + checksum: 5fec1f728bda86891db4243130546187 + - path: glmark2/pulsar:quads=5:texture=false:light=false-v2.trace + expectations: + - device: gl-virgl + checksum: 3e0e6675fb65e00f9128138ff08c2634 + - path: glmark2/refract-v2.trace + expectations: + - device: gl-virgl + checksum: cdadfee0518b964433d80c01329ec191 + - path: glmark2/shading:shading=blinn-phong-inf-v2.trace + expectations: + - device: gl-virgl + checksum: 36b07dad759ca65e52f1abf1667e7ca8 + - path: glmark2/shading:shading=cel-v2.trace + expectations: + - device: gl-virgl + checksum: cb41cf2531a06d65f6e4f442ab62ae8d + - path: glmark2/shading:shading=gouraud-v2.trace + expectations: + - device: gl-virgl + checksum: 3e5469d5038d7cc94ef3549ce9d8c385 + - path: glmark2/shading:shading=phong-v2.trace + expectations: + - device: gl-virgl + checksum: e40abcbb4cfbbbfb499d4b0e6d668f41 + - path: glmark2/shadow-v2.trace + expectations: + - device: gl-virgl + checksum: 2bb7290f8559ff93305c0e29f3d671e1 + - path: glmark2/texture:texture-filter=linear-v2.trace + expectations: + - device: gl-virgl + checksum: 914fd8dddb23751d9a187a979d881abb + - path: glmark2/texture:texture-filter=mipmap-v2.trace + expectations: + - device: gl-virgl + checksum: ea1939f3c4e8dd9cdbc26d41f9dc891a + - path: glmark2/texture:texture-filter=nearest-v2.trace + expectations: + - device: gl-virgl + checksum: 1ae652bdebd1188ab912a800a4c37166 +# Crash +# - path: gputest/gimark-v2.trace +# expectations: +# - device: gl-virgl +# checksum: 2cf40180a1315795389d0dfc18aad988 + - path: gputest/pixmark-julia-fp32-v2.trace + expectations: + - device: gl-virgl + checksum: 8b3584b1dd8f1d1bb63205564bd78e4e + - path: gputest/pixmark-julia-fp64-v2.trace + expectations: + - device: gl-virgl + checksum: 73ccaff82ea764057fb0f93f0024cf84 + - path: gputest/pixmark-volplosion-v2.trace + expectations: + - device: gl-virgl + checksum: aef0b32ce99a3b25d35304ca08032833 + - path: gputest/plot3d-v2.trace + expectations: + - device: gl-virgl + checksum: 817a36e53edccdf946061315596e9cdd +# Times out +# - path: gputest/tessmark-v2.trace +# expectations: +# - device: gl-virgl +# checksum: 5d04b8d71517238b9bc8a527574e884b + - path: humus/AmbientAperture-v2.trace + expectations: + - device: gl-virgl + checksum: b33fb8ee73b0c50b14822e170f15ab8a + - path: humus/CelShading-v2.trace + expectations: + - device: gl-virgl + checksum: 3629cba72bde53e4275a8365175fde83 + - path: humus/DynamicBranching3-v2.trace + expectations: + - device: gl-virgl + checksum: 0236b28aa8b26fa60172d71bb040f2e9 + - path: humus/HDR-v2.trace + expectations: + - device: gl-virgl + checksum: eab0801aadeae87ce31aa0d4ff55e8f8 + - path: humus/RaytracedShadows-v2.trace + expectations: + - device: gl-virgl + checksum: df074a376fd3e7abc4dffdd191db8f4b + - path: humus/VolumetricFogging2-v2.trace + expectations: + - device: gl-virgl + checksum: 2eb71553403ad8e0171abc9dc25e5bc1 + - path: itoral-gl-terrain-demo/demo-v2.trace + expectations: + - device: gl-virgl + checksum: 716d4fe36a6212b161285fed8a423ee8 + - path: neverball/neverball-v2.trace + expectations: + - device: gl-virgl + checksum: cc11743f008ccd76adf72695a423436a + - path: pathfinder/canvas_moire-v2.trace + expectations: + - device: gl-virgl + checksum: 25ba8f18274126670311bd3ffe058f74 + - path: pathfinder/canvas_text_v2-v2.trace + expectations: + - device: gl-virgl + checksum: a1446d0c42a78771240fca6f3b1e10d8 + - path: pathfinder/demo-v2.trace + expectations: + - device: gl-virgl + checksum: 0702a66c415cfc13d5bae8bec08402cf + # host crashes with + # "src/mesa/main/arrayobj.c:800:_mesa_update_vao_derived_arrays: Assertion + # `attrib->_EffRelativeOffset < binding->Stride' failed. running these. + # - path: paraview/pv-manyspheres-v2.trace + # expectations: + # - device: gl-virgl + # checksum: b740377ea4bbb3becd304d1696a55247 + # - path: paraview/pv-waveletcontour-v2.trace + # expectations: + # - device: gl-virgl + # checksum: db43c733f3f3d5253e263838e58d9111 + - path: paraview/pv-waveletvolume-v2.trace + expectations: + - device: gl-virgl + checksum: f4af4067b37c00861fa5911e4c0a6629 + - path: supertuxkart/supertuxkart-mansion-egl-gles-v2.trace + expectations: + - device: gl-virgl + checksum: 092e8ca38e58aaa83df2a9f0b7b8aee5 + - path: xonotic/xonotic-keybench-high-v2.trace + expectations: + - device: gl-virgl + checksum: f3b184bf8858a6ebccd09e7ca032197e + - path: valve/counterstrike-v2.trace + expectations: + - device: gl-virgl + checksum: 3bc0e0e39cb3c29f6d76ff07f1f02860 + - path: valve/counterstrike-source-v2.trace + expectations: + - device: gl-virgl + checksum: f8e5b19142007be14ce6d18d25ef329d + - path: valve/half-life-2-v2.trace + expectations: + - device: gl-virgl + checksum: 6099a13f48bf090ee1d768f98208da70 + - path: valve/portal-2-v2.trace + expectations: + - device: gl-virgl + checksum: 7489a8412ee2bca45431d208e0006a3e +# Piglit crashes when trying to run this one +# - path: supertuxkart/supertuxkart-antediluvian-abyss.rdc +# expectations: +# - device: gl-virgl +# checksum: 0 +# Piglit crashes when trying to run this one +# - path: supertuxkart/supertuxkart-menu.rdc +# expectations: +# - device: gl-virgl +# checksum: 0 +# Piglit crashes when trying to run this one +# - path: supertuxkart/supertuxkart-ravenbridge-mansion.rdc +# expectations: +# - device: gl-virgl +# checksum: 0 + - path: godot/Material Testers.x86_64_2020.04.08_13.38_frame799.rdc + expectations: + - device: gl-virgl + checksum: 232eb48d6689c0117e3cc1660af7f32d + # ../src/mesa/main/arrayobj.c:800:_mesa_update_vao_derived_arrays: Assertion `attrib->_EffRelativeOffset < binding->Stride' failed. + #- path: ror/ror-default.trace + # expectations: + #- device: gl-virgl + #- path: nheko/nheko-colors.trace + # expectations: + #- device: gl-virgl + # checksum: 3a12c08087e16cfae4729f4e9d6c9387 + #- path: blender/blender-demo-cube_diorama.trace + # expectations: + #- device: gl-virgl + #- path: blender/blender-demo-ellie_pose.trace + # expectations: + #- device: gl-virgl + #- path: freedoom/freedoom-phase2-gl-high.trace + # expectations: + #- device: gl-virgl + #- path: unvanquished/unvanquished-lowest.trace + # expectations: + #- device: gl-virgl + #- path: unvanquished/unvanquished-ultra.trace + # expectations: + #- device: gl-virgl + - path: warzone2100/warzone2100-default.trace + expectations: + - device: gl-virgl + checksum: 1fd3f9b5e5a711bdfac49dc03912e1de diff --git a/.gitlab-ci/expectations/virt/venus-fails.txt b/.gitlab-ci/expectations/virt/venus-fails.txt new file mode 100644 index 00000000..8916f9e2 --- /dev/null +++ b/.gitlab-ci/expectations/virt/venus-fails.txt @@ -0,0 +1,15 @@ +# Failures likely due to lavapipe (i.e. the intersection of observed failures and lvp-fails.txt) +dEQP-VK.glsl.crash_test.divbyzero_comp,Crash + +# Full Venus list +dEQP-VK.multiview.queries.15_15_15_15,Fail +dEQP-VK.multiview.queries.15,Fail +dEQP-VK.multiview.queries.5_10_5_10,Fail +dEQP-VK.multiview.renderpass2.queries.15_15_15_15,Fail +dEQP-VK.multiview.renderpass2.queries.15,Fail +dEQP-VK.multiview.renderpass2.queries.5_10_5_10,Fail +dEQP-VK.pipeline.extended_dynamic_state.after_pipelines.enable_raster,Fail +dEQP-VK.pipeline.extended_dynamic_state.before_draw.enable_raster,Fail +dEQP-VK.pipeline.extended_dynamic_state.between_pipelines.enable_raster,Fail +dEQP-VK.pipeline.extended_dynamic_state.cmd_buffer_start.enable_raster,Fail +dEQP-VK.pipeline.extended_dynamic_state.two_draws_dynamic.enable_raster,Fail diff --git a/.gitlab-ci/expectations/virt/venus-flakes.txt b/.gitlab-ci/expectations/virt/venus-flakes.txt new file mode 100644 index 00000000..19891bfa --- /dev/null +++ b/.gitlab-ci/expectations/virt/venus-flakes.txt @@ -0,0 +1,8 @@ +dEQP-VK.synchronization.*16384 +dEQP-VK.synchronization.*262144 +dEQP-VK.spirv_assembly.instruction.graphics.64bit_compare.double.frag_opfordnotequal_nonan_vector +dEQP-VK.robustness.buffer_access.fragment.vec4_copy.r32_uint.oob_storage_read.range_4_bytes +dEQP-VK.robustness.buffer_access.fragment.vec4_copy.r32_uint.oob_storage_write.range_32_bytes +dEQP-VK.robustness.buffer_access.fragment.texel_copy.r32g32b32a32_sfloat.oob_storage_write.range_3_texels +dEQP-VK.robustness.buffer_access.fragment.texel_copy.r32g32b32a32_uint.oob_storage_write.range_3_texels +dEQP-VK.subgroups.ballot_broadcast.compute.subgroupbroadcast_uvec4 diff --git a/.gitlab-ci/expectations/virt/venus-skips.txt b/.gitlab-ci/expectations/virt/venus-skips.txt new file mode 100644 index 00000000..e67e91bb --- /dev/null +++ b/.gitlab-ci/expectations/virt/venus-skips.txt @@ -0,0 +1,2 @@ +# These take so long that cause caselist batches to timeout +dEQP-VK.pipeline.monolithic.*
\ No newline at end of file diff --git a/.gitlab-ci/expectations/virt/virgl-gl-fails.txt b/.gitlab-ci/expectations/virt/virgl-gl-fails.txt index 291f25b0..fa9155f6 100644 --- a/.gitlab-ci/expectations/virt/virgl-gl-fails.txt +++ b/.gitlab-ci/expectations/virt/virgl-gl-fails.txt @@ -27,8 +27,6 @@ dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_corner,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_center,Fail dEQP-GLES3.functional.clipping.point.wide_point_clip_viewport_corner,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.8,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_required_draw_buffers.9,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_x,Fail @@ -63,95 +61,7 @@ shaders@point-vertex-id gl_vertexid gl_instanceid,Fail spec@arb_blend_func_extended@arb_blend_func_extended-fbo-extended-blend-pattern_gles2,Fail spec@arb_clear_texture@arb_clear_texture-depth,Fail spec@arb_copy_image@arb_copy_image-formats,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RED_RGTC1/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_BPTC_UNORM/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_RG_RGTC2/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RED_RGTC1/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RG_RGTC2/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail spec@arb_copy_image@arb_copy_image-formats@Source: GL_DEPTH_COMPONENT24/Destination: GL_DEPTH_COMPONENT24,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32F/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32I/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RG32UI/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16I/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16_SNORM/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA16UI/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32F/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32I/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@arb_copy_image@arb_copy_image-formats@Source: GL_RGBA32UI/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-copypixels,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-drawpixels-24_8,Fail spec@arb_depth_buffer_float@fbo-depthstencil-gl_depth32f_stencil8-drawpixels-32f_24_8_rev,Fail @@ -170,16 +80,15 @@ spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT16 spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT24- swizzled- border color only,Fail spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT32- swizzled- border color only,Fail spec@arb_direct_state_access@gettextureimage-targets,Fail +spec@arb_enhanced_layouts@matching_fp64_types_1,Crash +spec@arb_enhanced_layouts@matching_fp64_types_2,Crash +spec@arb_enhanced_layouts@matching_fp64_types_3,Crash spec@arb_es2_compatibility@texwrap formats bordercolor,Fail spec@arb_es2_compatibility@texwrap formats bordercolor@GL_RGB565- border color only,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled@GL_RGB565- swizzled- border color only,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glViewport,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-roundup-samples,Fail spec@arb_get_texture_sub_image@arb_get_texture_sub_image-getcompressed,Crash spec@arb_get_texture_sub_image@arb_get_texture_sub_image-get,Fail @@ -193,7 +102,6 @@ spec@arb_program_interface_query@arb_program_interface_query-getprogramresourcei spec@arb_sample_shading@builtin-gl-sample-position 2,Fail spec@arb_shader_atomic_counter_ops@execution@add,Fail spec@arb_shader_atomic_counters@fragment-discard,Fail -spec@arb_shader_atomic_counters@function-argument,Fail spec@arb_shader_image_load_store@early-z,Fail spec@arb_shader_image_load_store@early-z@occlusion query test/early-z pass,Fail spec@arb_shader_image_load_store@layer,Fail @@ -212,16 +120,8 @@ spec@arb_shader_image_load_store@semantics@imageLoad/Vertex shader/rgba32f/image spec@arb_shader_image_load_store@semantics@imageLoad/Vertex shader/rgba32f/image2DMS test,Fail spec@arb_shader_storage_buffer_object@execution@ssbo-atomiccompswap-int,Fail spec@arb_shader_storage_buffer_object@execution@ssbo-atomicexchange-int,Fail -spec@arb_shader_storage_buffer_object@layout-std140-write-shader,Fail -spec@arb_shader_storage_buffer_object@layout-std430-write-shader,Fail spec@arb_shader_storage_buffer_object@maxblocks,Fail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgrad,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-07,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-08,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-cumulative,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_rgb_bptc_signed_float,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_rgb_bptc_unsigned_float,Fail -spec@arb_texture_compression_bptc@compressedteximage gl_compressed_srgb_alpha_bptc_unorm,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor@GL_COMPRESSED_RGBA_BPTC_UNORM- border color only,Fail spec@arb_texture_compression_bptc@texwrap formats bordercolor@GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT- border color only,Fail @@ -250,8 +150,6 @@ spec@arb_texture_cube_map_array@fbo-generatemipmap-cubemap array s3tc_dxt1,Fail spec@arb_texture_float@fbo-blending-formats,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA16F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA32F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY16F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY32F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_RGB32F,Fail spec@arb_texture_float@fbo-clear-formats,Fail spec@arb_texture_float@fbo-clear-formats@GL_ALPHA16F_ARB,Fail @@ -292,8 +190,6 @@ spec@arb_texture_float@texwrap formats bordercolor-swizzled@GL_RGBA32F- swizzled spec@arb_texture_rectangle@copyteximage rect,Fail spec@arb_texture_rectangle@copyteximage rect samples=2,Fail spec@arb_texture_rectangle@copyteximage rect samples=4,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-07,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-08,Fail spec@arb_texture_rectangle@texwrap rect bordercolor,Fail spec@arb_texture_rectangle@texwrap rect bordercolor@GL_RGBA8- border color only,Fail spec@arb_texture_rectangle@texwrap rect proj bordercolor,Fail @@ -335,32 +231,6 @@ spec@egl_ext_device_base@conformance@surfaceless_tests,Fail spec@egl_ext_protected_content@conformance,Fail spec@egl_khr_gl_image@egl_khr_gl_renderbuffer_image-clear-shared-image gl_depth_component24,Fail spec@egl_khr_surfaceless_context@viewport,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT,Fail -spec@ext_direct_state_access@compressedmultiteximage gl_compressed_rgb_bptc_signed_float,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage2DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureImage3DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage2DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE_AND_EXECUTE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT + display list GL_COMPILE,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float@CompressedTextureSubImage3DEXT,Fail -spec@ext_direct_state_access@compressedtextureimage gl_compressed_rgb_bptc_signed_float,Fail spec@ext_framebuffer_multisample@alpha-blending-after-rendering 2,Fail spec@ext_framebuffer_multisample@blit-mismatched-formats,Fail spec@ext_framebuffer_multisample@interpolation 2 centroid-edges,Fail @@ -372,12 +242,6 @@ spec@ext_framebuffer_multisample@no-color 4 depth single,Fail spec@ext_framebuffer_multisample@sample-coverage 2 inverted,Fail spec@ext_framebuffer_multisample@sample-coverage 2 non-inverted,Fail spec@ext_framebuffer_object@fbo-blending-format-quirks,Fail -spec@ext_framebuffer_object@fbo-blending-formats,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY12,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY4,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY8,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats@GL_DEPTH_COMPONENT24/GL_FLOAT,Fail spec@ext_framebuffer_object@fbo-readpixels-depth-formats@GL_DEPTH_COMPONENT/GL_FLOAT,Fail @@ -413,10 +277,6 @@ spec@ext_packed_float@texwrap formats bordercolor-swizzled@GL_R11F_G11F_B10F- sw spec@ext_texture_array@fbo-generatemipmap-array s3tc_dxt1,Fail spec@ext_texture_array@gen-mipmap,Fail spec@ext_texture_array@getteximage-targets 1d_array,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-08,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-08,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor@GL_COMPRESSED_RED_RGTC1- border color only,Fail spec@ext_texture_compression_rgtc@texwrap formats bordercolor@GL_COMPRESSED_RG_RGTC2- border color only,Fail @@ -459,10 +319,6 @@ spec@ext_texture_shared_exponent@texwrap formats bordercolor,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor@GL_RGB9_E5- border color only,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled@GL_RGB9_E5- swizzled- border color only,Fail -spec@ext_texture_snorm@fbo-blending-formats,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY16_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY8_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY_SNORM,Fail spec@ext_texture_snorm@texwrap formats bordercolor,Fail spec@ext_texture_snorm@texwrap formats bordercolor@GL_ALPHA16_SNORM- border color only,Fail spec@ext_texture_snorm@texwrap formats bordercolor@GL_ALPHA8_SNORM- border color only,Fail @@ -525,10 +381,7 @@ spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SR spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB- swizzled- border color only,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-08,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-08,Fail +spec@ext_transform_feedback@builtin-varyings gl_culldistance,Fail spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-clamp-z,Fail spec@glsl-1.30@execution@texelfetch@fs-texelfetch-isampler1darray,Fail spec@glsl-1.30@execution@texelfetch@fs-texelfetch-sampler1darray,Fail @@ -543,72 +396,29 @@ spec@glsl-1.30@execution@texelfetch@vs-texelfetch-usampler1darray,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quad-strip,Fail spec@glsl-1.50@execution@variable-indexing@gs-input-array-float-index-rd,Fail -spec@khr_texture_compression_astc@array-gl@12x12 Block Dim,Fail -spec@khr_texture_compression_astc@array-gl@5x5 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles@12x12 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles@5x5 Block Dim,Fail -spec@khr_texture_compression_astc@array-gles,Fail -spec@khr_texture_compression_astc@array-gl,Fail -spec@khr_texture_compression_astc@miptree-gles ldr,Fail -spec@khr_texture_compression_astc@miptree-gles ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@miptree-gles srgb,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@miptree-gles srgb-sd,Fail -spec@khr_texture_compression_astc@miptree-gles srgb-sd@sRGB skip decode,Fail -spec@khr_texture_compression_astc@miptree-gles srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@miptree-gl ldr,Fail -spec@khr_texture_compression_astc@miptree-gl ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@miptree-gl srgb,Fail spec@khr_texture_compression_astc@miptree-gl srgb-fp,Fail spec@khr_texture_compression_astc@miptree-gl srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@miptree-gl srgb-sd,Fail -spec@khr_texture_compression_astc@miptree-gl srgb-sd@sRGB skip decode,Fail -spec@khr_texture_compression_astc@miptree-gl srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles ldr,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gles srgb@sRGB decode,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl ldr,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl ldr@LDR Profile,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp,Fail spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb-fp@sRGB decode full precision,Fail -spec@khr_texture_compression_astc@sliced-3d-miptree-gl srgb@sRGB decode,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 0 0x223344ff,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 0 0x76356278,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x223344ff,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color 1 0x76356278,Fail spec@nv_copy_depth_to_color@nv_copy_depth_to_color,Fail spec@nv_copy_image@nv_copy_image-formats,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RED_RGTC1/Destination: GL_COMPRESSED_RED_RGTC1,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_BPTC_UNORM/Destination: GL_COMPRESSED_RGBA_BPTC_UNORM,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT3_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_RGBA_S3TC_DXT5_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT/Destination: GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_RGB_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_RG_RGTC2/Destination: GL_COMPRESSED_RG_RGTC2,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RED_RGTC1/Destination: GL_COMPRESSED_SIGNED_RED_RGTC1,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SIGNED_RG_RGTC2/Destination: GL_COMPRESSED_SIGNED_RG_RGTC2,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM/Destination: GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT/Destination: GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT,Fail -spec@nv_copy_image@nv_copy_image-formats@Source: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT/Destination: GL_COMPRESSED_SRGB_S3TC_DXT1_EXT,Fail spec@nv_copy_image@nv_copy_image-formats@Source: GL_DEPTH_COMPONENT24/Destination: GL_DEPTH_COMPONENT24,Fail spec@nv_read_depth@read_depth_gles3,Fail spec@!opengl 1.0@depth-clear-precision-check@depth32,Fail spec@!opengl 1.0@depth-clear-precision-check,Fail -spec@!opengl 1.0@gl-1.0-dlist-bitmap,Fail spec@!opengl 1.0@gl-1.0-drawbuffer-modes,Fail spec@!opengl 1.0@gl-1.0-edgeflag,Fail spec@!opengl 1.0@gl-1.0-edgeflag-quads,Fail spec@!opengl 1.0@gl-1.0-swapbuffers-behavior,Fail -spec@!opengl 1.0@rasterpos,Crash +spec@!opengl 1.0@rasterpos,Fail spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail spec@!opengl 1.1@copypixels-draw-sync,Fail @@ -641,7 +451,6 @@ spec@!opengl 1.1@read-front clear-front-first samples=4,Crash spec@!opengl 1.1@read-front,Fail spec@!opengl 1.1@read-front samples=2,Crash spec@!opengl 1.1@read-front samples=4,Fail -spec@!opengl 1.1@streaming-texture-leak,Crash spec@!opengl 1.1@texwrap 1d bordercolor,Fail spec@!opengl 1.1@texwrap 1d bordercolor@GL_RGBA8- border color only,Fail spec@!opengl 1.1@texwrap 1d proj bordercolor,Fail diff --git a/.gitlab-ci/expectations/virt/virgl-gl-flakes.txt b/.gitlab-ci/expectations/virt/virgl-gl-flakes.txt index cf24ad0a..1101b2cf 100644 --- a/.gitlab-ci/expectations/virt/virgl-gl-flakes.txt +++ b/.gitlab-ci/expectations/virt/virgl-gl-flakes.txt @@ -34,6 +34,7 @@ spec@arb_shader_storage_buffer_object@execution@ssbo-atomicexchange-int spec@arb_texture_rg@fbo-rg-gl_rg spec@arb_timer_query@query gl_timestamp spec@arb_timer_query@timestamp-get +spec@ext_timer_query@time-elapsed spec@ext_framebuffer_blit@fbo-blit-check-limits spec@ext_framebuffer_blit@fbo-sys-blit spec@ext_framebuffer_blit@fbo-sys-sub-blit @@ -50,6 +51,7 @@ spec@glsl-4.00@execution@built-in-functions@gs-mix-dvec2-dvec2-dvec2 spec@glsl-4.00@execution@built-in-functions@vs-op-mult-dmat3x4-dvec3 spec@glsl-4.30@execution@built-in-functions@cs-op-bitand-not-uvec2-uvec2 spec@glsl-4.30@execution@built-in-functions@cs-op-bitor-abs-not-int-ivec4 +spec@glsl-4.50@execution@ssbo-atomiccompswap-int spec@oes_texture_view@sampling-2d-array-as-2d-layer spec@oes_viewport_array@viewport-gs-writes-in-range spec@!opengl 1.0@gl-1.0-drawbuffer-modes diff --git a/.gitlab-ci/expectations/virt/virgl-gl-skips.txt b/.gitlab-ci/expectations/virt/virgl-gl-skips.txt index 1f4dcb1f..e9fef33e 100644 --- a/.gitlab-ci/expectations/virt/virgl-gl-skips.txt +++ b/.gitlab-ci/expectations/virt/virgl-gl-skips.txt @@ -16,9 +16,6 @@ spec@ext_texture_integer@fbo-integer # Fails on iris too spec@arb_direct_state_access@gettextureimage-formats -spec@arb_texture_buffer_object@formats (fs- arb)* -spec@arb_texture_buffer_object@formats (vs- arb)* - # Skip these as they get skipped with the Intel driver + vtest spec@arb_shader_texture_image_samples@builtin-image* diff --git a/.gitlab-ci/expectations/virt/virgl-gles-fails.txt b/.gitlab-ci/expectations/virt/virgl-gles-fails.txt index 9837c021..03c690e7 100644 --- a/.gitlab-ci/expectations/virt/virgl-gles-fails.txt +++ b/.gitlab-ci/expectations/virt/virgl-gles-fails.txt @@ -11,8 +11,6 @@ dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two dEQP-GLES31.functional.shaders.sample_variables.sample_mask_in.bit_count_per_two_samples.multisample_texture_2,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_center,Fail dEQP-GLES3.functional.clipping.line.wide_line_clip_viewport_corner,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_implementation_draw_buffers.8,Fail -dEQP-GLES3.functional.draw_buffers_indexed.random.max_required_draw_buffers.9,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_mag_reverse_src_dst_x,Fail @@ -23,12 +21,9 @@ dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_x,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_dst_y,Fail dEQP-GLES3.functional.fbo.blit.rect.nearest_consistency_min_reverse_src_x,Fail -KHR-GL30.glsl_noperspective.functionaltest,Fail KHR-GL30.transform_feedback.api_errors_test,Fail KHR-GL30.transform_feedback.draw_xfb_stream_instanced_test,Fail -KHR-GL31.glsl_noperspective.functionaltest,Fail KHR-GL31.transform_feedback.draw_xfb_stream_instanced_test,Fail -KHR-GL32.glsl_noperspective.functionaltest,Fail KHR-GL32.transform_feedback.draw_xfb_stream_instanced_test,Fail KHR-GL32.transform_feedback_overflow_query_ARB.advanced-single-stream-interleaved-attribs,Fail KHR-GL32.transform_feedback_overflow_query_ARB.advanced-single-stream-separate-attribs,Fail @@ -210,16 +205,17 @@ spec@arb_depth_texture@texwrap formats bordercolor-swizzled@GL_DEPTH_COMPONENT32 spec@arb_draw_indirect@arb_draw_indirect-draw-elements-prim-restart-ugly,Fail spec@arb_enhanced_layouts@linker@component-layout@intrastage-vs,Fail spec@arb_enhanced_layouts@linker@component-layout@vs-to-fs,Fail +spec@arb_enhanced_layouts@matching_basic_types_3_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_1,Crash +spec@arb_enhanced_layouts@matching_fp64_types_1_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_2,Crash +spec@arb_enhanced_layouts@matching_fp64_types_2_loc_1,Fail +spec@arb_enhanced_layouts@matching_fp64_types_3,Crash +spec@arb_enhanced_layouts@matching_fp64_types_3_loc_1,Fail spec@arb_es2_compatibility@texwrap formats bordercolor,Fail spec@arb_es2_compatibility@texwrap formats bordercolor@GL_RGB565- border color only,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled,Fail spec@arb_es2_compatibility@texwrap formats bordercolor-swizzled@GL_RGB565- swizzled- border color only,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glViewport,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4,Fail -spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@Basic,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query@discard,Fail spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-query,Fail @@ -279,8 +275,6 @@ spec@arb_sample_shading@samplemask 4@noms mask_in_one,Fail spec@arb_sample_shading@samplemask 4@noms partition,Fail spec@arb_sample_shading@samplemask 4@sample mask_in_one,Fail spec@arb_seamless_cube_map@arb_seamless_cubemap,Fail -spec@arb_shader_atomic_counters@fragment-discard,Fail -spec@arb_shader_atomic_counters@function-argument,Fail spec@arb_shader_image_load_store@bitcast,Fail spec@arb_shader_image_load_store@bitcast@r11f_g11f_b10f to rgba8_snorm bitcast test,Fail spec@arb_shader_image_load_store@bitcast@r32f to rgba8_snorm bitcast test,Fail @@ -302,131 +296,6 @@ spec@arb_shader_image_load_store@early-z,ExpectedFail spec@arb_shader_image_load_store@early-z@occlusion query test/early-z pass,ExpectedFail spec@arb_shader_image_load_store@early-z@occlusion query test/late-z pass,Fail spec@arb_shader_image_load_store@execution@disable_early_z,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Pixel/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/64x64,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/16x16,Fail -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/64x64,Fail -spec@arb_shader_image_load_store@layer,Fail -spec@arb_shader_image_load_store@layer@image1DArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1DArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image1D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DRect/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image2DRect/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@image3D/layered binding test,Fail -spec@arb_shader_image_load_store@layer@image3D/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageBuffer/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageBuffer/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCubeArray/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCubeArray/non-layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCube/layered binding test,Fail -spec@arb_shader_image_load_store@layer@imageCube/non-layered binding test,Fail -spec@arb_shader_image_load_store@level@1DArray level binding test,Fail -spec@arb_shader_image_load_store@level@1D level binding test,Fail -spec@arb_shader_image_load_store@level@2DArray level binding test,Fail -spec@arb_shader_image_load_store@level@2D level binding test,Fail -spec@arb_shader_image_load_store@level@3D level binding test,Fail -spec@arb_shader_image_load_store@level@CubeArray level binding test,Fail -spec@arb_shader_image_load_store@level@Cube level binding test,Fail -spec@arb_shader_image_load_store@level,Fail spec@arb_shader_image_load_store@max-images@Combined max image uniforms test,Fail spec@arb_shader_image_load_store@max-images,Fail spec@arb_shader_image_load_store@max-size,Crash @@ -437,15 +306,9 @@ spec@arb_shader_image_load_store@semantics,Fail spec@arb_shader_image_load_store@semantics@imageStore/Vertex shader/rgba32f/image1D test,Fail spec@arb_shader_storage_buffer_object@execution@indirect,Fail spec@arb_shader_storage_buffer_object@execution@ssbo-atomiccompswap-int,ExpectedFail -spec@arb_shader_storage_buffer_object@layout-std140-write-shader,Fail -spec@arb_shader_storage_buffer_object@layout-std430-write-shader,Fail spec@arb_shader_storage_buffer_object@maxblocks,Fail -spec@arb_shader_storage_buffer_object@minmax,Fail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgradcube,ExpectedFail spec@arb_shader_texture_lod@execution@arb_shader_texture_lod-texgrad,ExpectedFail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-07,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-08,Fail -spec@arb_shader_texture_lod@execution@glsl-fs-shadow2dgradarb-cumulative,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 1d,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 1dshadow,Fail spec@arb_shader_texture_lod@execution@tex-miplevel-selection *gradarb 2d,Fail @@ -504,8 +367,6 @@ spec@arb_texture_cube_map_array@fbo-generatemipmap-cubemap array s3tc_dxt1,Fail spec@arb_texture_float@fbo-blending-formats,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA16F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_ALPHA32F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY16F_ARB,Fail -spec@arb_texture_float@fbo-blending-formats@GL_INTENSITY32F_ARB,Fail spec@arb_texture_float@fbo-blending-formats@GL_RGB32F,Fail spec@arb_texture_float@fbo-clear-formats,Fail spec@arb_texture_float@fbo-clear-formats@GL_ALPHA16F_ARB,Fail @@ -546,8 +407,6 @@ spec@arb_texture_float@texwrap formats bordercolor-swizzled@GL_RGBA32F- swizzled spec@arb_texture_multisample@arb_texture_multisample-dsa-texelfetch,Fail spec@arb_texture_multisample@arb_texture_multisample-dsa-texelfetch@Texture type: GL_RGB9_E5,Fail spec@arb_texture_query_lod@execution@fs-texturequerylod-nearest-biased,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-07,Fail -spec@arb_texture_rectangle@glsl-fs-shadow2drect-08,Fail spec@arb_texture_rectangle@texwrap rect bordercolor,Fail spec@arb_texture_rectangle@texwrap rect bordercolor@GL_RGBA8- border color only,Fail spec@arb_texture_rectangle@texwrap rect proj bordercolor,Fail @@ -674,11 +533,6 @@ spec@ext_framebuffer_multisample@upsample 4 stencil,Fail spec@ext_framebuffer_object@fbo-blending-formats,Fail spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA12,Fail spec@ext_framebuffer_object@fbo-blending-formats@GL_ALPHA16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY12,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY16,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY4,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY8,Fail -spec@ext_framebuffer_object@fbo-blending-formats@GL_INTENSITY,Fail spec@ext_framebuffer_object@fbo-blending-snorm,Fail spec@ext_framebuffer_object@fbo-clear-formats,Fail spec@ext_framebuffer_object@fbo-clear-formats@GL_ALPHA12,Fail @@ -730,10 +584,6 @@ spec@ext_provoking_vertex@provoking-vertex,Fail spec@ext_texture_array@fbo-generatemipmap-array rgb9_e5,Fail spec@ext_texture_array@fbo-generatemipmap-array s3tc_dxt1,Fail spec@ext_texture_array@gen-mipmap,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow1darray-08,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-07,Fail -spec@ext_texture_array@glsl-fs-shadow2darray-08,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed@GL_COMPRESSED_SIGNED_RED_RGTC1,Fail spec@ext_texture_compression_rgtc@fbo-generatemipmap-formats-signed@GL_COMPRESSED_SIGNED_RED_RGTC1 NPOT,Fail @@ -781,10 +631,6 @@ spec@ext_texture_shared_exponent@texwrap formats bordercolor,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor@GL_RGB9_E5- border color only,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled,Fail spec@ext_texture_shared_exponent@texwrap formats bordercolor-swizzled@GL_RGB9_E5- swizzled- border color only,Fail -spec@ext_texture_snorm@fbo-blending-formats,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY16_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY8_SNORM,Fail -spec@ext_texture_snorm@fbo-blending-formats@GL_INTENSITY_SNORM,Fail spec@ext_texture_snorm@multisample-formats 2 gl_ext_texture_snorm,Fail spec@ext_texture_snorm@multisample-formats 4 gl_ext_texture_snorm,Fail spec@ext_texture_snorm@texwrap formats bordercolor,Fail @@ -849,12 +695,9 @@ spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SR spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_ALPHA- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB_S3TC_DXT1_EXT- swizzled- border color only,Fail spec@ext_texture_srgb@texwrap formats-s3tc bordercolor-swizzled@GL_COMPRESSED_SRGB- swizzled- border color only,Fail +spec@ext_transform_feedback@builtin-varyings gl_culldistance,Fail spec@ext_transform_feedback@immediate-reuse-index-buffer,Fail spec@ext_transform_feedback@immediate-reuse-uniform-buffer,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow1d-08,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-07,Fail -spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-08,Fail spec@glsl-1.10@execution@samplers@glsl-fs-shadow2d-clamp-z,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:texture() 1d,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:texture() 1dshadow,Fail @@ -870,47 +713,6 @@ spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 2d_projvec4,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 2dshadow,Fail spec@glsl-1.20@execution@tex-miplevel-selection gl2:textureproj 3d,Fail spec@glsl-1.30@execution@fs-texturelod-miplevels-biased,Fail -spec@glsl-1.30@execution@interpolation@interpolation-mixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backcolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_backsecondarycolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontcolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-gl_frontsecondarycolor-smooth-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-flat-vertex,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-distance,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-fixed,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-none,Fail -spec@glsl-1.30@execution@interpolation@interpolation-noperspective-other-smooth-vertex,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1darray,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 1d,Fail @@ -920,7 +722,6 @@ spec@glsl-1.30@execution@tex-miplevel-selection texture() 2darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 2d,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 2dshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() 3d,Fail -spec@glsl-1.30@execution@tex-miplevel-selection texture(bias) 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cubearray,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cubearrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection texture() cube,Fail @@ -973,7 +774,6 @@ spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2d,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 2dshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureoffset 3d,Fail -spec@glsl-1.30@execution@tex-miplevel-selection textureoffset(bias) 1darrayshadow,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1d,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1d_projvec4,Fail spec@glsl-1.30@execution@tex-miplevel-selection textureproj 1dshadow,Fail @@ -1027,7 +827,6 @@ spec@glsl-1.50@execution@geometry@primitive-id-restart gl_triangle_fan other,Fai spec@glsl-1.50@execution@geometry@primitive-id-restart gl_triangle_strip other,Fail spec@glsl-1.50@execution@geometry@tri-strip-ordering-with-prim-restart gl_triangle_strip_adjacency other,Fail spec@glsl-1.50@execution@geometry@tri-strip-ordering-with-prim-restart gl_triangle_strip other,Fail -spec@glsl-1.50@execution@gs-also-uses-smooth-flat-noperspective,Fail spec@glsl-1.50@execution@primitive-id-no-gs-first-vertex,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quads,Fail spec@glsl-1.50@execution@primitive-id-no-gs-quad-strip,Fail @@ -2608,9 +2407,6 @@ spec@!opengl 1.0@gl-1.0-logicop@GL_NOOP,Fail spec@!opengl 1.0@gl-1.0-logicop@GL_NOOP_MSAA,Fail spec@!opengl 1.0@gl-1.0-spot-light,Fail spec@!opengl 1.0@gl-1.0-swapbuffers-behavior,ExpectedFail -spec@!opengl 1.0@rasterpos,Crash -spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail -spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail spec@!opengl 1.1@clipflat,Fail spec@!opengl 1.1@clipflat@glBegin/End(GL_POLYGON)- glFrontFace(GL_CCW)- glPolygonMode(GL_FILL)- quadrant: center bottom PV: FIRST,Fail spec@!opengl 1.1@clipflat@glBegin/End(GL_POLYGON)- glFrontFace(GL_CCW)- glPolygonMode(GL_FILL)- quadrant: center middle PV: FIRST,Fail @@ -3306,13 +3102,15 @@ spec@!opengl 1.1@polygon-mode-offset@config 6: Expected blue pixel in center,Fai spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on right edge,Fail spec@!opengl 1.1@polygon-mode-offset@config 6: Expected white pixel on top edge,Fail spec@!opengl 1.1@polygon-mode-offset,ExpectedFail +spec@!opengl 1.0@rasterpos,Fail +spec@!opengl 1.0@rasterpos@glsl_vs_gs_linked,Fail +spec@!opengl 1.0@rasterpos@glsl_vs_tes_linked,Fail spec@!opengl 1.1@read-front clear-front-first,Crash spec@!opengl 1.1@read-front clear-front-first samples=2,Crash spec@!opengl 1.1@read-front clear-front-first samples=4,Crash spec@!opengl 1.1@read-front,Crash spec@!opengl 1.1@read-front samples=2,Crash spec@!opengl 1.1@read-front samples=4,ExpectedFail -spec@!opengl 1.1@streaming-texture-leak,Crash spec@!opengl 1.1@teximage-colors gl_alpha16@Exact upload-download of GL_ALPHA16,Fail spec@!opengl 1.1@teximage-colors gl_r16_snorm@Exact upload-download of GL_R16_SNORM,Fail spec@!opengl 1.1@teximage-colors gl_r8_snorm@Exact upload-download of GL_R8_SNORM,Fail @@ -3413,7 +3211,6 @@ spec@!opengl 2.0@gl-2.0-edgeflag-immediate,Fail spec@!opengl 2.0@gl-2.0-large-point-fs,Fail spec@!opengl 2.0@gl-2.0-vertexattribpointer,Fail spec@!opengl 2.0@occlusion-query-discard,Fail -spec@!opengl 3.0@required-texture-attachment-formats,Fail spec@!opengl 3.0@sampler-cube-shadow,Fail spec@!opengl 3.2@gl-3.2-adj-prims cull-back pv-first,ExpectedFail spec@!opengl 3.2@gl-3.2-adj-prims cull-front pv-first,ExpectedFail diff --git a/.gitlab-ci/expectations/virt/virgl-gles-flakes.txt b/.gitlab-ci/expectations/virt/virgl-gles-flakes.txt index b791a97c..50087606 100644 --- a/.gitlab-ci/expectations/virt/virgl-gles-flakes.txt +++ b/.gitlab-ci/expectations/virt/virgl-gles-flakes.txt @@ -27,8 +27,12 @@ spec@arb_depth_texture@depthstencil-render-miplevels 146 d=z16 spec@arb_depth_texture@depthstencil-render-miplevels 585 d=z16 spec@arb_fragment_layer_viewport@layer-gs-writes-in-range spec@arb_fragment_layer_viewport@viewport-gs-writes-in-range +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Basic +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glScissor +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@glViewport spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@MS4 +spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-atomic@Per-sample spec@arb_framebuffer_no_attachments@arb_framebuffer_no_attachments-roundup-samples spec@arb_framebuffer_object@arb_framebuffer_object-depth-stencil-blit stencil gl_stencil_index1 spec@arb_framebuffer_srgb@blit renderbuffer linear_to_srgb upsample disabled clear @@ -42,6 +46,8 @@ spec@arb_gpu_shader5@texturegatheroffsets@vs-rgb-1-int-2d spec@arb_gpu_shader5@texturegatheroffset@vs-r-0-unorm-2darray spec@arb_gpu_shader5@texturegatheroffset@vs-rgb-2-uint-2drect-const spec@arb_shader_atomic_counter_ops@execution@add +spec@arb_shader_atomic_counters@fragment-discard +spec@arb_shader_atomic_counters@function-argument spec@arb_shader_image_load_store@atomicity spec@arb_shader_image_load_store@atomicity@imageAtomicAdd spec@arb_shader_image_load_store@atomicity@imageAtomicAnd @@ -51,16 +57,6 @@ spec@arb_shader_image_load_store@atomicity@imageAtomicMax spec@arb_shader_image_load_store@atomicity@imageAtomicMin spec@arb_shader_image_load_store@atomicity@imageAtomicOr spec@arb_shader_image_load_store@atomicity@imageAtomicXor -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 -spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 spec@arb_shader_precision@fs-op-assign-div-vec3-float spec@arb_shader_storage_buffer_object@execution@memory-layouts-struct-deref spec@arb_shader_storage_buffer_object@execution@ssbo-atomicadd-int @@ -72,6 +68,7 @@ spec@arb_texture_view@rendering-target spec@arb_texture_view@rendering-target@1D view rendering spec@arb_timer_query@query gl_timestamp spec@arb_timer_query@timestamp-get +spec@ext_timer_query@time-elapsed spec@arb_uniform_buffer_object@rendering-array spec@ext_framebuffer_blit@fbo-blit-check-limits spec@ext_framebuffer_blit@fbo-sys-blit diff --git a/.gitlab-ci/expectations/virt/virgl-gles-skips.txt b/.gitlab-ci/expectations/virt/virgl-gles-skips.txt index eb20f5fc..c3ed979f 100644 --- a/.gitlab-ci/expectations/virt/virgl-gles-skips.txt +++ b/.gitlab-ci/expectations/virt/virgl-gles-skips.txt @@ -13,8 +13,6 @@ spec@ext_texture_integer@fbo-integer # Fails on iris too spec@arb_direct_state_access@gettextureimage-formats -spec@arb_texture_buffer_object@formats (fs- arb)* -spec@arb_texture_buffer_object@formats (vs- arb)* spec@nv_primitive_restart@primitive-restart-draw-mode-polygon spec@nv_primitive_restart@primitive-restart-draw-mode-quad_strip spec@nv_primitive_restart@primitive-restart-draw-mode-quads @@ -41,3 +39,143 @@ spec@arb_enhanced_layouts@execution@component-layout@vs-attribs-array # GLES doesn't support more than one stream spec@arb_enhanced_layouts@gs-stream-location-aliasing + + +# All these tests use a RGBA32F RW image and this is not supported on GLES +# so skip the tests +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/WaR/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Buffer update/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Framebuffer/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/WaR/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Pixel/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture update/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Transform feedback/WaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/16x16 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/one bit barrier test/64x64 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Atomic counter/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Element array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Image/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Indirect/RaW/one bit barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Texture fetch/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Uniform buffer/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@host-mem-barrier@Vertex array/RaW/full barrier test/4x4 +spec@arb_shader_image_load_store@layer +spec@arb_shader_image_load_store@layer@image1DArray/layered binding test +spec@arb_shader_image_load_store@layer@image1DArray/non-layered binding test +spec@arb_shader_image_load_store@layer@image1D/layered binding test +spec@arb_shader_image_load_store@layer@image1D/non-layered binding test +spec@arb_shader_image_load_store@layer@image2DArray/layered binding test +spec@arb_shader_image_load_store@layer@image2DArray/non-layered binding test +spec@arb_shader_image_load_store@layer@image2D/layered binding test +spec@arb_shader_image_load_store@layer@image2D/non-layered binding test +spec@arb_shader_image_load_store@layer@image2DRect/layered binding test +spec@arb_shader_image_load_store@layer@image2DRect/non-layered binding test +spec@arb_shader_image_load_store@layer@image3D/layered binding test +spec@arb_shader_image_load_store@layer@image3D/non-layered binding test +spec@arb_shader_image_load_store@layer@imageBuffer/layered binding test +spec@arb_shader_image_load_store@layer@imageBuffer/non-layered binding test +spec@arb_shader_image_load_store@layer@imageCubeArray/layered binding test +spec@arb_shader_image_load_store@layer@imageCubeArray/non-layered binding test +spec@arb_shader_image_load_store@layer@imageCube/layered binding test +spec@arb_shader_image_load_store@layer@imageCube/non-layered binding test +spec@arb_shader_image_load_store@level@1DArray level binding test +spec@arb_shader_image_load_store@level@1D level binding test +spec@arb_shader_image_load_store@level@2DArray level binding test +spec@arb_shader_image_load_store@level@2D level binding test +spec@arb_shader_image_load_store@level@3D level binding test +spec@arb_shader_image_load_store@level@CubeArray level binding test +spec@arb_shader_image_load_store@level@Cube level binding test +spec@arb_shader_image_load_store@level diff --git a/.gitlab-ci/meson/build.sh b/.gitlab-ci/meson/build.sh index d508b596..6d333cd4 100755 --- a/.gitlab-ci/meson/build.sh +++ b/.gitlab-ci/meson/build.sh @@ -71,6 +71,9 @@ meson _build --native-file=native.file \ ${DRI_LOADERS} \ ${GALLIUM_ST} \ -D tests=true \ + -D render-server=true \ + -D render-server-worker=process \ + -D venus-experimental=true \ --fatal-meson-warnings \ ${EXTRA_OPTION} && \ pushd _build && \ @@ -1,10 +1,9 @@ -name: "virglrenderer" -description: - "Virgil is a research project to investigate the possibility of creating a " - "virtual 3D GPU for use inside qemu virtual machines, that allows the guest " - "operating system to use the capabilities of the host GPU to accelerate 3D " - "rendering." +# This project was upgraded with external_updater. +# Usage: tools/external_updater/updater.sh update virglrenderer +# For more info, check https://cs.android.com/android/platform/superproject/+/master:tools/external_updater/README.md +name: "virglrenderer" +description: "Virgil is a research project to investigate the possibility of creating a virtual 3D GPU for use inside qemu virtual machines, that allows the guest operating system to use the capabilities of the host GPU to accelerate 3D rendering." third_party { url { type: HOMEPAGE @@ -14,7 +13,11 @@ third_party { type: GIT value: "https://anongit.freedesktop.org/git/virglrenderer.git" } - version: "master" + version: "0.10.4" license_type: NOTICE - last_upgrade_date { year: 2018 month: 4 day: 10 } + last_upgrade_date { + year: 2023 + month: 1 + day: 18 + } } diff --git a/config.h.meson b/config.h.meson index e995c9dc..b25a86b2 100644 --- a/config.h.meson +++ b/config.h.meson @@ -44,6 +44,7 @@ #mesondefine RENDER_SERVER_EXEC_PATH #mesondefine HAVE_EVENTFD_H #mesondefine HAVE_DLFCN_H +#mesondefine ENABLE_VIDEO #mesondefine ENABLE_TRACING #mesondefine UTIL_ARCH_LITTLE_ENDIAN #mesondefine UTIL_ARCH_BIG_ENDIAN diff --git a/meson.build b/meson.build index bd5ac888..ddb74daa 100644 --- a/meson.build +++ b/meson.build @@ -23,7 +23,7 @@ project( 'virglrenderer', 'c', - version: '0.9.0', + version: '0.10.4', license : 'MIT', meson_version : '>= 0.53', default_options : ['buildtype=release', 'b_ndebug=if-release', @@ -37,10 +37,9 @@ project( # interface age # 3. If the ABI has changed in an incompatible way increment the binary_age # and set revision and interface_age to zero - binary_age = 1 -interface_age = 5 -revision = 3 +interface_age = 7 +revision = 7 cc = meson.get_compiler('c') @@ -52,6 +51,7 @@ warnings = [ '-Werror=implicit-function-declaration', '-Werror=missing-prototypes', '-Wmissing-prototypes', + '-Werror=incompatible-pointer-types', '-Werror=int-to-pointer-cast', '-Wno-overlength-strings', ] @@ -72,7 +72,7 @@ epoxy_dep = dependency('epoxy', version: '>= 1.5.4') m_dep = cc.find_library('m', required : false) conf_data = configuration_data() -conf_data.set('VERSION', '0.8.1') +conf_data.set('VERSION', meson.project_version()) conf_data.set('_GNU_SOURCE', 1) conf_data.set('VIRGL_RENDERER_UNSTABLE_APIS', 1) @@ -280,6 +280,13 @@ if with_render_server endif endif +with_video = get_option('video') +if with_video + conf_data.set('ENABLE_VIDEO', 1) + libva_dep = dependency('libva') + libvadrm_dep = dependency('libva-drm') +endif + configure_file(input : 'config.h.meson', output : 'config.h', configuration : conf_data) @@ -316,6 +323,7 @@ summary({'c_args': (' ').join(get_option('c_args')), 'drm-msm': with_drm_msm, 'render server': with_render_server, 'render server worker': with_render_server ? with_render_server_worker : 'none', + 'video': with_video, 'tests': with_tests, 'fuzzer': with_fuzzer, 'tracing': with_tracing, diff --git a/meson_options.txt b/meson_options.txt index 8ead6138..cb774064 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -85,6 +85,13 @@ option( ) option( + 'video', + type : 'boolean', + value : 'false', + description : 'enable support for hardware video acceleration' +) + +option( 'tests', type : 'boolean', value : 'false', diff --git a/server/render_virgl.c b/server/render_virgl.c index 6cc82ac7..fb6b5b7a 100644 --- a/server/render_virgl.c +++ b/server/render_virgl.c @@ -70,13 +70,12 @@ render_virgl_debug_callback(const char *fmt, va_list ap) static void render_virgl_cb_write_context_fence(UNUSED void *cookie, uint32_t ctx_id, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct render_context *ctx = render_virgl_lookup_context(ctx_id); assert(ctx); - const uint32_t ring_idx = queue_id; const uint32_t seqno = (uint32_t)fence_id; render_context_update_timeline(ctx, ring_idx, seqno); } diff --git a/src/drm/msm/msm_proto.h b/src/drm/msm/msm_proto.h index 0c8377cc..9279475a 100644 --- a/src/drm/msm/msm_proto.h +++ b/src/drm/msm/msm_proto.h @@ -226,14 +226,6 @@ DEFINE_CAST(msm_ccmd_req, msm_ccmd_gem_set_name_req) * kernel side (ugg).. need to come up with a better story for fencing. * We probably need to sort something out for that to handle syncobjs. * - * Note that the bo handles referenced are the host handles, so that - * they can be directly passed to the host kernel without translation. - * - * TODO we can pack the payload tighter (and enforce no-relocs) if we - * defined our own structs, at the cost of host userspace having to - * do a bit more work. Is it worth it? It could probably be done - * without extra overhead in guest userspace.. - * * No response. */ struct msm_ccmd_gem_submit_req { @@ -245,16 +237,17 @@ struct msm_ccmd_gem_submit_req { uint32_t nr_cmds; /** - * What userspace expects the next seqno fence to be. To avoid having - * to wait for host, the guest tracks what it expects to be the next - * returned seqno fence. This is passed to guest just for error - * checking. + * The fence "seqno" assigned by the guest userspace. The host SUBMIT + * ioctl uses the MSM_SUBMIT_FENCE_SN_IN flag to let the guest assign + * the sequence #, to avoid the guest needing to wait for a response + * from the host. */ uint32_t fence; /** * Payload is first an array of 'struct drm_msm_gem_submit_bo' of - * length determined by nr_bos (note that handles are host handles), + * length determined by nr_bos (note that handles are guest resource + * ids which are translated to host GEM handles by the host VMM), * followed by an array of 'struct drm_msm_gem_submit_cmd' of length * determined by nr_cmds */ @@ -276,7 +269,7 @@ struct msm_ccmd_gem_upload_req { uint32_t pad; uint32_t off; - /* Note: packet size aligned to 4 bytes, so the string name may + /* Note: packet size aligned to 4 bytes, so the payload may * be shorter than the packet header indicates. */ uint32_t len; diff --git a/src/drm/msm/msm_renderer.c b/src/drm/msm/msm_renderer.c index 84684f48..a032ad39 100644 --- a/src/drm/msm/msm_renderer.c +++ b/src/drm/msm/msm_renderer.c @@ -131,6 +131,7 @@ struct msm_object { bool exported : 1; bool exportable : 1; struct virgl_resource *res; + void *map; }; static struct msm_object * @@ -419,6 +420,9 @@ msm_renderer_detach_resource(struct virgl_context *vctx, struct virgl_resource * msm_remove_object(mctx, obj); + if (obj->map) + munmap(obj->map, obj->size); + gem_close(mctx->fd, obj->handle); free(obj); @@ -762,7 +766,15 @@ msm_ccmd_gem_set_iova(struct msm_context *mctx, const struct msm_ccmd_req *hdr) } uint64_t iova = req->iova; - ret = gem_info(mctx, obj->handle, MSM_INFO_SET_IOVA, &iova); + if (iova) { + TRACE_SCOPE_BEGIN("SET_IOVA"); + ret = gem_info(mctx, obj->handle, MSM_INFO_SET_IOVA, &iova); + TRACE_SCOPE_END("SET_IOVA"); + } else { + TRACE_SCOPE_BEGIN("CLEAR_IOVA"); + ret = gem_info(mctx, obj->handle, MSM_INFO_SET_IOVA, &iova); + TRACE_SCOPE_END("CLEAR_IOVA"); + } if (ret) { drm_log("SET_IOVA failed: %d (%s)", ret, strerror(errno)); goto out_error; @@ -916,18 +928,15 @@ out: } static int -msm_ccmd_gem_upload(struct msm_context *mctx, const struct msm_ccmd_req *hdr) +map_object(struct msm_context *mctx, struct msm_object *obj) { - const struct msm_ccmd_gem_upload_req *req = to_msm_ccmd_gem_upload_req(hdr); uint64_t offset; int ret; - if (req->pad || !valid_payload_len(req)) { - drm_log("Invalid upload ccmd"); - return -EINVAL; - } + if (obj->map) + return 0; - uint32_t handle = handle_from_res_id(mctx, req->res_id); + uint32_t handle = handle_from_res_id(mctx, obj->res_id); ret = gem_info(mctx, handle, MSM_INFO_GET_OFFSET, &offset); if (ret) { drm_log("alloc failed: %s", strerror(errno)); @@ -935,15 +944,39 @@ msm_ccmd_gem_upload(struct msm_context *mctx, const struct msm_ccmd_req *hdr) } uint8_t *map = - mmap(0, req->len + req->off, PROT_READ | PROT_WRITE, MAP_SHARED, mctx->fd, offset); + mmap(0, obj->size, PROT_READ | PROT_WRITE, MAP_SHARED, mctx->fd, offset); if (map == MAP_FAILED) { drm_log("mmap failed: %s", strerror(errno)); return -ENOMEM; } - memcpy(&map[req->off], req->payload, req->len); + obj->map = map; + + return 0; +} + +static int +msm_ccmd_gem_upload(struct msm_context *mctx, const struct msm_ccmd_req *hdr) +{ + const struct msm_ccmd_gem_upload_req *req = to_msm_ccmd_gem_upload_req(hdr); + int ret; + + if (req->pad || !valid_payload_len(req)) { + drm_log("Invalid upload ccmd"); + return -EINVAL; + } + + struct msm_object *obj = msm_get_object_from_res_id(mctx, req->res_id); + if (!obj) { + drm_log("No obj: res_id=%u", req->res_id); + return -ENOENT; + } + + ret = map_object(mctx, obj); + if (ret) + return ret; - munmap(map, req->len); + memcpy(&obj->map[req->off], req->payload, req->len); return 0; } @@ -1078,6 +1111,8 @@ submit_cmd_dispatch(struct msm_context *mctx, const struct msm_ccmd_req *hdr) drm_dbg("%s: hdr={cmd=%u, len=%u, seqno=%u, rsp_off=0x%x)", ccmd->name, hdr->cmd, hdr->len, hdr->seqno, hdr->rsp_off); + TRACE_SCOPE_BEGIN(ccmd->name); + /* If the request length from the guest is smaller than the expected * size, ie. newer host and older guest, we need to make a copy of * the request with the new fields at the end zero initialized. @@ -1093,6 +1128,8 @@ submit_cmd_dispatch(struct msm_context *mctx, const struct msm_ccmd_req *hdr) ret = ccmd->handler(mctx, hdr); } + TRACE_SCOPE_END(ccmd->name); + if (ret) { drm_log("%s: dispatch failed: %d (%s)", ccmd->name, ret, strerror(errno)); return ret; @@ -1180,17 +1217,17 @@ msm_renderer_retire_fences(UNUSED struct virgl_context *vctx) } static int -msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint64_t queue_id, +msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint32_t ring_idx, uint64_t fence_id) { struct msm_context *mctx = to_msm_context(vctx); - drm_dbg("flags=0x%x, queue_id=%" PRIu64 ", fence_id=%" PRIu64, flags, - queue_id, fence_id); + drm_dbg("flags=0x%x, ring_idx=%" PRIu32 ", fence_id=%" PRIu64, flags, + ring_idx, fence_id); - /* timeline is queue_id-1 (because queue_id 0 is host CPU timeline) */ - if (queue_id > nr_timelines) { - drm_log("invalid queue_id: %" PRIu64, queue_id); + /* timeline is ring_idx-1 (because ring_idx 0 is host CPU timeline) */ + if (ring_idx > nr_timelines) { + drm_log("invalid ring_idx: %" PRIu32, ring_idx); return -EINVAL; } @@ -1198,12 +1235,12 @@ msm_renderer_submit_fence(struct virgl_context *vctx, uint32_t flags, uint64_t q * meaning by the time ->submit_fence() is called, the fence has * already passed.. so just immediate signal: */ - if (queue_id == 0) { - vctx->fence_retire(vctx, queue_id, fence_id); + if (ring_idx == 0) { + vctx->fence_retire(vctx, ring_idx, fence_id); return 0; } - return drm_timeline_submit_fence(&mctx->timelines[queue_id - 1], flags, fence_id); + return drm_timeline_submit_fence(&mctx->timelines[ring_idx - 1], flags, fence_id); } struct virgl_context * diff --git a/src/gallium/auxiliary/tgsi/tgsi_build.c b/src/gallium/auxiliary/tgsi/tgsi_build.c index b06806d5..e3b41575 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_build.c +++ b/src/gallium/auxiliary/tgsi/tgsi_build.c @@ -379,6 +379,8 @@ tgsi_default_full_declaration( void ) { struct tgsi_full_declaration full_declaration; + full_declaration.Dim.Index2D = 0; + full_declaration.Dim.Padding = 0; full_declaration.Declaration = tgsi_default_declaration(); full_declaration.Range = tgsi_default_declaration_range(); full_declaration.Semantic = tgsi_default_declaration_semantic(); diff --git a/src/gallium/auxiliary/tgsi/tgsi_info.c b/src/gallium/auxiliary/tgsi/tgsi_info.c index d4529b1e..87b5c347 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_info.c +++ b/src/gallium/auxiliary/tgsi/tgsi_info.c @@ -385,6 +385,7 @@ tgsi_opcode_infer_type( uint opcode ) case TGSI_OPCODE_BREV: case TGSI_OPCODE_D2U: case TGSI_OPCODE_CLOCK: + case TGSI_OPCODE_UADD: return TGSI_TYPE_UNSIGNED; case TGSI_OPCODE_ARL: case TGSI_OPCODE_ARR: @@ -401,7 +402,6 @@ tgsi_opcode_infer_type( uint opcode ) case TGSI_OPCODE_ISGE: case TGSI_OPCODE_ISHR: case TGSI_OPCODE_ISLT: - case TGSI_OPCODE_UADD: case TGSI_OPCODE_UARL: case TGSI_OPCODE_IABS: case TGSI_OPCODE_ISSG: diff --git a/src/gallium/auxiliary/tgsi/tgsi_text.c b/src/gallium/auxiliary/tgsi/tgsi_text.c index f7bf0323..84443fd7 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_text.c +++ b/src/gallium/auxiliary/tgsi/tgsi_text.c @@ -580,7 +580,7 @@ parse_register_bracket( struct parsed_bracket *brackets) { const char *cur; - uint uindex; + int index; memset(brackets, 0, sizeof(struct parsed_bracket)); @@ -624,11 +624,11 @@ parse_register_bracket( brackets->index = 0; } else { - if (!parse_uint( &ctx->cur, &uindex )) { - report_error( ctx, "Expected literal unsigned integer" ); + if (!parse_int( &ctx->cur, &index )) { + report_error( ctx, "Expected literal integer" ); return FALSE; } - brackets->index = (int) uindex; + brackets->index = index; brackets->ind_file = TGSI_FILE_NULL; brackets->ind_index = 0; } diff --git a/src/gallium/auxiliary/util/u_format.csv b/src/gallium/auxiliary/util/u_format.csv index 1d743a69..f6e528a2 100644 --- a/src/gallium/auxiliary/util/u_format.csv +++ b/src/gallium/auxiliary/util/u_format.csv @@ -114,6 +114,7 @@ PIPE_FORMAT_I32_FLOAT , plain, 1, 1, f32 , , , , xxxx, r PIPE_FORMAT_L8_SRGB , plain, 1, 1, un8 , , , , xxx1, srgb PIPE_FORMAT_R8_SRGB , plain, 1, 1, un8 , , , , x001, srgb PIPE_FORMAT_L8A8_SRGB , plain, 1, 1, un8 , un8 , , , xxxy, srgb +PIPE_FORMAT_R8G8_SRGB , plain, 1, 1, un8 , un8 , , , xy01, srgb PIPE_FORMAT_R8G8B8_SRGB , plain, 1, 1, un8 , un8 , un8 , , xyz1, srgb PIPE_FORMAT_R8G8B8A8_SRGB , plain, 1, 1, un8 , un8 , un8 , un8 , xyzw, srgb PIPE_FORMAT_A8B8G8R8_SRGB , plain, 1, 1, un8 , un8 , un8 , un8 , wzyx, srgb diff --git a/src/gallium/auxiliary/util/u_hash_table.c b/src/gallium/auxiliary/util/u_hash_table.c index 095112a1..2b7a67df 100644 --- a/src/gallium/auxiliary/util/u_hash_table.c +++ b/src/gallium/auxiliary/util/u_hash_table.c @@ -46,136 +46,66 @@ #include "util/u_memory.h" #include "util/u_pointer.h" #include "util/u_hash_table.h" +#include "util/hash_table.h" +#include "ralloc.h" struct util_hash_table { - struct cso_hash *cso; - - /** Hash function */ - unsigned (*hash)(void *key); - - /** Compare two keys */ - int (*compare)(void *key1, void *key2); + struct hash_table table; /** free value */ void (*destroy)(void *value); }; - -struct util_hash_table_item -{ - void *key; - void *value; -}; - - -static inline struct util_hash_table_item * -util_hash_table_item(struct cso_hash_iter iter) -{ - return (struct util_hash_table_item *)cso_hash_iter_data(iter); -} - - struct util_hash_table * -util_hash_table_create(unsigned (*hash)(void *key), - int (*compare)(void *key1, void *key2), +util_hash_table_create(uint32_t (*hash)(const void *key), + bool (*equal)(const void *key1, const void *key2), void (*destroy)(void *value)) { struct util_hash_table *ht; - ht = MALLOC_STRUCT(util_hash_table); + ht = ralloc(NULL, struct util_hash_table); if(!ht) return NULL; - ht->cso = cso_hash_create(); - if(!ht->cso) { - FREE(ht); + if (!_mesa_hash_table_init(&ht->table, ht, hash, equal)) { + ralloc_free(ht); return NULL; } - ht->hash = hash; - ht->compare = compare; ht->destroy = destroy; return ht; } - -static inline struct cso_hash_iter -util_hash_table_find_iter(struct util_hash_table *ht, - void *key, - unsigned key_hash) -{ - struct cso_hash_iter iter; - struct util_hash_table_item *item; - - iter = cso_hash_find(ht->cso, key_hash); - while (!cso_hash_iter_is_null(iter)) { - item = (struct util_hash_table_item *)cso_hash_iter_data(iter); - if (!ht->compare(item->key, key)) - break; - iter = cso_hash_iter_next(iter); - } - - return iter; -} - - -static inline struct util_hash_table_item * -util_hash_table_find_item(struct util_hash_table *ht, - void *key, - unsigned key_hash) -{ - struct cso_hash_iter iter; - struct util_hash_table_item *item; - - iter = cso_hash_find(ht->cso, key_hash); - while (!cso_hash_iter_is_null(iter)) { - item = (struct util_hash_table_item *)cso_hash_iter_data(iter); - if (!ht->compare(item->key, key)) - return item; - iter = cso_hash_iter_next(iter); - } - - return NULL; -} - - enum pipe_error util_hash_table_set(struct util_hash_table *ht, void *key, void *value) { - unsigned key_hash; - struct util_hash_table_item *item; - struct cso_hash_iter iter; + uint32_t key_hash; + struct hash_entry *item; assert(ht); if (!ht) return PIPE_ERROR_BAD_INPUT; - key_hash = ht->hash(key); + if (!key) + return PIPE_ERROR_BAD_INPUT; + + key_hash = ht->table.key_hash_function(key); - item = util_hash_table_find_item(ht, key, key_hash); + item = _mesa_hash_table_search_pre_hashed(&ht->table, key_hash, key); if(item) { - ht->destroy(item->value); - item->value = value; + ht->destroy(item->data); + item->data = value; return PIPE_OK; } - - item = MALLOC_STRUCT(util_hash_table_item); + + item = _mesa_hash_table_insert_pre_hashed(&ht->table, key_hash, key, value); if(!item) return PIPE_ERROR_OUT_OF_MEMORY; - - item->key = key; - item->value = value; - - iter = cso_hash_insert(ht->cso, key_hash, item); - if(cso_hash_iter_is_null(iter)) { - FREE(item); - return PIPE_ERROR_OUT_OF_MEMORY; - } return PIPE_OK; } @@ -185,20 +115,20 @@ void * util_hash_table_get(struct util_hash_table *ht, void *key) { - unsigned key_hash; - struct util_hash_table_item *item; + struct hash_entry *item; assert(ht); if (!ht) return NULL; - key_hash = ht->hash(key); + if (!key) + return NULL; - item = util_hash_table_find_item(ht, key, key_hash); + item = _mesa_hash_table_search(&ht->table, key); if(!item) return NULL; - - return item->value; + + return item->data; } @@ -206,46 +136,36 @@ void util_hash_table_remove(struct util_hash_table *ht, void *key) { - unsigned key_hash; - struct cso_hash_iter iter; - struct util_hash_table_item *item; + struct hash_entry *item; assert(ht); if (!ht) return; - key_hash = ht->hash(key); + if (!key) + return; - iter = util_hash_table_find_iter(ht, key, key_hash); - if(cso_hash_iter_is_null(iter)) + item = _mesa_hash_table_search(&ht->table, key); + if (!item) return; - - item = util_hash_table_item(iter); - assert(item); - ht->destroy(item->value); - FREE(item); - - cso_hash_erase(ht->cso, iter); + + ht->destroy(item->data); + _mesa_hash_table_remove(&ht->table, item); } void util_hash_table_clear(struct util_hash_table *ht) { - struct cso_hash_iter iter; - struct util_hash_table_item *item; - assert(ht); if (!ht) return; - iter = cso_hash_first_node(ht->cso); - while (!cso_hash_iter_is_null(iter)) { - item = (struct util_hash_table_item *)cso_hash_take(ht->cso, cso_hash_iter_key(iter)); - ht->destroy(item->value); - FREE(item); - iter = cso_hash_first_node(ht->cso); + hash_table_foreach(&ht->table, item) { + ht->destroy(item->data); } + + _mesa_hash_table_clear(&ht->table, NULL); } @@ -255,21 +175,14 @@ util_hash_table_foreach(struct util_hash_table *ht, (void *key, void *value, void *data), void *data) { - struct cso_hash_iter iter; - struct util_hash_table_item *item; - enum pipe_error result; - assert(ht); if (!ht) return PIPE_ERROR_BAD_INPUT; - iter = cso_hash_first_node(ht->cso); - while (!cso_hash_iter_is_null(iter)) { - item = (struct util_hash_table_item *)cso_hash_iter_data(iter); - result = callback(item->key, item->value, data); - if(result != PIPE_OK) - return result; - iter = cso_hash_iter_next(iter); + hash_table_foreach(&ht->table, item) { + enum pipe_error result = callback((void *)item->key, item->data, data); + if (result != PIPE_OK) + return result; } return PIPE_OK; @@ -279,22 +192,13 @@ util_hash_table_foreach(struct util_hash_table *ht, void util_hash_table_destroy(struct util_hash_table *ht) { - struct cso_hash_iter iter; - struct util_hash_table_item *item; - assert(ht); if (!ht) return; - iter = cso_hash_first_node(ht->cso); - while (!cso_hash_iter_is_null(iter)) { - item = (struct util_hash_table_item *)cso_hash_iter_data(iter); - ht->destroy(item->value); - FREE(item); - iter = cso_hash_iter_next(iter); + hash_table_foreach(&ht->table, item) { + ht->destroy(item->data); } - cso_hash_delete(ht->cso); - - FREE(ht); + ralloc_free(ht); } diff --git a/src/gallium/auxiliary/util/u_hash_table.h b/src/gallium/auxiliary/util/u_hash_table.h index b4a887bb..08481570 100644 --- a/src/gallium/auxiliary/util/u_hash_table.h +++ b/src/gallium/auxiliary/util/u_hash_table.h @@ -56,8 +56,8 @@ struct util_hash_table; * @param compare should return 0 for two equal keys. */ struct util_hash_table * -util_hash_table_create(unsigned (*hash)(void *key), - int (*compare)(void *key1, void *key2), +util_hash_table_create(uint32_t (*hash)(const void *key), + bool (*equal)(const void *key1, const void *key2), void (*destroy)(void *value)); diff --git a/src/gallium/include/pipe/p_format.h b/src/gallium/include/pipe/p_format.h index 3e2d9aba..ff35c1e3 100644 --- a/src/gallium/include/pipe/p_format.h +++ b/src/gallium/include/pipe/p_format.h @@ -134,6 +134,7 @@ extern "C" { /* sRGB formats */ #define PIPE_FORMAT_L8_SRGB VIRGL_FORMAT_L8_SRGB #define PIPE_FORMAT_L8A8_SRGB VIRGL_FORMAT_L8A8_SRGB +#define PIPE_FORMAT_R8G8_SRGB VIRGL_FORMAT_R8G8_SRGB #define PIPE_FORMAT_R8G8B8_SRGB VIRGL_FORMAT_R8G8B8_SRGB #define PIPE_FORMAT_A8B8G8R8_SRGB VIRGL_FORMAT_A8B8G8R8_SRGB #define PIPE_FORMAT_X8B8G8R8_SRGB VIRGL_FORMAT_X8B8G8R8_SRGB diff --git a/src/gallium/include/pipe/p_video_enums.h b/src/gallium/include/pipe/p_video_enums.h new file mode 100644 index 00000000..f7853528 --- /dev/null +++ b/src/gallium/include/pipe/p_video_enums.h @@ -0,0 +1,148 @@ +/************************************************************************** + * + * Copyright 2009 Younes Manton. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef PIPE_VIDEO_ENUMS_H +#define PIPE_VIDEO_ENUMS_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum pipe_video_format +{ + PIPE_VIDEO_FORMAT_UNKNOWN = 0, + PIPE_VIDEO_FORMAT_MPEG12, /**< MPEG1, MPEG2 */ + PIPE_VIDEO_FORMAT_MPEG4, /**< DIVX, XVID */ + PIPE_VIDEO_FORMAT_VC1, /**< WMV */ + PIPE_VIDEO_FORMAT_MPEG4_AVC,/**< H.264 */ + PIPE_VIDEO_FORMAT_HEVC, /**< H.265 */ + PIPE_VIDEO_FORMAT_JPEG, /**< JPEG */ + PIPE_VIDEO_FORMAT_VP9, /**< VP9 */ + PIPE_VIDEO_FORMAT_AV1 /**< AV1 */ +}; + +enum pipe_video_profile +{ + PIPE_VIDEO_PROFILE_UNKNOWN, + PIPE_VIDEO_PROFILE_MPEG1, + PIPE_VIDEO_PROFILE_MPEG2_SIMPLE, + PIPE_VIDEO_PROFILE_MPEG2_MAIN, + PIPE_VIDEO_PROFILE_MPEG4_SIMPLE, + PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE, + PIPE_VIDEO_PROFILE_VC1_SIMPLE, + PIPE_VIDEO_PROFILE_VC1_MAIN, + PIPE_VIDEO_PROFILE_VC1_ADVANCED, + PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE, + PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE, + PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN, + PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED, + PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH, + PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10, + PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422, + PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444, + PIPE_VIDEO_PROFILE_HEVC_MAIN, + PIPE_VIDEO_PROFILE_HEVC_MAIN_10, + PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL, + PIPE_VIDEO_PROFILE_HEVC_MAIN_12, + PIPE_VIDEO_PROFILE_HEVC_MAIN_444, + PIPE_VIDEO_PROFILE_JPEG_BASELINE, + PIPE_VIDEO_PROFILE_VP9_PROFILE0, + PIPE_VIDEO_PROFILE_VP9_PROFILE2, + PIPE_VIDEO_PROFILE_AV1_MAIN, + PIPE_VIDEO_PROFILE_MAX +}; + +/* Video caps, can be different for each codec/profile */ +enum pipe_video_cap +{ + PIPE_VIDEO_CAP_SUPPORTED = 0, + PIPE_VIDEO_CAP_NPOT_TEXTURES = 1, + PIPE_VIDEO_CAP_MAX_WIDTH = 2, + PIPE_VIDEO_CAP_MAX_HEIGHT = 3, + PIPE_VIDEO_CAP_PREFERED_FORMAT = 4, + PIPE_VIDEO_CAP_PREFERS_INTERLACED = 5, + PIPE_VIDEO_CAP_SUPPORTS_PROGRESSIVE = 6, + PIPE_VIDEO_CAP_SUPPORTS_INTERLACED = 7, + PIPE_VIDEO_CAP_MAX_LEVEL = 8, + PIPE_VIDEO_CAP_STACKED_FRAMES = 9, + PIPE_VIDEO_CAP_MAX_MACROBLOCKS = 10, + PIPE_VIDEO_CAP_MAX_TEMPORAL_LAYERS = 11, + PIPE_VIDEO_CAP_EFC_SUPPORTED = 12, + PIPE_VIDEO_CAP_ENC_MAX_SLICES_PER_FRAME = 13, + PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE = 14, + PIPE_VIDEO_CAP_ENC_MAX_REFERENCES_PER_FRAME = 15, +}; + +/* To be used with cap PIPE_VIDEO_CAP_ENC_SLICES_STRUCTURE*/ +/** + * pipe_video_cap_slice_structure + * + * This attribute determines slice structures supported by the + * driver for encoding. This attribute is a hint to the user so + * that he can choose a suitable surface size and how to arrange + * the encoding process of multiple slices per frame. + * + * More specifically, for H.264 encoding, this attribute + * determines the range of accepted values to + * h264_slice_descriptor::macroblock_address and + * h264_slice_descriptor::num_macroblocks. + */ +enum pipe_video_cap_slice_structure +{ + /* Driver does not supports multiple slice per frame.*/ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_NONE = 0x00000000, + /* Driver supports a power-of-two number of rows per slice.*/ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_POWER_OF_TWO_ROWS = 0x00000001, + /* Driver supports an arbitrary number of macroblocks per slice.*/ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS = 0x00000002, + /* Driver support 1 row per slice*/ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_EQUAL_ROWS = 0x00000004, + /* Driver support max encoded slice size per slice */ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_MAX_SLICE_SIZE = 0x00000008, + /* Driver supports an arbitrary number of rows per slice. */ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_ARBITRARY_ROWS = 0x00000010, + /* Driver supports any number of rows per slice but they must be the same + * for all slices except for the last one, which must be equal or smaller + * to the previous slices. */ + PIPE_VIDEO_CAP_SLICE_STRUCTURE_EQUAL_MULTI_ROWS = 0x00000020, +}; + + +enum pipe_video_entrypoint +{ + PIPE_VIDEO_ENTRYPOINT_UNKNOWN, + PIPE_VIDEO_ENTRYPOINT_BITSTREAM, + PIPE_VIDEO_ENTRYPOINT_IDCT, + PIPE_VIDEO_ENTRYPOINT_MC, + PIPE_VIDEO_ENTRYPOINT_ENCODE +}; + +#if defined(__cplusplus) +} +#endif + +#endif /* PIPE_VIDEO_ENUMS_H */ diff --git a/src/gallium/include/pipe/p_video_state.h b/src/gallium/include/pipe/p_video_state.h new file mode 100644 index 00000000..8540f020 --- /dev/null +++ b/src/gallium/include/pipe/p_video_state.h @@ -0,0 +1,67 @@ +/************************************************************************** + * + * Copyright 2022 Younes Manton. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sub license, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice (including the + * next paragraph) shall be included in all copies or substantial portions + * of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +#ifndef PIPE_VIDEO_STATE_H +#define PIPE_VIDEO_STATE_H + +#ifdef __cplusplus +extern "C" { +#endif + +enum pipe_h264_slice_type +{ + PIPE_H264_SLICE_TYPE_P = 0x0, + PIPE_H264_SLICE_TYPE_B = 0x1, + PIPE_H264_SLICE_TYPE_I = 0x2, + PIPE_H264_SLICE_TYPE_SP = 0x3, + PIPE_H264_SLICE_TYPE_SI = 0x4 +}; + +/* Same enum for h264/h265 */ +enum pipe_h2645_enc_picture_type +{ + PIPE_H2645_ENC_PICTURE_TYPE_P = 0x00, + PIPE_H2645_ENC_PICTURE_TYPE_B = 0x01, + PIPE_H2645_ENC_PICTURE_TYPE_I = 0x02, + PIPE_H2645_ENC_PICTURE_TYPE_IDR = 0x03, + PIPE_H2645_ENC_PICTURE_TYPE_SKIP = 0x04 +}; + +enum pipe_h2645_enc_rate_control_method +{ + PIPE_H2645_ENC_RATE_CONTROL_METHOD_DISABLE = 0x00, + PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT_SKIP = 0x01, + PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE_SKIP = 0x02, + PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT = 0x03, + PIPE_H2645_ENC_RATE_CONTROL_METHOD_VARIABLE = 0x04 +}; + +#ifdef __cplusplus +} +#endif + +#endif /* PIPE_VIDEO_STATE_H */ diff --git a/src/mesa/util/u_cpu_detect.c b/src/mesa/util/u_cpu_detect.c index 955d087b..d6e51a11 100644 --- a/src/mesa/util/u_cpu_detect.c +++ b/src/mesa/util/u_cpu_detect.c @@ -681,7 +681,6 @@ util_cpu_detect_once(void) #if defined(PIPE_ARCH_X86) || defined(PIPE_ARCH_X86_64) if (has_cpuid()) { uint32_t regs[4]; - uint32_t regs2[4]; util_cpu_caps.cacheline = 32; @@ -690,6 +689,7 @@ util_cpu_detect_once(void) if (regs[0] >= 0x00000001) { unsigned int cacheline; + uint32_t regs2[4]; cpuid (0x00000001, regs2); @@ -739,6 +739,24 @@ util_cpu_detect_once(void) cacheline = ((regs2[1] >> 8) & 0xFF) * 8; if (cacheline > 0) util_cpu_caps.cacheline = cacheline; + + // check for avx512 + if (((regs2[2] >> 27) & 1) && // OSXSAVE + (xgetbv() & (0x7 << 5)) && // OPMASK: upper-256 enabled by OS + ((xgetbv() & 6) == 6)) { // XMM/YMM enabled by OS + uint32_t regs3[4]; + cpuid_count(0x00000007, 0x00000000, regs3); + util_cpu_caps.has_avx512f = (regs3[1] >> 16) & 1; + util_cpu_caps.has_avx512dq = (regs3[1] >> 17) & 1; + util_cpu_caps.has_avx512ifma = (regs3[1] >> 21) & 1; + util_cpu_caps.has_avx512pf = (regs3[1] >> 26) & 1; + util_cpu_caps.has_avx512er = (regs3[1] >> 27) & 1; + util_cpu_caps.has_avx512cd = (regs3[1] >> 28) & 1; + util_cpu_caps.has_avx512bw = (regs3[1] >> 30) & 1; + util_cpu_caps.has_avx512vl = (regs3[1] >> 31) & 1; + util_cpu_caps.has_avx512vbmi = (regs3[2] >> 1) & 1; + } + } if (util_cpu_caps.has_avx && regs[0] >= 0x00000007) { uint32_t regs7[4]; @@ -746,22 +764,6 @@ util_cpu_detect_once(void) util_cpu_caps.has_avx2 = (regs7[1] >> 5) & 1; } - // check for avx512 - if (((regs2[2] >> 27) & 1) && // OSXSAVE - (xgetbv() & (0x7 << 5)) && // OPMASK: upper-256 enabled by OS - ((xgetbv() & 6) == 6)) { // XMM/YMM enabled by OS - uint32_t regs3[4]; - cpuid_count(0x00000007, 0x00000000, regs3); - util_cpu_caps.has_avx512f = (regs3[1] >> 16) & 1; - util_cpu_caps.has_avx512dq = (regs3[1] >> 17) & 1; - util_cpu_caps.has_avx512ifma = (regs3[1] >> 21) & 1; - util_cpu_caps.has_avx512pf = (regs3[1] >> 26) & 1; - util_cpu_caps.has_avx512er = (regs3[1] >> 27) & 1; - util_cpu_caps.has_avx512cd = (regs3[1] >> 28) & 1; - util_cpu_caps.has_avx512bw = (regs3[1] >> 30) & 1; - util_cpu_caps.has_avx512vl = (regs3[1] >> 31) & 1; - util_cpu_caps.has_avx512vbmi = (regs3[2] >> 1) & 1; - } if (regs[1] == 0x756e6547 && regs[2] == 0x6c65746e && regs[3] == 0x49656e69) { /* GenuineIntel */ @@ -771,7 +773,7 @@ util_cpu_detect_once(void) cpuid(0x80000000, regs); if (regs[0] >= 0x80000001) { - + uint32_t regs2[4]; cpuid(0x80000001, regs2); util_cpu_caps.has_mmx |= (regs2[3] >> 23) & 1; @@ -784,6 +786,7 @@ util_cpu_detect_once(void) } if (regs[0] >= 0x80000006) { + uint32_t regs2[4]; /* should we really do this if the clflush size above worked? */ unsigned int cacheline; cpuid(0x80000006, regs2); diff --git a/src/meson.build b/src/meson.build index 2f94432f..d78ac8c9 100644 --- a/src/meson.build +++ b/src/meson.build @@ -160,6 +160,14 @@ proxy_sources = [ 'proxy/proxy_socket.c', ] +video_sources = [ + 'virgl_video_hw.h', + 'virgl_video.c', + 'virgl_video.h', + 'vrend_video.c', + 'vrend_video.h', +] + virgl_depends = [ gallium_dep, epoxy_dep, @@ -206,6 +214,11 @@ if with_render_server virgl_sources += proxy_sources endif +if with_video + virgl_sources += video_sources + virgl_depends += [libva_dep, libvadrm_dep] +endif + libvirgl = static_library( 'virgl', virgl_sources, diff --git a/src/proxy/proxy_context.c b/src/proxy/proxy_context.c index f2a035b3..f254afe2 100644 --- a/src/proxy/proxy_context.c +++ b/src/proxy/proxy_context.c @@ -152,7 +152,7 @@ proxy_context_retire_fences_internal(struct proxy_context *ctx) const uint32_t ring_idx = u_bit_scan64(&old_busy_mask); const uint32_t cur_seqno = proxy_context_load_timeline_seqno(ctx, ring_idx); if (!proxy_context_retire_timeline_fences_locked(ctx, ring_idx, cur_seqno)) - new_busy_mask |= 1 << ring_idx; + new_busy_mask |= 1ull << ring_idx; } ctx->timeline_busy_mask = new_busy_mask; @@ -196,14 +196,12 @@ proxy_context_sync_thread(void *arg) static int proxy_context_submit_fence(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct proxy_context *ctx = (struct proxy_context *)base; const uint64_t old_busy_mask = ctx->timeline_busy_mask; - /* TODO fix virglrenderer to match virtio-gpu spec which uses ring_idx */ - const uint32_t ring_idx = queue_id; if (ring_idx >= PROXY_CONTEXT_TIMELINE_COUNT) return -EINVAL; @@ -220,7 +218,7 @@ proxy_context_submit_fence(struct virgl_context *base, mtx_lock(&ctx->timeline_mutex); list_addtail(&fence->head, &timeline->fences); - ctx->timeline_busy_mask |= 1 << ring_idx; + ctx->timeline_busy_mask |= 1ull << ring_idx; if (proxy_renderer.flags & VIRGL_RENDERER_ASYNC_FENCE_CB) mtx_unlock(&ctx->timeline_mutex); @@ -319,7 +317,7 @@ validate_resource_fd_shm(int fd, uint64_t expected_size) return false; } - const uint64_t size = lseek64(fd, 0, SEEK_END); + const uint64_t size = lseek(fd, 0, SEEK_END); if (size != expected_size) { proxy_log("failed to validate shm size(%" PRIu64 ") expected(%" PRIu64 ")", size, expected_size); diff --git a/src/venus/venus-protocol/vn_protocol_renderer.h b/src/venus/venus-protocol/vn_protocol_renderer.h index f9ecff0e..52ef7d5e 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer.h +++ b/src/venus/venus-protocol/vn_protocol_renderer.h @@ -1,4 +1,4 @@ -/* This file is generated by venus-protocol git-6c35d9f3. */ +/* This file is generated by venus-protocol git-c692a30d. */ /* * Copyright 2020 Google LLC diff --git a/src/venus/venus-protocol/vn_protocol_renderer_command_buffer.h b/src/venus/venus-protocol/vn_protocol_renderer_command_buffer.h index 249469a7..e78502d2 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_command_buffer.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_command_buffer.h @@ -14,6 +14,12 @@ #pragma GCC diagnostic ignored "-Wpointer-arith" #pragma GCC diagnostic ignored "-Wunused-parameter" +/* + * These structs/unions/commands are not included + * + * vkCmdPushDescriptorSetWithTemplateKHR + */ + /* struct VkCommandBufferAllocateInfo chain */ static inline void * @@ -456,6 +462,40 @@ vn_replace_VkCommandBufferBeginInfo_handle(VkCommandBufferBeginInfo *val) } while (pnext); } +/* struct VkMultiDrawInfoEXT */ + +static inline void +vn_decode_VkMultiDrawInfoEXT_temp(struct vn_cs_decoder *dec, VkMultiDrawInfoEXT *val) +{ + vn_decode_uint32_t(dec, &val->firstVertex); + vn_decode_uint32_t(dec, &val->vertexCount); +} + +static inline void +vn_replace_VkMultiDrawInfoEXT_handle(VkMultiDrawInfoEXT *val) +{ + /* skip val->firstVertex */ + /* skip val->vertexCount */ +} + +/* struct VkMultiDrawIndexedInfoEXT */ + +static inline void +vn_decode_VkMultiDrawIndexedInfoEXT_temp(struct vn_cs_decoder *dec, VkMultiDrawIndexedInfoEXT *val) +{ + vn_decode_uint32_t(dec, &val->firstIndex); + vn_decode_uint32_t(dec, &val->indexCount); + vn_decode_int32_t(dec, &val->vertexOffset); +} + +static inline void +vn_replace_VkMultiDrawIndexedInfoEXT_handle(VkMultiDrawIndexedInfoEXT *val) +{ + /* skip val->firstIndex */ + /* skip val->indexCount */ + /* skip val->vertexOffset */ +} + /* struct VkBufferCopy */ static inline void @@ -3138,6 +3178,103 @@ static inline void vn_encode_vkCmdDrawIndexed_reply(struct vn_cs_encoder *enc, c /* skip args->firstInstance */ } +static inline void vn_decode_vkCmdDrawMultiEXT_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCmdDrawMultiEXT *args) +{ + vn_decode_VkCommandBuffer_lookup(dec, &args->commandBuffer); + vn_decode_uint32_t(dec, &args->drawCount); + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, args->drawCount); + args->pVertexInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pVertexInfo) * iter_count); + if (!args->pVertexInfo) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkMultiDrawInfoEXT_temp(dec, &((VkMultiDrawInfoEXT *)args->pVertexInfo)[i]); + } else { + vn_decode_array_size_unchecked(dec); + args->pVertexInfo = NULL; + } + vn_decode_uint32_t(dec, &args->instanceCount); + vn_decode_uint32_t(dec, &args->firstInstance); + vn_decode_uint32_t(dec, &args->stride); +} + +static inline void vn_replace_vkCmdDrawMultiEXT_args_handle(struct vn_command_vkCmdDrawMultiEXT *args) +{ + vn_replace_VkCommandBuffer_handle(&args->commandBuffer); + /* skip args->drawCount */ + if (args->pVertexInfo) { + for (uint32_t i = 0; i < args->drawCount; i++) + vn_replace_VkMultiDrawInfoEXT_handle(&((VkMultiDrawInfoEXT *)args->pVertexInfo)[i]); + } + /* skip args->instanceCount */ + /* skip args->firstInstance */ + /* skip args->stride */ +} + +static inline void vn_encode_vkCmdDrawMultiEXT_reply(struct vn_cs_encoder *enc, const struct vn_command_vkCmdDrawMultiEXT *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkCmdDrawMultiEXT_EXT}); + + /* skip args->commandBuffer */ + /* skip args->drawCount */ + /* skip args->pVertexInfo */ + /* skip args->instanceCount */ + /* skip args->firstInstance */ + /* skip args->stride */ +} + +static inline void vn_decode_vkCmdDrawMultiIndexedEXT_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCmdDrawMultiIndexedEXT *args) +{ + vn_decode_VkCommandBuffer_lookup(dec, &args->commandBuffer); + vn_decode_uint32_t(dec, &args->drawCount); + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, args->drawCount); + args->pIndexInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pIndexInfo) * iter_count); + if (!args->pIndexInfo) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkMultiDrawIndexedInfoEXT_temp(dec, &((VkMultiDrawIndexedInfoEXT *)args->pIndexInfo)[i]); + } else { + vn_decode_array_size_unchecked(dec); + args->pIndexInfo = NULL; + } + vn_decode_uint32_t(dec, &args->instanceCount); + vn_decode_uint32_t(dec, &args->firstInstance); + vn_decode_uint32_t(dec, &args->stride); + if (vn_decode_simple_pointer(dec)) { + args->pVertexOffset = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pVertexOffset)); + if (!args->pVertexOffset) return; + vn_decode_int32_t(dec, (int32_t *)args->pVertexOffset); + } else { + args->pVertexOffset = NULL; + } +} + +static inline void vn_replace_vkCmdDrawMultiIndexedEXT_args_handle(struct vn_command_vkCmdDrawMultiIndexedEXT *args) +{ + vn_replace_VkCommandBuffer_handle(&args->commandBuffer); + /* skip args->drawCount */ + if (args->pIndexInfo) { + for (uint32_t i = 0; i < args->drawCount; i++) + vn_replace_VkMultiDrawIndexedInfoEXT_handle(&((VkMultiDrawIndexedInfoEXT *)args->pIndexInfo)[i]); + } + /* skip args->instanceCount */ + /* skip args->firstInstance */ + /* skip args->stride */ + /* skip args->pVertexOffset */ +} + +static inline void vn_encode_vkCmdDrawMultiIndexedEXT_reply(struct vn_cs_encoder *enc, const struct vn_command_vkCmdDrawMultiIndexedEXT *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkCmdDrawMultiIndexedEXT_EXT}); + + /* skip args->commandBuffer */ + /* skip args->drawCount */ + /* skip args->pIndexInfo */ + /* skip args->instanceCount */ + /* skip args->firstInstance */ + /* skip args->stride */ + /* skip args->pVertexOffset */ +} + static inline void vn_decode_vkCmdDrawIndirect_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCmdDrawIndirect *args) { vn_decode_VkCommandBuffer_lookup(dec, &args->commandBuffer); @@ -4287,6 +4424,50 @@ static inline void vn_encode_vkCmdExecuteCommands_reply(struct vn_cs_encoder *en /* skip args->pCommandBuffers */ } +static inline void vn_decode_vkCmdPushDescriptorSetKHR_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCmdPushDescriptorSetKHR *args) +{ + vn_decode_VkCommandBuffer_lookup(dec, &args->commandBuffer); + vn_decode_VkPipelineBindPoint(dec, &args->pipelineBindPoint); + vn_decode_VkPipelineLayout_lookup(dec, &args->layout); + vn_decode_uint32_t(dec, &args->set); + vn_decode_uint32_t(dec, &args->descriptorWriteCount); + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, args->descriptorWriteCount); + args->pDescriptorWrites = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pDescriptorWrites) * iter_count); + if (!args->pDescriptorWrites) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkWriteDescriptorSet_temp(dec, &((VkWriteDescriptorSet *)args->pDescriptorWrites)[i]); + } else { + vn_decode_array_size(dec, args->descriptorWriteCount); + args->pDescriptorWrites = NULL; + } +} + +static inline void vn_replace_vkCmdPushDescriptorSetKHR_args_handle(struct vn_command_vkCmdPushDescriptorSetKHR *args) +{ + vn_replace_VkCommandBuffer_handle(&args->commandBuffer); + /* skip args->pipelineBindPoint */ + vn_replace_VkPipelineLayout_handle(&args->layout); + /* skip args->set */ + /* skip args->descriptorWriteCount */ + if (args->pDescriptorWrites) { + for (uint32_t i = 0; i < args->descriptorWriteCount; i++) + vn_replace_VkWriteDescriptorSet_handle(&((VkWriteDescriptorSet *)args->pDescriptorWrites)[i]); + } +} + +static inline void vn_encode_vkCmdPushDescriptorSetKHR_reply(struct vn_cs_encoder *enc, const struct vn_command_vkCmdPushDescriptorSetKHR *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkCmdPushDescriptorSetKHR_EXT}); + + /* skip args->commandBuffer */ + /* skip args->pipelineBindPoint */ + /* skip args->layout */ + /* skip args->set */ + /* skip args->descriptorWriteCount */ + /* skip args->pDescriptorWrites */ +} + static inline void vn_decode_vkCmdSetDeviceMask_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCmdSetDeviceMask *args) { vn_decode_VkCommandBuffer_lookup(dec, &args->commandBuffer); @@ -6109,6 +6290,56 @@ static inline void vn_dispatch_vkCmdDrawIndexed(struct vn_dispatch_context *ctx, vn_cs_decoder_reset_temp_pool(ctx->decoder); } +static inline void vn_dispatch_vkCmdDrawMultiEXT(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkCmdDrawMultiEXT args; + + if (!ctx->dispatch_vkCmdDrawMultiEXT) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkCmdDrawMultiEXT_args_temp(ctx->decoder, &args); + if (!args.commandBuffer) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkCmdDrawMultiEXT(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkCmdDrawMultiEXT_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + +static inline void vn_dispatch_vkCmdDrawMultiIndexedEXT(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkCmdDrawMultiIndexedEXT args; + + if (!ctx->dispatch_vkCmdDrawMultiIndexedEXT) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkCmdDrawMultiIndexedEXT_args_temp(ctx->decoder, &args); + if (!args.commandBuffer) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkCmdDrawMultiIndexedEXT(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkCmdDrawMultiIndexedEXT_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + static inline void vn_dispatch_vkCmdDrawIndirect(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkCmdDrawIndirect args; @@ -6884,6 +7115,31 @@ static inline void vn_dispatch_vkCmdExecuteCommands(struct vn_dispatch_context * vn_cs_decoder_reset_temp_pool(ctx->decoder); } +static inline void vn_dispatch_vkCmdPushDescriptorSetKHR(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkCmdPushDescriptorSetKHR args; + + if (!ctx->dispatch_vkCmdPushDescriptorSetKHR) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkCmdPushDescriptorSetKHR_args_temp(ctx->decoder, &args); + if (!args.commandBuffer) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkCmdPushDescriptorSetKHR(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkCmdPushDescriptorSetKHR_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + static inline void vn_dispatch_vkCmdSetDeviceMask(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkCmdSetDeviceMask args; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_defines.h b/src/venus/venus-protocol/vn_protocol_renderer_defines.h index 38049a9d..b95e5250 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_defines.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_defines.h @@ -22,6 +22,8 @@ #define VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA ((VkStructureType)1000384001) #define VK_STRUCTURE_TYPE_IMPORT_MEMORY_RESOURCE_INFO_MESA ((VkStructureType)1000384002) #define VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA ((VkStructureType)1000384003) +#define VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_RESOURCE_INFO_100000_MESA ((VkStructureType)1000384004) +#define VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA ((VkStructureType)1000384005) typedef enum VkCommandTypeEXT { VK_COMMAND_TYPE_vkCreateInstance_EXT = 0, @@ -326,16 +328,22 @@ typedef enum VkCommandTypeEXT { VK_COMMAND_TYPE_vkCmdDrawIndirectByteCountEXT_EXT = 186, VK_COMMAND_TYPE_vkGetMemoryFdKHR_EXT = 193, VK_COMMAND_TYPE_vkGetMemoryFdPropertiesKHR_EXT = 194, - VK_COMMAND_TYPE_vkImportFenceFdKHR_EXT = 238, - VK_COMMAND_TYPE_vkGetFenceFdKHR_EXT = 239, + VK_COMMAND_TYPE_vkImportSemaphoreFdKHR_EXT = 242, + VK_COMMAND_TYPE_vkGetSemaphoreFdKHR_EXT = 243, + VK_COMMAND_TYPE_vkCmdPushDescriptorSetKHR_EXT = 249, + VK_COMMAND_TYPE_vkCmdPushDescriptorSetWithTemplateKHR_EXT = 250, VK_COMMAND_TYPE_vkCmdBeginConditionalRenderingEXT_EXT = 240, VK_COMMAND_TYPE_vkCmdEndConditionalRenderingEXT_EXT = 241, + VK_COMMAND_TYPE_vkImportFenceFdKHR_EXT = 238, + VK_COMMAND_TYPE_vkGetFenceFdKHR_EXT = 239, VK_COMMAND_TYPE_vkGetImageDrmFormatModifierPropertiesEXT_EXT = 187, - VK_COMMAND_TYPE_vkCmdSetPatchControlPointsEXT_EXT = 233, - VK_COMMAND_TYPE_vkCmdSetLogicOpEXT_EXT = 234, VK_COMMAND_TYPE_vkGetPhysicalDeviceCalibrateableTimeDomainsEXT_EXT = 235, VK_COMMAND_TYPE_vkGetCalibratedTimestampsEXT_EXT = 236, VK_COMMAND_TYPE_vkCmdSetLineStippleEXT_EXT = 237, + VK_COMMAND_TYPE_vkCmdSetPatchControlPointsEXT_EXT = 233, + VK_COMMAND_TYPE_vkCmdSetLogicOpEXT_EXT = 234, + VK_COMMAND_TYPE_vkCmdDrawMultiEXT_EXT = 247, + VK_COMMAND_TYPE_vkCmdDrawMultiIndexedEXT_EXT = 248, VK_COMMAND_TYPE_vkSetReplyCommandStreamMESA_EXT = 178, VK_COMMAND_TYPE_vkSeekReplyCommandStreamMESA_EXT = 179, VK_COMMAND_TYPE_vkExecuteCommandStreamsMESA_EXT = 180, @@ -344,6 +352,9 @@ typedef enum VkCommandTypeEXT { VK_COMMAND_TYPE_vkNotifyRingMESA_EXT = 190, VK_COMMAND_TYPE_vkWriteRingExtraMESA_EXT = 191, VK_COMMAND_TYPE_vkGetMemoryResourcePropertiesMESA_EXT = 192, + VK_COMMAND_TYPE_vkResetFenceResource100000MESA_EXT = 244, + VK_COMMAND_TYPE_vkWaitSemaphoreResource100000MESA_EXT = 245, + VK_COMMAND_TYPE_vkImportSemaphoreResource100000MESA_EXT = 246, VK_COMMAND_TYPE_vkGetVenusExperimentalFeatureData100000MESA_EXT = 195, } VkCommandTypeEXT; @@ -403,6 +414,7 @@ typedef struct VkVenusExperimentalFeatures100000MESA { VkBool32 memoryResourceAllocationSize; VkBool32 globalFencing; VkBool32 largeRing; + VkBool32 syncFdFencing; } VkVenusExperimentalFeatures100000MESA; typedef struct VkMemoryResourceAllocationSizeProperties100000MESA { @@ -411,6 +423,19 @@ typedef struct VkMemoryResourceAllocationSizeProperties100000MESA { uint64_t allocationSize; } VkMemoryResourceAllocationSizeProperties100000MESA; +typedef struct VkImportSemaphoreResourceInfo100000MESA { + VkStructureType sType; + const void* pNext; + VkSemaphore semaphore; + uint32_t resourceId; +} VkImportSemaphoreResourceInfo100000MESA; + +typedef struct VkDeviceQueueTimelineInfoMESA { + VkStructureType sType; + const void* pNext; + uint32_t ringIdx; +} VkDeviceQueueTimelineInfoMESA; + struct vn_command_vkCreateInstance { const VkInstanceCreateInfo* pCreateInfo; const VkAllocationCallbacks* pAllocator; @@ -1235,6 +1260,25 @@ struct vn_command_vkCmdDrawIndexed { uint32_t firstInstance; }; +struct vn_command_vkCmdDrawMultiEXT { + VkCommandBuffer commandBuffer; + uint32_t drawCount; + const VkMultiDrawInfoEXT* pVertexInfo; + uint32_t instanceCount; + uint32_t firstInstance; + uint32_t stride; +}; + +struct vn_command_vkCmdDrawMultiIndexedEXT { + VkCommandBuffer commandBuffer; + uint32_t drawCount; + const VkMultiDrawIndexedInfoEXT* pIndexInfo; + uint32_t instanceCount; + uint32_t firstInstance; + uint32_t stride; + const int32_t* pVertexOffset; +}; + struct vn_command_vkCmdDrawIndirect { VkCommandBuffer commandBuffer; VkBuffer buffer; @@ -1521,6 +1565,15 @@ struct vn_command_vkGetPhysicalDeviceSparseImageFormatProperties2 { VkSparseImageFormatProperties2* pProperties; }; +struct vn_command_vkCmdPushDescriptorSetKHR { + VkCommandBuffer commandBuffer; + VkPipelineBindPoint pipelineBindPoint; + VkPipelineLayout layout; + uint32_t set; + uint32_t descriptorWriteCount; + const VkWriteDescriptorSet* pDescriptorWrites; +}; + struct vn_command_vkTrimCommandPool { VkDevice device; VkCommandPool commandPool; @@ -1556,6 +1609,21 @@ struct vn_command_vkGetPhysicalDeviceExternalSemaphoreProperties { VkExternalSemaphoreProperties* pExternalSemaphoreProperties; }; +struct vn_command_vkGetSemaphoreFdKHR { + VkDevice device; + const VkSemaphoreGetFdInfoKHR* pGetFdInfo; + int* pFd; + + VkResult ret; +}; + +struct vn_command_vkImportSemaphoreFdKHR { + VkDevice device; + const VkImportSemaphoreFdInfoKHR* pImportSemaphoreFdInfo; + + VkResult ret; +}; + struct vn_command_vkGetPhysicalDeviceExternalFenceProperties { VkPhysicalDevice physicalDevice; const VkPhysicalDeviceExternalFenceInfo* pExternalFenceInfo; @@ -1646,6 +1714,14 @@ struct vn_command_vkUpdateDescriptorSetWithTemplate { const void* pData; }; +struct vn_command_vkCmdPushDescriptorSetWithTemplateKHR { + VkCommandBuffer commandBuffer; + VkDescriptorUpdateTemplate descriptorUpdateTemplate; + VkPipelineLayout layout; + uint32_t set; + const void* pData; +}; + struct vn_command_vkGetBufferMemoryRequirements2 { VkDevice device; const VkBufferMemoryRequirementsInfo2* pInfo; @@ -2145,6 +2221,21 @@ struct vn_command_vkGetMemoryResourcePropertiesMESA { VkResult ret; }; +struct vn_command_vkResetFenceResource100000MESA { + VkDevice device; + VkFence fence; +}; + +struct vn_command_vkWaitSemaphoreResource100000MESA { + VkDevice device; + VkSemaphore semaphore; +}; + +struct vn_command_vkImportSemaphoreResource100000MESA { + VkDevice device; + const VkImportSemaphoreResourceInfo100000MESA* pImportSemaphoreResourceInfo; +}; + struct vn_command_vkGetVenusExperimentalFeatureData100000MESA { size_t* pDataSize; void* pData; @@ -2267,6 +2358,8 @@ struct vn_dispatch_context { void (*dispatch_vkCmdBindVertexBuffers)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdBindVertexBuffers *args); void (*dispatch_vkCmdDraw)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDraw *args); void (*dispatch_vkCmdDrawIndexed)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDrawIndexed *args); + void (*dispatch_vkCmdDrawMultiEXT)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDrawMultiEXT *args); + void (*dispatch_vkCmdDrawMultiIndexedEXT)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDrawMultiIndexedEXT *args); void (*dispatch_vkCmdDrawIndirect)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDrawIndirect *args); void (*dispatch_vkCmdDrawIndexedIndirect)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDrawIndexedIndirect *args); void (*dispatch_vkCmdDispatch)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdDispatch *args); @@ -2305,11 +2398,14 @@ struct vn_dispatch_context { void (*dispatch_vkGetPhysicalDeviceQueueFamilyProperties2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceQueueFamilyProperties2 *args); void (*dispatch_vkGetPhysicalDeviceMemoryProperties2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceMemoryProperties2 *args); void (*dispatch_vkGetPhysicalDeviceSparseImageFormatProperties2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceSparseImageFormatProperties2 *args); + void (*dispatch_vkCmdPushDescriptorSetKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdPushDescriptorSetKHR *args); void (*dispatch_vkTrimCommandPool)(struct vn_dispatch_context *ctx, struct vn_command_vkTrimCommandPool *args); void (*dispatch_vkGetPhysicalDeviceExternalBufferProperties)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceExternalBufferProperties *args); void (*dispatch_vkGetMemoryFdKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkGetMemoryFdKHR *args); void (*dispatch_vkGetMemoryFdPropertiesKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkGetMemoryFdPropertiesKHR *args); void (*dispatch_vkGetPhysicalDeviceExternalSemaphoreProperties)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceExternalSemaphoreProperties *args); + void (*dispatch_vkGetSemaphoreFdKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkGetSemaphoreFdKHR *args); + void (*dispatch_vkImportSemaphoreFdKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkImportSemaphoreFdKHR *args); void (*dispatch_vkGetPhysicalDeviceExternalFenceProperties)(struct vn_dispatch_context *ctx, struct vn_command_vkGetPhysicalDeviceExternalFenceProperties *args); void (*dispatch_vkGetFenceFdKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkGetFenceFdKHR *args); void (*dispatch_vkImportFenceFdKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkImportFenceFdKHR *args); @@ -2322,6 +2418,7 @@ struct vn_dispatch_context { void (*dispatch_vkCreateDescriptorUpdateTemplate)(struct vn_dispatch_context *ctx, struct vn_command_vkCreateDescriptorUpdateTemplate *args); void (*dispatch_vkDestroyDescriptorUpdateTemplate)(struct vn_dispatch_context *ctx, struct vn_command_vkDestroyDescriptorUpdateTemplate *args); void (*dispatch_vkUpdateDescriptorSetWithTemplate)(struct vn_dispatch_context *ctx, struct vn_command_vkUpdateDescriptorSetWithTemplate *args); + void (*dispatch_vkCmdPushDescriptorSetWithTemplateKHR)(struct vn_dispatch_context *ctx, struct vn_command_vkCmdPushDescriptorSetWithTemplateKHR *args); void (*dispatch_vkGetBufferMemoryRequirements2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetBufferMemoryRequirements2 *args); void (*dispatch_vkGetImageMemoryRequirements2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetImageMemoryRequirements2 *args); void (*dispatch_vkGetImageSparseMemoryRequirements2)(struct vn_dispatch_context *ctx, struct vn_command_vkGetImageSparseMemoryRequirements2 *args); @@ -2398,6 +2495,9 @@ struct vn_dispatch_context { void (*dispatch_vkNotifyRingMESA)(struct vn_dispatch_context *ctx, struct vn_command_vkNotifyRingMESA *args); void (*dispatch_vkWriteRingExtraMESA)(struct vn_dispatch_context *ctx, struct vn_command_vkWriteRingExtraMESA *args); void (*dispatch_vkGetMemoryResourcePropertiesMESA)(struct vn_dispatch_context *ctx, struct vn_command_vkGetMemoryResourcePropertiesMESA *args); + void (*dispatch_vkResetFenceResource100000MESA)(struct vn_dispatch_context *ctx, struct vn_command_vkResetFenceResource100000MESA *args); + void (*dispatch_vkWaitSemaphoreResource100000MESA)(struct vn_dispatch_context *ctx, struct vn_command_vkWaitSemaphoreResource100000MESA *args); + void (*dispatch_vkImportSemaphoreResource100000MESA)(struct vn_dispatch_context *ctx, struct vn_command_vkImportSemaphoreResource100000MESA *args); void (*dispatch_vkGetVenusExperimentalFeatureData100000MESA)(struct vn_dispatch_context *ctx, struct vn_command_vkGetVenusExperimentalFeatureData100000MESA *args); }; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_pool.h b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_pool.h index 73fd4e08..34058d43 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_pool.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_pool.h @@ -108,6 +108,14 @@ vn_decode_VkDescriptorPoolCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkDescriptorPoolInlineUniformBlockCreateInfo_self_temp(dec, (VkDescriptorPoolInlineUniformBlockCreateInfo *)pnext); } break; + case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkMutableDescriptorTypeCreateInfoEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDescriptorPoolCreateInfo_pnext_temp(dec); + vn_decode_VkMutableDescriptorTypeCreateInfoEXT_self_temp(dec, (VkMutableDescriptorTypeCreateInfoEXT *)pnext); + } + break; default: /* unexpected struct */ pnext = NULL; @@ -177,6 +185,9 @@ vn_replace_VkDescriptorPoolCreateInfo_handle(VkDescriptorPoolCreateInfo *val) case VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_INLINE_UNIFORM_BLOCK_CREATE_INFO: vn_replace_VkDescriptorPoolInlineUniformBlockCreateInfo_handle_self((VkDescriptorPoolInlineUniformBlockCreateInfo *)pnext); break; + case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT: + vn_replace_VkMutableDescriptorTypeCreateInfoEXT_handle_self((VkMutableDescriptorTypeCreateInfoEXT *)pnext); + break; default: /* ignore unknown/unsupported struct */ break; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set.h b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set.h index 8630f031..285c65a8 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set.h @@ -183,239 +183,6 @@ vn_replace_VkDescriptorSetAllocateInfo_handle(VkDescriptorSetAllocateInfo *val) } while (pnext); } -/* struct VkDescriptorImageInfo */ - -static inline void -vn_decode_VkDescriptorImageInfo_temp(struct vn_cs_decoder *dec, VkDescriptorImageInfo *val) -{ - vn_decode_VkSampler_lookup(dec, &val->sampler); - vn_decode_VkImageView_lookup(dec, &val->imageView); - vn_decode_VkImageLayout(dec, &val->imageLayout); -} - -static inline void -vn_replace_VkDescriptorImageInfo_handle(VkDescriptorImageInfo *val) -{ - vn_replace_VkSampler_handle(&val->sampler); - vn_replace_VkImageView_handle(&val->imageView); - /* skip val->imageLayout */ -} - -/* struct VkDescriptorBufferInfo */ - -static inline void -vn_decode_VkDescriptorBufferInfo_temp(struct vn_cs_decoder *dec, VkDescriptorBufferInfo *val) -{ - vn_decode_VkBuffer_lookup(dec, &val->buffer); - vn_decode_VkDeviceSize(dec, &val->offset); - vn_decode_VkDeviceSize(dec, &val->range); -} - -static inline void -vn_replace_VkDescriptorBufferInfo_handle(VkDescriptorBufferInfo *val) -{ - vn_replace_VkBuffer_handle(&val->buffer); - /* skip val->offset */ - /* skip val->range */ -} - -/* struct VkWriteDescriptorSetInlineUniformBlock chain */ - -static inline void * -vn_decode_VkWriteDescriptorSetInlineUniformBlock_pnext_temp(struct vn_cs_decoder *dec) -{ - /* no known/supported struct */ - if (vn_decode_simple_pointer(dec)) - vn_cs_decoder_set_fatal(dec); - return NULL; -} - -static inline void -vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSetInlineUniformBlock *val) -{ - /* skip val->{sType,pNext} */ - vn_decode_uint32_t(dec, &val->dataSize); - if (vn_peek_array_size(dec)) { - const size_t array_size = vn_decode_array_size(dec, val->dataSize); - val->pData = vn_cs_decoder_alloc_temp(dec, array_size); - if (!val->pData) return; - vn_decode_blob_array(dec, (void *)val->pData, array_size); - } else { - vn_decode_array_size(dec, val->dataSize); - val->pData = NULL; - } -} - -static inline void -vn_decode_VkWriteDescriptorSetInlineUniformBlock_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSetInlineUniformBlock *val) -{ - VkStructureType stype; - vn_decode_VkStructureType(dec, &stype); - if (stype != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK) - vn_cs_decoder_set_fatal(dec); - - val->sType = stype; - val->pNext = vn_decode_VkWriteDescriptorSetInlineUniformBlock_pnext_temp(dec); - vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(dec, val); -} - -static inline void -vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self(VkWriteDescriptorSetInlineUniformBlock *val) -{ - /* skip val->sType */ - /* skip val->pNext */ - /* skip val->dataSize */ - /* skip val->pData */ -} - -static inline void -vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle(VkWriteDescriptorSetInlineUniformBlock *val) -{ - struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; - - do { - switch ((int32_t)pnext->sType) { - case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: - vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self((VkWriteDescriptorSetInlineUniformBlock *)pnext); - break; - default: - /* ignore unknown/unsupported struct */ - break; - } - pnext = pnext->pNext; - } while (pnext); -} - -/* struct VkWriteDescriptorSet chain */ - -static inline void * -vn_decode_VkWriteDescriptorSet_pnext_temp(struct vn_cs_decoder *dec) -{ - VkBaseOutStructure *pnext; - VkStructureType stype; - - if (!vn_decode_simple_pointer(dec)) - return NULL; - - vn_decode_VkStructureType(dec, &stype); - switch ((int32_t)stype) { - case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: - pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkWriteDescriptorSetInlineUniformBlock)); - if (pnext) { - pnext->sType = stype; - pnext->pNext = vn_decode_VkWriteDescriptorSet_pnext_temp(dec); - vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(dec, (VkWriteDescriptorSetInlineUniformBlock *)pnext); - } - break; - default: - /* unexpected struct */ - pnext = NULL; - vn_cs_decoder_set_fatal(dec); - break; - } - - return pnext; -} - -static inline void -vn_decode_VkWriteDescriptorSet_self_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSet *val) -{ - /* skip val->{sType,pNext} */ - vn_decode_VkDescriptorSet_lookup(dec, &val->dstSet); - vn_decode_uint32_t(dec, &val->dstBinding); - vn_decode_uint32_t(dec, &val->dstArrayElement); - vn_decode_uint32_t(dec, &val->descriptorCount); - vn_decode_VkDescriptorType(dec, &val->descriptorType); - if (vn_peek_array_size(dec)) { - const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); - val->pImageInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pImageInfo) * iter_count); - if (!val->pImageInfo) return; - for (uint32_t i = 0; i < iter_count; i++) - vn_decode_VkDescriptorImageInfo_temp(dec, &((VkDescriptorImageInfo *)val->pImageInfo)[i]); - } else { - vn_decode_array_size_unchecked(dec); - val->pImageInfo = NULL; - } - if (vn_peek_array_size(dec)) { - const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); - val->pBufferInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pBufferInfo) * iter_count); - if (!val->pBufferInfo) return; - for (uint32_t i = 0; i < iter_count; i++) - vn_decode_VkDescriptorBufferInfo_temp(dec, &((VkDescriptorBufferInfo *)val->pBufferInfo)[i]); - } else { - vn_decode_array_size_unchecked(dec); - val->pBufferInfo = NULL; - } - if (vn_peek_array_size(dec)) { - const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); - val->pTexelBufferView = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pTexelBufferView) * iter_count); - if (!val->pTexelBufferView) return; - for (uint32_t i = 0; i < iter_count; i++) - vn_decode_VkBufferView_lookup(dec, &((VkBufferView *)val->pTexelBufferView)[i]); - } else { - vn_decode_array_size_unchecked(dec); - val->pTexelBufferView = NULL; - } -} - -static inline void -vn_decode_VkWriteDescriptorSet_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSet *val) -{ - VkStructureType stype; - vn_decode_VkStructureType(dec, &stype); - if (stype != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) - vn_cs_decoder_set_fatal(dec); - - val->sType = stype; - val->pNext = vn_decode_VkWriteDescriptorSet_pnext_temp(dec); - vn_decode_VkWriteDescriptorSet_self_temp(dec, val); -} - -static inline void -vn_replace_VkWriteDescriptorSet_handle_self(VkWriteDescriptorSet *val) -{ - /* skip val->sType */ - /* skip val->pNext */ - vn_replace_VkDescriptorSet_handle(&val->dstSet); - /* skip val->dstBinding */ - /* skip val->dstArrayElement */ - /* skip val->descriptorCount */ - /* skip val->descriptorType */ - if (val->pImageInfo) { - for (uint32_t i = 0; i < val->descriptorCount; i++) - vn_replace_VkDescriptorImageInfo_handle(&((VkDescriptorImageInfo *)val->pImageInfo)[i]); - } - if (val->pBufferInfo) { - for (uint32_t i = 0; i < val->descriptorCount; i++) - vn_replace_VkDescriptorBufferInfo_handle(&((VkDescriptorBufferInfo *)val->pBufferInfo)[i]); - } - if (val->pTexelBufferView) { - for (uint32_t i = 0; i < val->descriptorCount; i++) - vn_replace_VkBufferView_handle(&((VkBufferView *)val->pTexelBufferView)[i]); - } -} - -static inline void -vn_replace_VkWriteDescriptorSet_handle(VkWriteDescriptorSet *val) -{ - struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; - - do { - switch ((int32_t)pnext->sType) { - case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET: - vn_replace_VkWriteDescriptorSet_handle_self((VkWriteDescriptorSet *)pnext); - break; - case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: - vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self((VkWriteDescriptorSetInlineUniformBlock *)pnext); - break; - default: - /* ignore unknown/unsupported struct */ - break; - } - pnext = pnext->pNext; - } while (pnext); -} - /* struct VkCopyDescriptorSet chain */ static inline void * diff --git a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set_layout.h b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set_layout.h index da976cb6..fe044242 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set_layout.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_descriptor_set_layout.h @@ -137,6 +137,14 @@ vn_decode_VkDescriptorSetLayoutCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkDescriptorSetLayoutBindingFlagsCreateInfo_self_temp(dec, (VkDescriptorSetLayoutBindingFlagsCreateInfo *)pnext); } break; + case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkMutableDescriptorTypeCreateInfoEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDescriptorSetLayoutCreateInfo_pnext_temp(dec); + vn_decode_VkMutableDescriptorTypeCreateInfoEXT_self_temp(dec, (VkMutableDescriptorTypeCreateInfoEXT *)pnext); + } + break; default: /* unexpected struct */ pnext = NULL; @@ -204,6 +212,9 @@ vn_replace_VkDescriptorSetLayoutCreateInfo_handle(VkDescriptorSetLayoutCreateInf case VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_BINDING_FLAGS_CREATE_INFO: vn_replace_VkDescriptorSetLayoutBindingFlagsCreateInfo_handle_self((VkDescriptorSetLayoutBindingFlagsCreateInfo *)pnext); break; + case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT: + vn_replace_VkMutableDescriptorTypeCreateInfoEXT_handle_self((VkMutableDescriptorTypeCreateInfoEXT *)pnext); + break; default: /* ignore unknown/unsupported struct */ break; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_device.h b/src/venus/venus-protocol/vn_protocol_renderer_device.h index 4514514f..ebc0e532 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_device.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_device.h @@ -1585,6 +1585,115 @@ vn_replace_VkPhysicalDeviceProtectedMemoryFeatures_handle(VkPhysicalDeviceProtec } while (pnext); } +/* struct VkPhysicalDeviceMultiDrawFeaturesEXT chain */ + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_VkBool32(enc, &val->multiDraw); +} + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT(struct vn_cs_encoder *enc, const VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT }); + vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->multiDraw); +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_temp(dec, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->multiDraw */ +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_partial_temp(dec, val); +} + +static inline void +vn_replace_VkPhysicalDeviceMultiDrawFeaturesEXT_handle_self(VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->multiDraw */ +} + +static inline void +vn_replace_VkPhysicalDeviceMultiDrawFeaturesEXT_handle(VkPhysicalDeviceMultiDrawFeaturesEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMultiDrawFeaturesEXT_handle_self((VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + /* struct VkPhysicalDeviceInlineUniformBlockFeatures chain */ static inline void @@ -3998,6 +4107,119 @@ vn_replace_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_handle(VkPhysical } while (pnext); } +/* struct VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT chain */ + +static inline void +vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_VkBool32(enc, &val->primitiveTopologyListRestart); + vn_encode_VkBool32(enc, &val->primitiveTopologyPatchListRestart); +} + +static inline void +vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT(struct vn_cs_encoder *enc, const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT }); + vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->primitiveTopologyListRestart); + vn_decode_VkBool32(dec, &val->primitiveTopologyPatchListRestart); +} + +static inline void +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_temp(dec, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->primitiveTopologyListRestart */ + /* skip val->primitiveTopologyPatchListRestart */ +} + +static inline void +vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_partial_temp(dec, val); +} + +static inline void +vn_replace_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_handle_self(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->primitiveTopologyListRestart */ + /* skip val->primitiveTopologyPatchListRestart */ +} + +static inline void +vn_replace_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_handle(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_handle_self((VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + /* struct VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures chain */ static inline void @@ -6074,6 +6296,224 @@ vn_replace_VkPhysicalDeviceShaderTerminateInvocationFeatures_handle(VkPhysicalDe } while (pnext); } +/* struct VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT chain */ + +static inline void +vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_VkBool32(enc, &val->mutableDescriptorType); +} + +static inline void +vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT(struct vn_cs_encoder *enc, const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT }); + vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->mutableDescriptorType); +} + +static inline void +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_temp(dec, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->mutableDescriptorType */ +} + +static inline void +vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_partial_temp(dec, val); +} + +static inline void +vn_replace_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_handle_self(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->mutableDescriptorType */ +} + +static inline void +vn_replace_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_handle(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_handle_self((VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + +/* struct VkPhysicalDeviceDepthClipControlFeaturesEXT chain */ + +static inline void +vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_VkBool32(enc, &val->depthClipControl); +} + +static inline void +vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT(struct vn_cs_encoder *enc, const VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT }); + vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->depthClipControl); +} + +static inline void +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext_temp(dec); + vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_temp(dec, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->depthClipControl */ +} + +static inline void +vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_partial_temp(dec, val); +} + +static inline void +vn_replace_VkPhysicalDeviceDepthClipControlFeaturesEXT_handle_self(VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->depthClipControl */ +} + +static inline void +vn_replace_VkPhysicalDeviceDepthClipControlFeaturesEXT_handle(VkPhysicalDeviceDepthClipControlFeaturesEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + vn_replace_VkPhysicalDeviceDepthClipControlFeaturesEXT_handle_self((VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + /* struct VkPhysicalDeviceSynchronization2Features chain */ static inline void @@ -6183,6 +6623,123 @@ vn_replace_VkPhysicalDeviceSynchronization2Features_handle(VkPhysicalDeviceSynch } while (pnext); } +/* struct VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT chain */ + +static inline void +vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_VkBool32(enc, &val->primitivesGeneratedQuery); + vn_encode_VkBool32(enc, &val->primitivesGeneratedQueryWithRasterizerDiscard); + vn_encode_VkBool32(enc, &val->primitivesGeneratedQueryWithNonZeroStreams); +} + +static inline void +vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT(struct vn_cs_encoder *enc, const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT }); + vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->primitivesGeneratedQuery); + vn_decode_VkBool32(dec, &val->primitivesGeneratedQueryWithRasterizerDiscard); + vn_decode_VkBool32(dec, &val->primitivesGeneratedQueryWithNonZeroStreams); +} + +static inline void +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_temp(dec, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->primitivesGeneratedQuery */ + /* skip val->primitivesGeneratedQueryWithRasterizerDiscard */ + /* skip val->primitivesGeneratedQueryWithNonZeroStreams */ +} + +static inline void +vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_partial_temp(dec, val); +} + +static inline void +vn_replace_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_handle_self(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->primitivesGeneratedQuery */ + /* skip val->primitivesGeneratedQueryWithRasterizerDiscard */ + /* skip val->primitivesGeneratedQueryWithNonZeroStreams */ +} + +static inline void +vn_replace_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_handle(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_handle_self((VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + /* struct VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT chain */ static inline void @@ -6783,6 +7340,12 @@ vn_encode_VkPhysicalDeviceFeatures2_pnext(struct vn_cs_encoder *enc, const void vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); vn_encode_VkPhysicalDeviceProtectedMemoryFeatures_self(enc, (const VkPhysicalDeviceProtectedMemoryFeatures *)pnext); return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDeviceMultiDrawFeaturesEXT_self(enc, (const VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); @@ -6909,6 +7472,12 @@ vn_encode_VkPhysicalDeviceFeatures2_pnext(struct vn_cs_encoder *enc, const void vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); vn_encode_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_self(enc, (const VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self(enc, (const VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); @@ -7005,12 +7574,30 @@ vn_encode_VkPhysicalDeviceFeatures2_pnext(struct vn_cs_encoder *enc, const void vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); vn_encode_VkPhysicalDeviceShaderTerminateInvocationFeatures_self(enc, (const VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self(enc, (const VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self(enc, (const VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); vn_encode_VkPhysicalDeviceSynchronization2Features_self(enc, (const VkPhysicalDeviceSynchronization2Features *)pnext); return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceFeatures2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self(enc, (const VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); @@ -7134,6 +7721,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceProtectedMemoryFeatures_self_temp(dec, (VkPhysicalDeviceProtectedMemoryFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_temp(dec, (VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceInlineUniformBlockFeatures)); if (pnext) { @@ -7302,6 +7897,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_self_temp(dec, (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_temp(dec, (VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures)); if (pnext) { @@ -7430,6 +8033,22 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceShaderTerminateInvocationFeatures_self_temp(dec, (VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_temp(dec, (VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceDepthClipControlFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(dec); + vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_temp(dec, (VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceSynchronization2Features)); if (pnext) { @@ -7438,6 +8057,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceSynchronization2Features_self_temp(dec, (VkPhysicalDeviceSynchronization2Features *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_temp(dec, (VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT)); if (pnext) { @@ -7575,6 +8202,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(struct vn_cs_decoder *dec vn_decode_VkPhysicalDeviceProtectedMemoryFeatures_self_partial_temp(dec, (VkPhysicalDeviceProtectedMemoryFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_partial_temp(dec, (VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceInlineUniformBlockFeatures)); if (pnext) { @@ -7743,6 +8378,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(struct vn_cs_decoder *dec vn_decode_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_self_partial_temp(dec, (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_partial_temp(dec, (VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures)); if (pnext) { @@ -7871,6 +8514,22 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(struct vn_cs_decoder *dec vn_decode_VkPhysicalDeviceShaderTerminateInvocationFeatures_self_partial_temp(dec, (VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_partial_temp(dec, (VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceDepthClipControlFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_partial_temp(dec, (VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceSynchronization2Features)); if (pnext) { @@ -7879,6 +8538,14 @@ vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(struct vn_cs_decoder *dec vn_decode_VkPhysicalDeviceSynchronization2Features_self_partial_temp(dec, (VkPhysicalDeviceSynchronization2Features *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceFeatures2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_partial_temp(dec, (VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT)); if (pnext) { @@ -7988,6 +8655,9 @@ vn_replace_VkPhysicalDeviceFeatures2_handle(VkPhysicalDeviceFeatures2 *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: vn_replace_VkPhysicalDeviceProtectedMemoryFeatures_handle_self((VkPhysicalDeviceProtectedMemoryFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMultiDrawFeaturesEXT_handle_self((VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: vn_replace_VkPhysicalDeviceInlineUniformBlockFeatures_handle_self((VkPhysicalDeviceInlineUniformBlockFeatures *)pnext); break; @@ -8051,6 +8721,9 @@ vn_replace_VkPhysicalDeviceFeatures2_handle(VkPhysicalDeviceFeatures2 *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: vn_replace_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_handle_self((VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_handle_self((VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: vn_replace_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures_handle_self((VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *)pnext); break; @@ -8099,9 +8772,18 @@ vn_replace_VkPhysicalDeviceFeatures2_handle(VkPhysicalDeviceFeatures2 *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES: vn_replace_VkPhysicalDeviceShaderTerminateInvocationFeatures_handle_self((VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_handle_self((VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + vn_replace_VkPhysicalDeviceDepthClipControlFeaturesEXT_handle_self((VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: vn_replace_VkPhysicalDeviceSynchronization2Features_handle_self((VkPhysicalDeviceSynchronization2Features *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_handle_self((VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: vn_replace_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT_handle_self((VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *)pnext); break; @@ -8289,6 +8971,14 @@ vn_decode_VkDeviceCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceProtectedMemoryFeatures_self_temp(dec, (VkPhysicalDeviceProtectedMemoryFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMultiDrawFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceCreateInfo_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawFeaturesEXT_self_temp(dec, (VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceInlineUniformBlockFeatures)); if (pnext) { @@ -8457,6 +9147,14 @@ vn_decode_VkDeviceCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_self_temp(dec, (VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceCreateInfo_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_self_temp(dec, (VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures)); if (pnext) { @@ -8585,6 +9283,22 @@ vn_decode_VkDeviceCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceShaderTerminateInvocationFeatures_self_temp(dec, (VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceCreateInfo_pnext_temp(dec); + vn_decode_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_self_temp(dec, (VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceDepthClipControlFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceCreateInfo_pnext_temp(dec); + vn_decode_VkPhysicalDeviceDepthClipControlFeaturesEXT_self_temp(dec, (VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceSynchronization2Features)); if (pnext) { @@ -8593,6 +9307,14 @@ vn_decode_VkDeviceCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkPhysicalDeviceSynchronization2Features_self_temp(dec, (VkPhysicalDeviceSynchronization2Features *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceCreateInfo_pnext_temp(dec); + vn_decode_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_self_temp(dec, (VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT)); if (pnext) { @@ -8770,6 +9492,9 @@ vn_replace_VkDeviceCreateInfo_handle(VkDeviceCreateInfo *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROTECTED_MEMORY_FEATURES: vn_replace_VkPhysicalDeviceProtectedMemoryFeatures_handle_self((VkPhysicalDeviceProtectedMemoryFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMultiDrawFeaturesEXT_handle_self((VkPhysicalDeviceMultiDrawFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INLINE_UNIFORM_BLOCK_FEATURES: vn_replace_VkPhysicalDeviceInlineUniformBlockFeatures_handle_self((VkPhysicalDeviceInlineUniformBlockFeatures *)pnext); break; @@ -8833,6 +9558,9 @@ vn_replace_VkDeviceCreateInfo_handle(VkDeviceCreateInfo *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SEPARATE_DEPTH_STENCIL_LAYOUTS_FEATURES: vn_replace_VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures_handle_self((VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVE_TOPOLOGY_LIST_RESTART_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT_handle_self((VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DEMOTE_TO_HELPER_INVOCATION_FEATURES: vn_replace_VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures_handle_self((VkPhysicalDeviceShaderDemoteToHelperInvocationFeatures *)pnext); break; @@ -8881,9 +9609,18 @@ vn_replace_VkDeviceCreateInfo_handle(VkDeviceCreateInfo *val) case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_TERMINATE_INVOCATION_FEATURES: vn_replace_VkPhysicalDeviceShaderTerminateInvocationFeatures_handle_self((VkPhysicalDeviceShaderTerminateInvocationFeatures *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT: + vn_replace_VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT_handle_self((VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT *)pnext); + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLIP_CONTROL_FEATURES_EXT: + vn_replace_VkPhysicalDeviceDepthClipControlFeaturesEXT_handle_self((VkPhysicalDeviceDepthClipControlFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SYNCHRONIZATION_2_FEATURES: vn_replace_VkPhysicalDeviceSynchronization2Features_handle_self((VkPhysicalDeviceSynchronization2Features *)pnext); break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT: + vn_replace_VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT_handle_self((VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT *)pnext); + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT: vn_replace_VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT_handle_self((VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT *)pnext); break; @@ -8907,6 +9644,114 @@ vn_replace_VkDeviceCreateInfo_handle(VkDeviceCreateInfo *val) } while (pnext); } +/* struct VkPhysicalDeviceMultiDrawPropertiesEXT chain */ + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDeviceMultiDrawPropertiesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_uint32_t(enc, &val->maxMultiDrawCount); +} + +static inline void +vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT(struct vn_cs_encoder *enc, const VkPhysicalDeviceMultiDrawPropertiesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT }); + vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawPropertiesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->maxMultiDrawCount */ +} + +static inline void +vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDeviceMultiDrawPropertiesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_self_partial_temp(dec, val); +} + +/* struct VkPhysicalDevicePushDescriptorPropertiesKHR chain */ + +static inline void +vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR_self(struct vn_cs_encoder *enc, const VkPhysicalDevicePushDescriptorPropertiesKHR *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_uint32_t(enc, &val->maxPushDescriptors); +} + +static inline void +vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR(struct vn_cs_encoder *enc, const VkPhysicalDevicePushDescriptorPropertiesKHR *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR }); + vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR_pnext(enc, val->pNext); + vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePushDescriptorPropertiesKHR *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->maxPushDescriptors */ +} + +static inline void +vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePushDescriptorPropertiesKHR *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_self_partial_temp(dec, val); +} + /* struct VkConformanceVersion */ static inline void @@ -9868,6 +10713,66 @@ vn_decode_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT_partial_temp(struc vn_decode_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT_self_partial_temp(dec, val); } +/* struct VkPhysicalDevicePCIBusInfoPropertiesEXT chain */ + +static inline void +vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self(struct vn_cs_encoder *enc, const VkPhysicalDevicePCIBusInfoPropertiesEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_uint32_t(enc, &val->pciDomain); + vn_encode_uint32_t(enc, &val->pciBus); + vn_encode_uint32_t(enc, &val->pciDevice); + vn_encode_uint32_t(enc, &val->pciFunction); +} + +static inline void +vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT(struct vn_cs_encoder *enc, const VkPhysicalDevicePCIBusInfoPropertiesEXT *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT }); + vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT_pnext(enc, val->pNext); + vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self(enc, val); +} + +static inline void * +vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePCIBusInfoPropertiesEXT *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->pciDomain */ + /* skip val->pciBus */ + /* skip val->pciDevice */ + /* skip val->pciFunction */ +} + +static inline void +vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_partial_temp(struct vn_cs_decoder *dec, VkPhysicalDevicePCIBusInfoPropertiesEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self_partial_temp(dec, val); +} + /* struct VkPhysicalDeviceDepthStencilResolveProperties chain */ static inline void @@ -10846,6 +11751,18 @@ vn_encode_VkPhysicalDeviceProperties2_pnext(struct vn_cs_encoder *enc, const voi while (pnext) { switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceProperties2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDeviceMultiDrawPropertiesEXT_self(enc, (const VkPhysicalDeviceMultiDrawPropertiesEXT *)pnext); + return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceProperties2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDevicePushDescriptorPropertiesKHR_self(enc, (const VkPhysicalDevicePushDescriptorPropertiesKHR *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); @@ -10936,6 +11853,12 @@ vn_encode_VkPhysicalDeviceProperties2_pnext(struct vn_cs_encoder *enc, const voi vn_encode_VkPhysicalDeviceProperties2_pnext(enc, pnext->pNext); vn_encode_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT_self(enc, (const VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)pnext); return; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkPhysicalDeviceProperties2_pnext(enc, pnext->pNext); + vn_encode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self(enc, (const VkPhysicalDevicePCIBusInfoPropertiesEXT *)pnext); + return; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: vn_encode_simple_pointer(enc, pnext); vn_encode_VkStructureType(enc, &pnext->sType); @@ -11045,6 +11968,22 @@ vn_decode_VkPhysicalDeviceProperties2_pnext_partial_temp(struct vn_cs_decoder *d vn_decode_VkStructureType(dec, &stype); switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceMultiDrawPropertiesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceProperties2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDeviceMultiDrawPropertiesEXT_self_partial_temp(dec, (VkPhysicalDeviceMultiDrawPropertiesEXT *)pnext); + } + break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PUSH_DESCRIPTOR_PROPERTIES_KHR: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePushDescriptorPropertiesKHR)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceProperties2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePushDescriptorPropertiesKHR_self_partial_temp(dec, (VkPhysicalDevicePushDescriptorPropertiesKHR *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceDriverProperties)); if (pnext) { @@ -11165,6 +12104,14 @@ vn_decode_VkPhysicalDeviceProperties2_pnext_partial_temp(struct vn_cs_decoder *d vn_decode_VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT_self_partial_temp(dec, (VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT *)pnext); } break; + case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PCI_BUS_INFO_PROPERTIES_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDevicePCIBusInfoPropertiesEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPhysicalDeviceProperties2_pnext_partial_temp(dec); + vn_decode_VkPhysicalDevicePCIBusInfoPropertiesEXT_self_partial_temp(dec, (VkPhysicalDevicePCIBusInfoPropertiesEXT *)pnext); + } + break; case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPhysicalDeviceDepthStencilResolveProperties)); if (pnext) { @@ -12783,10 +13730,10 @@ vn_decode_VkPhysicalDeviceGroupProperties_partial_temp(struct vn_cs_decoder *dec vn_decode_VkPhysicalDeviceGroupProperties_self_partial_temp(dec, val); } -/* struct VkDeviceQueueInfo2 chain */ +/* struct VkDeviceQueueTimelineInfoMESA chain */ static inline void * -vn_decode_VkDeviceQueueInfo2_pnext_temp(struct vn_cs_decoder *dec) +vn_decode_VkDeviceQueueTimelineInfoMESA_pnext_temp(struct vn_cs_decoder *dec) { /* no known/supported struct */ if (vn_decode_simple_pointer(dec)) @@ -12795,6 +13742,83 @@ vn_decode_VkDeviceQueueInfo2_pnext_temp(struct vn_cs_decoder *dec) } static inline void +vn_decode_VkDeviceQueueTimelineInfoMESA_self_temp(struct vn_cs_decoder *dec, VkDeviceQueueTimelineInfoMESA *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_uint32_t(dec, &val->ringIdx); +} + +static inline void +vn_decode_VkDeviceQueueTimelineInfoMESA_temp(struct vn_cs_decoder *dec, VkDeviceQueueTimelineInfoMESA *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkDeviceQueueTimelineInfoMESA_pnext_temp(dec); + vn_decode_VkDeviceQueueTimelineInfoMESA_self_temp(dec, val); +} + +static inline void +vn_replace_VkDeviceQueueTimelineInfoMESA_handle_self(VkDeviceQueueTimelineInfoMESA *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->ringIdx */ +} + +static inline void +vn_replace_VkDeviceQueueTimelineInfoMESA_handle(VkDeviceQueueTimelineInfoMESA *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA: + vn_replace_VkDeviceQueueTimelineInfoMESA_handle_self((VkDeviceQueueTimelineInfoMESA *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + +/* struct VkDeviceQueueInfo2 chain */ + +static inline void * +vn_decode_VkDeviceQueueInfo2_pnext_temp(struct vn_cs_decoder *dec) +{ + VkBaseOutStructure *pnext; + VkStructureType stype; + + if (!vn_decode_simple_pointer(dec)) + return NULL; + + vn_decode_VkStructureType(dec, &stype); + switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkDeviceQueueTimelineInfoMESA)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkDeviceQueueInfo2_pnext_temp(dec); + vn_decode_VkDeviceQueueTimelineInfoMESA_self_temp(dec, (VkDeviceQueueTimelineInfoMESA *)pnext); + } + break; + default: + /* unexpected struct */ + pnext = NULL; + vn_cs_decoder_set_fatal(dec); + break; + } + + return pnext; +} + +static inline void vn_decode_VkDeviceQueueInfo2_self_temp(struct vn_cs_decoder *dec, VkDeviceQueueInfo2 *val) { /* skip val->{sType,pNext} */ @@ -12836,6 +13860,9 @@ vn_replace_VkDeviceQueueInfo2_handle(VkDeviceQueueInfo2 *val) case VK_STRUCTURE_TYPE_DEVICE_QUEUE_INFO_2: vn_replace_VkDeviceQueueInfo2_handle_self((VkDeviceQueueInfo2 *)pnext); break; + case VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA: + vn_replace_VkDeviceQueueTimelineInfoMESA_handle_self((VkDeviceQueueTimelineInfoMESA *)pnext); + break; default: /* ignore unknown/unsupported struct */ break; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_device_memory.h b/src/venus/venus-protocol/vn_protocol_renderer_device_memory.h index 5376085b..e549f09f 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_device_memory.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_device_memory.h @@ -19,6 +19,8 @@ * * VkImportMemoryFdInfoKHR * vkMapMemory + * vkGetMemoryFdKHR + * vkGetMemoryFdPropertiesKHR */ /* struct VkExportMemoryAllocateInfo chain */ @@ -556,6 +558,150 @@ vn_replace_VkDeviceMemoryOpaqueCaptureAddressInfo_handle(VkDeviceMemoryOpaqueCap } while (pnext); } +/* struct VkMemoryResourceAllocationSizeProperties100000MESA chain */ + +static inline void +vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext(struct vn_cs_encoder *enc, const void *val) +{ + /* no known/supported struct */ + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(struct vn_cs_encoder *enc, const VkMemoryResourceAllocationSizeProperties100000MESA *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_uint64_t(enc, &val->allocationSize); +} + +static inline void +vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA(struct vn_cs_encoder *enc, const VkMemoryResourceAllocationSizeProperties100000MESA *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA }); + vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext(enc, val->pNext); + vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(enc, val); +} + +static inline void * +vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourceAllocationSizeProperties100000MESA *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->allocationSize */ +} + +static inline void +vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourceAllocationSizeProperties100000MESA *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext_partial_temp(dec); + vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(dec, val); +} + +/* struct VkMemoryResourcePropertiesMESA chain */ + +static inline void +vn_encode_VkMemoryResourcePropertiesMESA_pnext(struct vn_cs_encoder *enc, const void *val) +{ + const VkBaseInStructure *pnext = val; + + while (pnext) { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA: + vn_encode_simple_pointer(enc, pnext); + vn_encode_VkStructureType(enc, &pnext->sType); + vn_encode_VkMemoryResourcePropertiesMESA_pnext(enc, pnext->pNext); + vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(enc, (const VkMemoryResourceAllocationSizeProperties100000MESA *)pnext); + return; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } + + vn_encode_simple_pointer(enc, NULL); +} + +static inline void +vn_encode_VkMemoryResourcePropertiesMESA_self(struct vn_cs_encoder *enc, const VkMemoryResourcePropertiesMESA *val) +{ + /* skip val->{sType,pNext} */ + vn_encode_uint32_t(enc, &val->memoryTypeBits); +} + +static inline void +vn_encode_VkMemoryResourcePropertiesMESA(struct vn_cs_encoder *enc, const VkMemoryResourcePropertiesMESA *val) +{ + assert(val->sType == VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA); + vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA }); + vn_encode_VkMemoryResourcePropertiesMESA_pnext(enc, val->pNext); + vn_encode_VkMemoryResourcePropertiesMESA_self(enc, val); +} + +static inline void * +vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(struct vn_cs_decoder *dec) +{ + VkBaseOutStructure *pnext; + VkStructureType stype; + + if (!vn_decode_simple_pointer(dec)) + return NULL; + + vn_decode_VkStructureType(dec, &stype); + switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkMemoryResourceAllocationSizeProperties100000MESA)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(dec); + vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(dec, (VkMemoryResourceAllocationSizeProperties100000MESA *)pnext); + } + break; + default: + /* unexpected struct */ + pnext = NULL; + vn_cs_decoder_set_fatal(dec); + break; + } + + return pnext; +} + +static inline void +vn_decode_VkMemoryResourcePropertiesMESA_self_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourcePropertiesMESA *val) +{ + /* skip val->{sType,pNext} */ + /* skip val->memoryTypeBits */ +} + +static inline void +vn_decode_VkMemoryResourcePropertiesMESA_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourcePropertiesMESA *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(dec); + vn_decode_VkMemoryResourcePropertiesMESA_self_partial_temp(dec, val); +} + static inline void vn_decode_vkAllocateMemory_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkAllocateMemory *args) { vn_decode_VkDevice_lookup(dec, &args->device); @@ -781,6 +927,38 @@ static inline void vn_encode_vkGetDeviceMemoryOpaqueCaptureAddress_reply(struct /* skip args->pInfo */ } +static inline void vn_decode_vkGetMemoryResourcePropertiesMESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkGetMemoryResourcePropertiesMESA *args) +{ + vn_decode_VkDevice_lookup(dec, &args->device); + vn_decode_uint32_t(dec, &args->resourceId); + if (vn_decode_simple_pointer(dec)) { + args->pMemoryResourceProperties = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pMemoryResourceProperties)); + if (!args->pMemoryResourceProperties) return; + vn_decode_VkMemoryResourcePropertiesMESA_partial_temp(dec, args->pMemoryResourceProperties); + } else { + args->pMemoryResourceProperties = NULL; + vn_cs_decoder_set_fatal(dec); + } +} + +static inline void vn_replace_vkGetMemoryResourcePropertiesMESA_args_handle(struct vn_command_vkGetMemoryResourcePropertiesMESA *args) +{ + vn_replace_VkDevice_handle(&args->device); + /* skip args->resourceId */ + /* skip args->pMemoryResourceProperties */ +} + +static inline void vn_encode_vkGetMemoryResourcePropertiesMESA_reply(struct vn_cs_encoder *enc, const struct vn_command_vkGetMemoryResourcePropertiesMESA *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkGetMemoryResourcePropertiesMESA_EXT}); + + vn_encode_VkResult(enc, &args->ret); + /* skip args->device */ + /* skip args->resourceId */ + if (vn_encode_simple_pointer(enc, args->pMemoryResourceProperties)) + vn_encode_VkMemoryResourcePropertiesMESA(enc, args->pMemoryResourceProperties); +} + static inline void vn_dispatch_vkAllocateMemory(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkAllocateMemory args; @@ -968,6 +1146,35 @@ static inline void vn_dispatch_vkGetDeviceMemoryOpaqueCaptureAddress(struct vn_d vn_cs_decoder_reset_temp_pool(ctx->decoder); } +static inline void vn_dispatch_vkGetMemoryResourcePropertiesMESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkGetMemoryResourcePropertiesMESA args; + + if (!ctx->dispatch_vkGetMemoryResourcePropertiesMESA) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkGetMemoryResourcePropertiesMESA_args_temp(ctx->decoder, &args); + if (!args.device) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkGetMemoryResourcePropertiesMESA(ctx, &args); + +#ifdef DEBUG + if (!vn_cs_decoder_get_fatal(ctx->decoder) && vn_dispatch_should_log_result(args.ret)) + vn_dispatch_debug_log(ctx, "vkGetMemoryResourcePropertiesMESA returned %d", args.ret); +#endif + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkGetMemoryResourcePropertiesMESA_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + #pragma GCC diagnostic pop #endif /* VN_PROTOCOL_RENDERER_DEVICE_MEMORY_H */ diff --git a/src/venus/venus-protocol/vn_protocol_renderer_dispatches.h b/src/venus/venus-protocol/vn_protocol_renderer_dispatches.h index a0595856..725a0e79 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_dispatches.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_dispatches.h @@ -150,6 +150,8 @@ static inline const char *vn_dispatch_command_name(VkCommandTypeEXT type) case VK_COMMAND_TYPE_vkCmdBindVertexBuffers_EXT: return "vkCmdBindVertexBuffers"; case VK_COMMAND_TYPE_vkCmdDraw_EXT: return "vkCmdDraw"; case VK_COMMAND_TYPE_vkCmdDrawIndexed_EXT: return "vkCmdDrawIndexed"; + case VK_COMMAND_TYPE_vkCmdDrawMultiEXT_EXT: return "vkCmdDrawMultiEXT"; + case VK_COMMAND_TYPE_vkCmdDrawMultiIndexedEXT_EXT: return "vkCmdDrawMultiIndexedEXT"; case VK_COMMAND_TYPE_vkCmdDrawIndirect_EXT: return "vkCmdDrawIndirect"; case VK_COMMAND_TYPE_vkCmdDrawIndexedIndirect_EXT: return "vkCmdDrawIndexedIndirect"; case VK_COMMAND_TYPE_vkCmdDispatch_EXT: return "vkCmdDispatch"; @@ -188,6 +190,7 @@ static inline const char *vn_dispatch_command_name(VkCommandTypeEXT type) case VK_COMMAND_TYPE_vkGetPhysicalDeviceQueueFamilyProperties2_EXT: return "vkGetPhysicalDeviceQueueFamilyProperties2"; case VK_COMMAND_TYPE_vkGetPhysicalDeviceMemoryProperties2_EXT: return "vkGetPhysicalDeviceMemoryProperties2"; case VK_COMMAND_TYPE_vkGetPhysicalDeviceSparseImageFormatProperties2_EXT: return "vkGetPhysicalDeviceSparseImageFormatProperties2"; + case VK_COMMAND_TYPE_vkCmdPushDescriptorSetKHR_EXT: return "vkCmdPushDescriptorSetKHR"; case VK_COMMAND_TYPE_vkTrimCommandPool_EXT: return "vkTrimCommandPool"; case VK_COMMAND_TYPE_vkGetPhysicalDeviceExternalBufferProperties_EXT: return "vkGetPhysicalDeviceExternalBufferProperties"; case VK_COMMAND_TYPE_vkGetPhysicalDeviceExternalSemaphoreProperties_EXT: return "vkGetPhysicalDeviceExternalSemaphoreProperties"; @@ -276,20 +279,26 @@ static inline const char *vn_dispatch_command_name(VkCommandTypeEXT type) case VK_COMMAND_TYPE_vkNotifyRingMESA_EXT: return "vkNotifyRingMESA"; case VK_COMMAND_TYPE_vkWriteRingExtraMESA_EXT: return "vkWriteRingExtraMESA"; case VK_COMMAND_TYPE_vkGetMemoryResourcePropertiesMESA_EXT: return "vkGetMemoryResourcePropertiesMESA"; + case VK_COMMAND_TYPE_vkResetFenceResource100000MESA_EXT: return "vkResetFenceResource100000MESA"; + case VK_COMMAND_TYPE_vkWaitSemaphoreResource100000MESA_EXT: return "vkWaitSemaphoreResource100000MESA"; + case VK_COMMAND_TYPE_vkImportSemaphoreResource100000MESA_EXT: return "vkImportSemaphoreResource100000MESA"; case VK_COMMAND_TYPE_vkGetVenusExperimentalFeatureData100000MESA_EXT: return "vkGetVenusExperimentalFeatureData100000MESA"; case VK_COMMAND_TYPE_vkGetDeviceProcAddr_EXT: return "vkGetDeviceProcAddr"; case VK_COMMAND_TYPE_vkGetInstanceProcAddr_EXT: return "vkGetInstanceProcAddr"; case VK_COMMAND_TYPE_vkMapMemory_EXT: return "vkMapMemory"; case VK_COMMAND_TYPE_vkGetMemoryFdKHR_EXT: return "vkGetMemoryFdKHR"; case VK_COMMAND_TYPE_vkGetMemoryFdPropertiesKHR_EXT: return "vkGetMemoryFdPropertiesKHR"; + case VK_COMMAND_TYPE_vkGetSemaphoreFdKHR_EXT: return "vkGetSemaphoreFdKHR"; + case VK_COMMAND_TYPE_vkImportSemaphoreFdKHR_EXT: return "vkImportSemaphoreFdKHR"; case VK_COMMAND_TYPE_vkGetFenceFdKHR_EXT: return "vkGetFenceFdKHR"; case VK_COMMAND_TYPE_vkImportFenceFdKHR_EXT: return "vkImportFenceFdKHR"; case VK_COMMAND_TYPE_vkUpdateDescriptorSetWithTemplate_EXT: return "vkUpdateDescriptorSetWithTemplate"; + case VK_COMMAND_TYPE_vkCmdPushDescriptorSetWithTemplateKHR_EXT: return "vkCmdPushDescriptorSetWithTemplateKHR"; default: return "unknown"; } } -static void (*const vn_dispatch_table[242])(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) = { +static void (*const vn_dispatch_table[251])(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) = { [VK_COMMAND_TYPE_vkCreateInstance_EXT] = vn_dispatch_vkCreateInstance, [VK_COMMAND_TYPE_vkDestroyInstance_EXT] = vn_dispatch_vkDestroyInstance, [VK_COMMAND_TYPE_vkEnumeratePhysicalDevices_EXT] = vn_dispatch_vkEnumeratePhysicalDevices, @@ -397,6 +406,8 @@ static void (*const vn_dispatch_table[242])(struct vn_dispatch_context *ctx, VkC [VK_COMMAND_TYPE_vkCmdBindVertexBuffers_EXT] = vn_dispatch_vkCmdBindVertexBuffers, [VK_COMMAND_TYPE_vkCmdDraw_EXT] = vn_dispatch_vkCmdDraw, [VK_COMMAND_TYPE_vkCmdDrawIndexed_EXT] = vn_dispatch_vkCmdDrawIndexed, + [VK_COMMAND_TYPE_vkCmdDrawMultiEXT_EXT] = vn_dispatch_vkCmdDrawMultiEXT, + [VK_COMMAND_TYPE_vkCmdDrawMultiIndexedEXT_EXT] = vn_dispatch_vkCmdDrawMultiIndexedEXT, [VK_COMMAND_TYPE_vkCmdDrawIndirect_EXT] = vn_dispatch_vkCmdDrawIndirect, [VK_COMMAND_TYPE_vkCmdDrawIndexedIndirect_EXT] = vn_dispatch_vkCmdDrawIndexedIndirect, [VK_COMMAND_TYPE_vkCmdDispatch_EXT] = vn_dispatch_vkCmdDispatch, @@ -435,6 +446,7 @@ static void (*const vn_dispatch_table[242])(struct vn_dispatch_context *ctx, VkC [VK_COMMAND_TYPE_vkGetPhysicalDeviceQueueFamilyProperties2_EXT] = vn_dispatch_vkGetPhysicalDeviceQueueFamilyProperties2, [VK_COMMAND_TYPE_vkGetPhysicalDeviceMemoryProperties2_EXT] = vn_dispatch_vkGetPhysicalDeviceMemoryProperties2, [VK_COMMAND_TYPE_vkGetPhysicalDeviceSparseImageFormatProperties2_EXT] = vn_dispatch_vkGetPhysicalDeviceSparseImageFormatProperties2, + [VK_COMMAND_TYPE_vkCmdPushDescriptorSetKHR_EXT] = vn_dispatch_vkCmdPushDescriptorSetKHR, [VK_COMMAND_TYPE_vkTrimCommandPool_EXT] = vn_dispatch_vkTrimCommandPool, [VK_COMMAND_TYPE_vkGetPhysicalDeviceExternalBufferProperties_EXT] = vn_dispatch_vkGetPhysicalDeviceExternalBufferProperties, [VK_COMMAND_TYPE_vkGetPhysicalDeviceExternalSemaphoreProperties_EXT] = vn_dispatch_vkGetPhysicalDeviceExternalSemaphoreProperties, @@ -523,6 +535,9 @@ static void (*const vn_dispatch_table[242])(struct vn_dispatch_context *ctx, VkC [VK_COMMAND_TYPE_vkNotifyRingMESA_EXT] = vn_dispatch_vkNotifyRingMESA, [VK_COMMAND_TYPE_vkWriteRingExtraMESA_EXT] = vn_dispatch_vkWriteRingExtraMESA, [VK_COMMAND_TYPE_vkGetMemoryResourcePropertiesMESA_EXT] = vn_dispatch_vkGetMemoryResourcePropertiesMESA, + [VK_COMMAND_TYPE_vkResetFenceResource100000MESA_EXT] = vn_dispatch_vkResetFenceResource100000MESA, + [VK_COMMAND_TYPE_vkWaitSemaphoreResource100000MESA_EXT] = vn_dispatch_vkWaitSemaphoreResource100000MESA, + [VK_COMMAND_TYPE_vkImportSemaphoreResource100000MESA_EXT] = vn_dispatch_vkImportSemaphoreResource100000MESA, [VK_COMMAND_TYPE_vkGetVenusExperimentalFeatureData100000MESA_EXT] = vn_dispatch_vkGetVenusExperimentalFeatureData100000MESA, }; @@ -538,7 +553,7 @@ static inline void vn_dispatch_command(struct vn_dispatch_context *ctx) #ifdef DEBUG TRACE_SCOPE_SLOW(vn_dispatch_command_name(cmd_type)); #endif - if (cmd_type < 242 && vn_dispatch_table[cmd_type]) + if (cmd_type < 251 && vn_dispatch_table[cmd_type]) vn_dispatch_table[cmd_type](ctx, cmd_flags); else vn_cs_decoder_set_fatal(ctx->decoder); diff --git a/src/venus/venus-protocol/vn_protocol_renderer_fence.h b/src/venus/venus-protocol/vn_protocol_renderer_fence.h index e4cfac5d..6677bef7 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_fence.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_fence.h @@ -18,6 +18,7 @@ * These structs/unions/commands are not included * * vkGetFenceFdKHR + * vkImportFenceFdKHR */ /* struct VkExportFenceCreateInfo chain */ @@ -330,6 +331,26 @@ static inline void vn_encode_vkWaitForFences_reply(struct vn_cs_encoder *enc, co /* skip args->timeout */ } +static inline void vn_decode_vkResetFenceResource100000MESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkResetFenceResource100000MESA *args) +{ + vn_decode_VkDevice_lookup(dec, &args->device); + vn_decode_VkFence_lookup(dec, &args->fence); +} + +static inline void vn_replace_vkResetFenceResource100000MESA_args_handle(struct vn_command_vkResetFenceResource100000MESA *args) +{ + vn_replace_VkDevice_handle(&args->device); + vn_replace_VkFence_handle(&args->fence); +} + +static inline void vn_encode_vkResetFenceResource100000MESA_reply(struct vn_cs_encoder *enc, const struct vn_command_vkResetFenceResource100000MESA *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkResetFenceResource100000MESA_EXT}); + + /* skip args->device */ + /* skip args->fence */ +} + static inline void vn_dispatch_vkCreateFence(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkCreateFence args; @@ -471,6 +492,31 @@ static inline void vn_dispatch_vkWaitForFences(struct vn_dispatch_context *ctx, vn_cs_decoder_reset_temp_pool(ctx->decoder); } +static inline void vn_dispatch_vkResetFenceResource100000MESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkResetFenceResource100000MESA args; + + if (!ctx->dispatch_vkResetFenceResource100000MESA) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkResetFenceResource100000MESA_args_temp(ctx->decoder, &args); + if (!args.device) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkResetFenceResource100000MESA(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkResetFenceResource100000MESA_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + #pragma GCC diagnostic pop #endif /* VN_PROTOCOL_RENDERER_FENCE_H */ diff --git a/src/venus/venus-protocol/vn_protocol_renderer_handles.h b/src/venus/venus-protocol/vn_protocol_renderer_handles.h index f0b9b311..e0beea18 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_handles.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_handles.h @@ -26,7 +26,7 @@ vn_decode_VkInstance_temp(struct vn_cs_decoder *dec, VkInstance *val) vn_decode_uint64_t(dec, &id); if (vn_cs_handle_indirect_id(VK_OBJECT_TYPE_INSTANCE)) { *val = vn_cs_decoder_alloc_temp(dec, sizeof(vn_object_id)); - if (!val) + if (!*val) return; } vn_cs_handle_store_id((void **)val, id, VK_OBJECT_TYPE_INSTANCE); @@ -62,7 +62,7 @@ vn_decode_VkPhysicalDevice_temp(struct vn_cs_decoder *dec, VkPhysicalDevice *val vn_decode_uint64_t(dec, &id); if (vn_cs_handle_indirect_id(VK_OBJECT_TYPE_PHYSICAL_DEVICE)) { *val = vn_cs_decoder_alloc_temp(dec, sizeof(vn_object_id)); - if (!val) + if (!*val) return; } vn_cs_handle_store_id((void **)val, id, VK_OBJECT_TYPE_PHYSICAL_DEVICE); @@ -98,7 +98,7 @@ vn_decode_VkDevice_temp(struct vn_cs_decoder *dec, VkDevice *val) vn_decode_uint64_t(dec, &id); if (vn_cs_handle_indirect_id(VK_OBJECT_TYPE_DEVICE)) { *val = vn_cs_decoder_alloc_temp(dec, sizeof(vn_object_id)); - if (!val) + if (!*val) return; } vn_cs_handle_store_id((void **)val, id, VK_OBJECT_TYPE_DEVICE); @@ -134,7 +134,7 @@ vn_decode_VkQueue_temp(struct vn_cs_decoder *dec, VkQueue *val) vn_decode_uint64_t(dec, &id); if (vn_cs_handle_indirect_id(VK_OBJECT_TYPE_QUEUE)) { *val = vn_cs_decoder_alloc_temp(dec, sizeof(vn_object_id)); - if (!val) + if (!*val) return; } vn_cs_handle_store_id((void **)val, id, VK_OBJECT_TYPE_QUEUE); @@ -170,7 +170,7 @@ vn_decode_VkCommandBuffer_temp(struct vn_cs_decoder *dec, VkCommandBuffer *val) vn_decode_uint64_t(dec, &id); if (vn_cs_handle_indirect_id(VK_OBJECT_TYPE_COMMAND_BUFFER)) { *val = vn_cs_decoder_alloc_temp(dec, sizeof(vn_object_id)); - if (!val) + if (!*val) return; } vn_cs_handle_store_id((void **)val, id, VK_OBJECT_TYPE_COMMAND_BUFFER); diff --git a/src/venus/venus-protocol/vn_protocol_renderer_info.h b/src/venus/venus-protocol/vn_protocol_renderer_info.h index f319c310..9ccccef7 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_info.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_info.h @@ -12,7 +12,7 @@ struct vn_info_extension_table { union { - bool enabled[90]; + bool enabled[99]; struct { bool EXT_4444_formats; bool EXT_calibrated_timestamps; @@ -20,6 +20,7 @@ struct vn_info_extension_table { bool EXT_conditional_rendering; bool EXT_conservative_rasterization; bool EXT_custom_border_color; + bool EXT_depth_clip_control; bool EXT_depth_clip_enable; bool EXT_descriptor_indexing; bool EXT_extended_dynamic_state; @@ -32,8 +33,13 @@ struct vn_info_extension_table { bool EXT_index_type_uint8; bool EXT_inline_uniform_block; bool EXT_line_rasterization; + bool EXT_multi_draw; + bool EXT_mutable_descriptor_type; + bool EXT_pci_bus_info; bool EXT_pipeline_creation_cache_control; bool EXT_pipeline_creation_feedback; + bool EXT_primitive_topology_list_restart; + bool EXT_primitives_generated_query; bool EXT_private_data; bool EXT_provoking_vertex; bool EXT_queue_family_foreign; @@ -73,6 +79,7 @@ struct vn_info_extension_table { bool KHR_external_memory_fd; bool KHR_external_semaphore; bool KHR_external_semaphore_capabilities; + bool KHR_external_semaphore_fd; bool KHR_format_feature_flags2; bool KHR_get_memory_requirements2; bool KHR_get_physical_device_properties2; @@ -83,6 +90,7 @@ struct vn_info_extension_table { bool KHR_maintenance3; bool KHR_maintenance4; bool KHR_multiview; + bool KHR_push_descriptor; bool KHR_relaxed_block_layout; bool KHR_sampler_mirror_clamp_to_edge; bool KHR_sampler_ycbcr_conversion; @@ -104,11 +112,12 @@ struct vn_info_extension_table { bool KHR_vulkan_memory_model; bool KHR_zero_initialize_workgroup_memory; bool MESA_venus_protocol; + bool VALVE_mutable_descriptor_type; }; }; }; -#define VN_INFO_EXTENSION_MAX_NUMBER (414) +#define VN_INFO_EXTENSION_MAX_NUMBER (495) struct vn_info_extension { const char *name; @@ -117,14 +126,15 @@ struct vn_info_extension { }; /* sorted by extension names for bsearch */ -static const uint32_t _vn_info_extension_count = 90; -static const struct vn_info_extension _vn_info_extensions[90] = { +static const uint32_t _vn_info_extension_count = 99; +static const struct vn_info_extension _vn_info_extensions[99] = { { "VK_EXT_4444_formats", 341, 1 }, { "VK_EXT_calibrated_timestamps", 185, 2 }, { "VK_EXT_command_serialization", 384, 0 }, { "VK_EXT_conditional_rendering", 82, 2 }, { "VK_EXT_conservative_rasterization", 102, 1 }, { "VK_EXT_custom_border_color", 288, 12 }, + { "VK_EXT_depth_clip_control", 356, 1 }, { "VK_EXT_depth_clip_enable", 103, 1 }, { "VK_EXT_descriptor_indexing", 162, 2 }, { "VK_EXT_extended_dynamic_state", 268, 1 }, @@ -137,8 +147,13 @@ static const struct vn_info_extension _vn_info_extensions[90] = { { "VK_EXT_index_type_uint8", 266, 1 }, { "VK_EXT_inline_uniform_block", 139, 1 }, { "VK_EXT_line_rasterization", 260, 1 }, + { "VK_EXT_multi_draw", 393, 1 }, + { "VK_EXT_mutable_descriptor_type", 495, 1 }, + { "VK_EXT_pci_bus_info", 213, 2 }, { "VK_EXT_pipeline_creation_cache_control", 298, 3 }, { "VK_EXT_pipeline_creation_feedback", 193, 1 }, + { "VK_EXT_primitive_topology_list_restart", 357, 1 }, + { "VK_EXT_primitives_generated_query", 383, 1 }, { "VK_EXT_private_data", 296, 1 }, { "VK_EXT_provoking_vertex", 255, 1 }, { "VK_EXT_queue_family_foreign", 127, 1 }, @@ -178,7 +193,8 @@ static const struct vn_info_extension _vn_info_extensions[90] = { { "VK_KHR_external_memory_fd", 75, 1 }, { "VK_KHR_external_semaphore", 78, 1 }, { "VK_KHR_external_semaphore_capabilities", 77, 1 }, - { "VK_KHR_format_feature_flags2", 361, 1 }, + { "VK_KHR_external_semaphore_fd", 80, 1 }, + { "VK_KHR_format_feature_flags2", 361, 2 }, { "VK_KHR_get_memory_requirements2", 147, 1 }, { "VK_KHR_get_physical_device_properties2", 60, 2 }, { "VK_KHR_image_format_list", 148, 1 }, @@ -188,6 +204,7 @@ static const struct vn_info_extension _vn_info_extensions[90] = { { "VK_KHR_maintenance3", 169, 1 }, { "VK_KHR_maintenance4", 414, 2 }, { "VK_KHR_multiview", 54, 1 }, + { "VK_KHR_push_descriptor", 81, 2 }, { "VK_KHR_relaxed_block_layout", 145, 1 }, { "VK_KHR_sampler_mirror_clamp_to_edge", 15, 3 }, { "VK_KHR_sampler_ycbcr_conversion", 157, 14 }, @@ -209,6 +226,7 @@ static const struct vn_info_extension _vn_info_extensions[90] = { { "VK_KHR_vulkan_memory_model", 212, 3 }, { "VK_KHR_zero_initialize_workgroup_memory", 326, 1 }, { "VK_MESA_venus_protocol", 385, 100000 }, + { "VK_VALVE_mutable_descriptor_type", 352, 1 }, }; static inline uint32_t @@ -220,7 +238,7 @@ vn_info_wire_format_version(void) static inline uint32_t vn_info_vk_xml_version(void) { - return VK_MAKE_API_VERSION(0, 1, 3, 204); + return VK_MAKE_API_VERSION(0, 1, 3, 228); } static inline int diff --git a/src/venus/venus-protocol/vn_protocol_renderer_pipeline.h b/src/venus/venus-protocol/vn_protocol_renderer_pipeline.h index 8701dafe..554e5e53 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_pipeline.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_pipeline.h @@ -142,6 +142,14 @@ vn_decode_VkPipelineShaderStageCreateInfo_pnext_temp(struct vn_cs_decoder *dec) vn_decode_VkStructureType(dec, &stype); switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkShaderModuleCreateInfo)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPipelineShaderStageCreateInfo_pnext_temp(dec); + vn_decode_VkShaderModuleCreateInfo_self_temp(dec, (VkShaderModuleCreateInfo *)pnext); + } + break; case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO: pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPipelineShaderStageRequiredSubgroupSizeCreateInfo)); if (pnext) { @@ -221,6 +229,9 @@ vn_replace_VkPipelineShaderStageCreateInfo_handle(VkPipelineShaderStageCreateInf case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO: vn_replace_VkPipelineShaderStageCreateInfo_handle_self((VkPipelineShaderStageCreateInfo *)pnext); break; + case VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO: + vn_replace_VkShaderModuleCreateInfo_handle_self((VkShaderModuleCreateInfo *)pnext); + break; case VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_REQUIRED_SUBGROUP_SIZE_CREATE_INFO: vn_replace_VkPipelineShaderStageRequiredSubgroupSizeCreateInfo_handle_self((VkPipelineShaderStageRequiredSubgroupSizeCreateInfo *)pnext); break; @@ -669,10 +680,10 @@ vn_replace_VkPipelineTessellationStateCreateInfo_handle(VkPipelineTessellationSt } while (pnext); } -/* struct VkPipelineViewportStateCreateInfo chain */ +/* struct VkPipelineViewportDepthClipControlCreateInfoEXT chain */ static inline void * -vn_decode_VkPipelineViewportStateCreateInfo_pnext_temp(struct vn_cs_decoder *dec) +vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_pnext_temp(struct vn_cs_decoder *dec) { /* no known/supported struct */ if (vn_decode_simple_pointer(dec)) @@ -681,6 +692,83 @@ vn_decode_VkPipelineViewportStateCreateInfo_pnext_temp(struct vn_cs_decoder *dec } static inline void +vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_self_temp(struct vn_cs_decoder *dec, VkPipelineViewportDepthClipControlCreateInfoEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkBool32(dec, &val->negativeOneToOne); +} + +static inline void +vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_temp(struct vn_cs_decoder *dec, VkPipelineViewportDepthClipControlCreateInfoEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_pnext_temp(dec); + vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_self_temp(dec, val); +} + +static inline void +vn_replace_VkPipelineViewportDepthClipControlCreateInfoEXT_handle_self(VkPipelineViewportDepthClipControlCreateInfoEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->negativeOneToOne */ +} + +static inline void +vn_replace_VkPipelineViewportDepthClipControlCreateInfoEXT_handle(VkPipelineViewportDepthClipControlCreateInfoEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT: + vn_replace_VkPipelineViewportDepthClipControlCreateInfoEXT_handle_self((VkPipelineViewportDepthClipControlCreateInfoEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + +/* struct VkPipelineViewportStateCreateInfo chain */ + +static inline void * +vn_decode_VkPipelineViewportStateCreateInfo_pnext_temp(struct vn_cs_decoder *dec) +{ + VkBaseOutStructure *pnext; + VkStructureType stype; + + if (!vn_decode_simple_pointer(dec)) + return NULL; + + vn_decode_VkStructureType(dec, &stype); + switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkPipelineViewportDepthClipControlCreateInfoEXT)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkPipelineViewportStateCreateInfo_pnext_temp(dec); + vn_decode_VkPipelineViewportDepthClipControlCreateInfoEXT_self_temp(dec, (VkPipelineViewportDepthClipControlCreateInfoEXT *)pnext); + } + break; + default: + /* unexpected struct */ + pnext = NULL; + vn_cs_decoder_set_fatal(dec); + break; + } + + return pnext; +} + +static inline void vn_decode_VkPipelineViewportStateCreateInfo_self_temp(struct vn_cs_decoder *dec, VkPipelineViewportStateCreateInfo *val) { /* skip val->{sType,pNext} */ @@ -750,6 +838,9 @@ vn_replace_VkPipelineViewportStateCreateInfo_handle(VkPipelineViewportStateCreat case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO: vn_replace_VkPipelineViewportStateCreateInfo_handle_self((VkPipelineViewportStateCreateInfo *)pnext); break; + case VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_DEPTH_CLIP_CONTROL_CREATE_INFO_EXT: + vn_replace_VkPipelineViewportDepthClipControlCreateInfoEXT_handle_self((VkPipelineViewportDepthClipControlCreateInfoEXT *)pnext); + break; default: /* ignore unknown/unsupported struct */ break; @@ -1678,7 +1769,7 @@ vn_decode_VkPipelineRenderingCreateInfo_self_temp(struct vn_cs_decoder *dec, VkP if (!val->pColorAttachmentFormats) return; vn_decode_VkFormat_array(dec, (VkFormat *)val->pColorAttachmentFormats, array_size); } else { - vn_decode_array_size(dec, val->colorAttachmentCount); + vn_decode_array_size_unchecked(dec); val->pColorAttachmentFormats = NULL; } vn_decode_VkFormat(dec, &val->depthAttachmentFormat); @@ -1780,7 +1871,7 @@ vn_decode_VkGraphicsPipelineCreateInfo_self_temp(struct vn_cs_decoder *dec, VkGr for (uint32_t i = 0; i < iter_count; i++) vn_decode_VkPipelineShaderStageCreateInfo_temp(dec, &((VkPipelineShaderStageCreateInfo *)val->pStages)[i]); } else { - vn_decode_array_size(dec, val->stageCount); + vn_decode_array_size_unchecked(dec); val->pStages = NULL; } if (vn_decode_simple_pointer(dec)) { @@ -1817,7 +1908,6 @@ vn_decode_VkGraphicsPipelineCreateInfo_self_temp(struct vn_cs_decoder *dec, VkGr vn_decode_VkPipelineRasterizationStateCreateInfo_temp(dec, (VkPipelineRasterizationStateCreateInfo *)val->pRasterizationState); } else { val->pRasterizationState = NULL; - vn_cs_decoder_set_fatal(dec); } if (vn_decode_simple_pointer(dec)) { val->pMultisampleState = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pMultisampleState)); diff --git a/src/venus/venus-protocol/vn_protocol_renderer_semaphore.h b/src/venus/venus-protocol/vn_protocol_renderer_semaphore.h index f3cb5a1a..bded7e62 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_semaphore.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_semaphore.h @@ -14,6 +14,13 @@ #pragma GCC diagnostic ignored "-Wpointer-arith" #pragma GCC diagnostic ignored "-Wunused-parameter" +/* + * These structs/unions/commands are not included + * + * vkGetSemaphoreFdKHR + * vkImportSemaphoreFdKHR + */ + /* struct VkExportSemaphoreCreateInfo chain */ static inline void * @@ -304,6 +311,65 @@ vn_replace_VkSemaphoreSignalInfo_handle(VkSemaphoreSignalInfo *val) } while (pnext); } +/* struct VkImportSemaphoreResourceInfo100000MESA chain */ + +static inline void * +vn_decode_VkImportSemaphoreResourceInfo100000MESA_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkImportSemaphoreResourceInfo100000MESA_self_temp(struct vn_cs_decoder *dec, VkImportSemaphoreResourceInfo100000MESA *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkSemaphore_lookup(dec, &val->semaphore); + vn_decode_uint32_t(dec, &val->resourceId); +} + +static inline void +vn_decode_VkImportSemaphoreResourceInfo100000MESA_temp(struct vn_cs_decoder *dec, VkImportSemaphoreResourceInfo100000MESA *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_RESOURCE_INFO_100000_MESA) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkImportSemaphoreResourceInfo100000MESA_pnext_temp(dec); + vn_decode_VkImportSemaphoreResourceInfo100000MESA_self_temp(dec, val); +} + +static inline void +vn_replace_VkImportSemaphoreResourceInfo100000MESA_handle_self(VkImportSemaphoreResourceInfo100000MESA *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + vn_replace_VkSemaphore_handle(&val->semaphore); + /* skip val->resourceId */ +} + +static inline void +vn_replace_VkImportSemaphoreResourceInfo100000MESA_handle(VkImportSemaphoreResourceInfo100000MESA *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_RESOURCE_INFO_100000_MESA: + vn_replace_VkImportSemaphoreResourceInfo100000MESA_handle_self((VkImportSemaphoreResourceInfo100000MESA *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + static inline void vn_decode_vkCreateSemaphore_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCreateSemaphore *args) { vn_decode_VkDevice_lookup(dec, &args->device); @@ -470,6 +536,54 @@ static inline void vn_encode_vkSignalSemaphore_reply(struct vn_cs_encoder *enc, /* skip args->pSignalInfo */ } +static inline void vn_decode_vkWaitSemaphoreResource100000MESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkWaitSemaphoreResource100000MESA *args) +{ + vn_decode_VkDevice_lookup(dec, &args->device); + vn_decode_VkSemaphore_lookup(dec, &args->semaphore); +} + +static inline void vn_replace_vkWaitSemaphoreResource100000MESA_args_handle(struct vn_command_vkWaitSemaphoreResource100000MESA *args) +{ + vn_replace_VkDevice_handle(&args->device); + vn_replace_VkSemaphore_handle(&args->semaphore); +} + +static inline void vn_encode_vkWaitSemaphoreResource100000MESA_reply(struct vn_cs_encoder *enc, const struct vn_command_vkWaitSemaphoreResource100000MESA *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkWaitSemaphoreResource100000MESA_EXT}); + + /* skip args->device */ + /* skip args->semaphore */ +} + +static inline void vn_decode_vkImportSemaphoreResource100000MESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkImportSemaphoreResource100000MESA *args) +{ + vn_decode_VkDevice_lookup(dec, &args->device); + if (vn_decode_simple_pointer(dec)) { + args->pImportSemaphoreResourceInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pImportSemaphoreResourceInfo)); + if (!args->pImportSemaphoreResourceInfo) return; + vn_decode_VkImportSemaphoreResourceInfo100000MESA_temp(dec, (VkImportSemaphoreResourceInfo100000MESA *)args->pImportSemaphoreResourceInfo); + } else { + args->pImportSemaphoreResourceInfo = NULL; + vn_cs_decoder_set_fatal(dec); + } +} + +static inline void vn_replace_vkImportSemaphoreResource100000MESA_args_handle(struct vn_command_vkImportSemaphoreResource100000MESA *args) +{ + vn_replace_VkDevice_handle(&args->device); + if (args->pImportSemaphoreResourceInfo) + vn_replace_VkImportSemaphoreResourceInfo100000MESA_handle((VkImportSemaphoreResourceInfo100000MESA *)args->pImportSemaphoreResourceInfo); +} + +static inline void vn_encode_vkImportSemaphoreResource100000MESA_reply(struct vn_cs_encoder *enc, const struct vn_command_vkImportSemaphoreResource100000MESA *args) +{ + vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkImportSemaphoreResource100000MESA_EXT}); + + /* skip args->device */ + /* skip args->pImportSemaphoreResourceInfo */ +} + static inline void vn_dispatch_vkCreateSemaphore(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkCreateSemaphore args; @@ -611,6 +725,56 @@ static inline void vn_dispatch_vkSignalSemaphore(struct vn_dispatch_context *ctx vn_cs_decoder_reset_temp_pool(ctx->decoder); } +static inline void vn_dispatch_vkWaitSemaphoreResource100000MESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkWaitSemaphoreResource100000MESA args; + + if (!ctx->dispatch_vkWaitSemaphoreResource100000MESA) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkWaitSemaphoreResource100000MESA_args_temp(ctx->decoder, &args); + if (!args.device) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkWaitSemaphoreResource100000MESA(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkWaitSemaphoreResource100000MESA_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + +static inline void vn_dispatch_vkImportSemaphoreResource100000MESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) +{ + struct vn_command_vkImportSemaphoreResource100000MESA args; + + if (!ctx->dispatch_vkImportSemaphoreResource100000MESA) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + vn_decode_vkImportSemaphoreResource100000MESA_args_temp(ctx->decoder, &args); + if (!args.device) { + vn_cs_decoder_set_fatal(ctx->decoder); + return; + } + + if (!vn_cs_decoder_get_fatal(ctx->decoder)) + ctx->dispatch_vkImportSemaphoreResource100000MESA(ctx, &args); + + + if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) + vn_encode_vkImportSemaphoreResource100000MESA_reply(ctx->encoder, &args); + + vn_cs_decoder_reset_temp_pool(ctx->decoder); +} + #pragma GCC diagnostic pop #endif /* VN_PROTOCOL_RENDERER_SEMAPHORE_H */ diff --git a/src/venus/venus-protocol/vn_protocol_renderer_shader_module.h b/src/venus/venus-protocol/vn_protocol_renderer_shader_module.h index e83a2754..81006b64 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_shader_module.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_shader_module.h @@ -14,75 +14,6 @@ #pragma GCC diagnostic ignored "-Wpointer-arith" #pragma GCC diagnostic ignored "-Wunused-parameter" -/* struct VkShaderModuleCreateInfo chain */ - -static inline void * -vn_decode_VkShaderModuleCreateInfo_pnext_temp(struct vn_cs_decoder *dec) -{ - /* no known/supported struct */ - if (vn_decode_simple_pointer(dec)) - vn_cs_decoder_set_fatal(dec); - return NULL; -} - -static inline void -vn_decode_VkShaderModuleCreateInfo_self_temp(struct vn_cs_decoder *dec, VkShaderModuleCreateInfo *val) -{ - /* skip val->{sType,pNext} */ - vn_decode_VkFlags(dec, &val->flags); - vn_decode_size_t(dec, &val->codeSize); - if (vn_peek_array_size(dec)) { - const size_t array_size = vn_decode_array_size(dec, val->codeSize / 4); - val->pCode = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pCode) * array_size); - if (!val->pCode) return; - vn_decode_uint32_t_array(dec, (uint32_t *)val->pCode, array_size); - } else { - vn_decode_array_size(dec, val->codeSize / 4); - val->pCode = NULL; - } -} - -static inline void -vn_decode_VkShaderModuleCreateInfo_temp(struct vn_cs_decoder *dec, VkShaderModuleCreateInfo *val) -{ - VkStructureType stype; - vn_decode_VkStructureType(dec, &stype); - if (stype != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) - vn_cs_decoder_set_fatal(dec); - - val->sType = stype; - val->pNext = vn_decode_VkShaderModuleCreateInfo_pnext_temp(dec); - vn_decode_VkShaderModuleCreateInfo_self_temp(dec, val); -} - -static inline void -vn_replace_VkShaderModuleCreateInfo_handle_self(VkShaderModuleCreateInfo *val) -{ - /* skip val->sType */ - /* skip val->pNext */ - /* skip val->flags */ - /* skip val->codeSize */ - /* skip val->pCode */ -} - -static inline void -vn_replace_VkShaderModuleCreateInfo_handle(VkShaderModuleCreateInfo *val) -{ - struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; - - do { - switch ((int32_t)pnext->sType) { - case VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO: - vn_replace_VkShaderModuleCreateInfo_handle_self((VkShaderModuleCreateInfo *)pnext); - break; - default: - /* ignore unknown/unsupported struct */ - break; - } - pnext = pnext->pNext; - } while (pnext); -} - static inline void vn_decode_vkCreateShaderModule_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkCreateShaderModule *args) { vn_decode_VkDevice_lookup(dec, &args->device); diff --git a/src/venus/venus-protocol/vn_protocol_renderer_structs.h b/src/venus/venus-protocol/vn_protocol_renderer_structs.h index 99f978be..21d22c2f 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_structs.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_structs.h @@ -482,6 +482,75 @@ vn_replace_VkSamplerYcbcrConversionInfo_handle(VkSamplerYcbcrConversionInfo *val } while (pnext); } +/* struct VkShaderModuleCreateInfo chain */ + +static inline void * +vn_decode_VkShaderModuleCreateInfo_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkShaderModuleCreateInfo_self_temp(struct vn_cs_decoder *dec, VkShaderModuleCreateInfo *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkFlags(dec, &val->flags); + vn_decode_size_t(dec, &val->codeSize); + if (vn_peek_array_size(dec)) { + const size_t array_size = vn_decode_array_size(dec, val->codeSize / 4); + val->pCode = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pCode) * array_size); + if (!val->pCode) return; + vn_decode_uint32_t_array(dec, (uint32_t *)val->pCode, array_size); + } else { + vn_decode_array_size(dec, val->codeSize / 4); + val->pCode = NULL; + } +} + +static inline void +vn_decode_VkShaderModuleCreateInfo_temp(struct vn_cs_decoder *dec, VkShaderModuleCreateInfo *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkShaderModuleCreateInfo_pnext_temp(dec); + vn_decode_VkShaderModuleCreateInfo_self_temp(dec, val); +} + +static inline void +vn_replace_VkShaderModuleCreateInfo_handle_self(VkShaderModuleCreateInfo *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->flags */ + /* skip val->codeSize */ + /* skip val->pCode */ +} + +static inline void +vn_replace_VkShaderModuleCreateInfo_handle(VkShaderModuleCreateInfo *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO: + vn_replace_VkShaderModuleCreateInfo_handle_self((VkShaderModuleCreateInfo *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + /* struct VkViewport */ static inline void @@ -606,26 +675,354 @@ vn_decode_VkClearColorValue_temp(struct vn_cs_decoder *dec, VkClearColorValue *v switch (tag) { case 0: { - const size_t array_size = vn_decode_array_size(dec, 4); - vn_decode_float_array(dec, val->float32, array_size); - } + const size_t array_size = vn_decode_array_size(dec, 4); + vn_decode_float_array(dec, val->float32, array_size); + } break; case 1: { - const size_t array_size = vn_decode_array_size(dec, 4); - vn_decode_int32_t_array(dec, val->int32, array_size); - } + const size_t array_size = vn_decode_array_size(dec, 4); + vn_decode_int32_t_array(dec, val->int32, array_size); + } break; case 2: { - const size_t array_size = vn_decode_array_size(dec, 4); - vn_decode_uint32_t_array(dec, val->uint32, array_size); + const size_t array_size = vn_decode_array_size(dec, 4); + vn_decode_uint32_t_array(dec, val->uint32, array_size); + } + break; + default: + vn_cs_decoder_set_fatal(dec); + break; + } +} + +/* struct VkMutableDescriptorTypeListEXT */ + +static inline void +vn_decode_VkMutableDescriptorTypeListEXT_temp(struct vn_cs_decoder *dec, VkMutableDescriptorTypeListEXT *val) +{ + vn_decode_uint32_t(dec, &val->descriptorTypeCount); + if (vn_peek_array_size(dec)) { + const size_t array_size = vn_decode_array_size(dec, val->descriptorTypeCount); + val->pDescriptorTypes = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pDescriptorTypes) * array_size); + if (!val->pDescriptorTypes) return; + vn_decode_VkDescriptorType_array(dec, (VkDescriptorType *)val->pDescriptorTypes, array_size); + } else { + vn_decode_array_size(dec, val->descriptorTypeCount); + val->pDescriptorTypes = NULL; + } +} + +static inline void +vn_replace_VkMutableDescriptorTypeListEXT_handle(VkMutableDescriptorTypeListEXT *val) +{ + /* skip val->descriptorTypeCount */ + /* skip val->pDescriptorTypes */ +} + +/* struct VkMutableDescriptorTypeCreateInfoEXT chain */ + +static inline void * +vn_decode_VkMutableDescriptorTypeCreateInfoEXT_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkMutableDescriptorTypeCreateInfoEXT_self_temp(struct vn_cs_decoder *dec, VkMutableDescriptorTypeCreateInfoEXT *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_uint32_t(dec, &val->mutableDescriptorTypeListCount); + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, val->mutableDescriptorTypeListCount); + val->pMutableDescriptorTypeLists = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pMutableDescriptorTypeLists) * iter_count); + if (!val->pMutableDescriptorTypeLists) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkMutableDescriptorTypeListEXT_temp(dec, &((VkMutableDescriptorTypeListEXT *)val->pMutableDescriptorTypeLists)[i]); + } else { + vn_decode_array_size(dec, val->mutableDescriptorTypeListCount); + val->pMutableDescriptorTypeLists = NULL; + } +} + +static inline void +vn_decode_VkMutableDescriptorTypeCreateInfoEXT_temp(struct vn_cs_decoder *dec, VkMutableDescriptorTypeCreateInfoEXT *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkMutableDescriptorTypeCreateInfoEXT_pnext_temp(dec); + vn_decode_VkMutableDescriptorTypeCreateInfoEXT_self_temp(dec, val); +} + +static inline void +vn_replace_VkMutableDescriptorTypeCreateInfoEXT_handle_self(VkMutableDescriptorTypeCreateInfoEXT *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->mutableDescriptorTypeListCount */ + if (val->pMutableDescriptorTypeLists) { + for (uint32_t i = 0; i < val->mutableDescriptorTypeListCount; i++) + vn_replace_VkMutableDescriptorTypeListEXT_handle(&((VkMutableDescriptorTypeListEXT *)val->pMutableDescriptorTypeLists)[i]); + } +} + +static inline void +vn_replace_VkMutableDescriptorTypeCreateInfoEXT_handle(VkMutableDescriptorTypeCreateInfoEXT *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT: + vn_replace_VkMutableDescriptorTypeCreateInfoEXT_handle_self((VkMutableDescriptorTypeCreateInfoEXT *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + +/* struct VkDescriptorImageInfo */ + +static inline void +vn_decode_VkDescriptorImageInfo_temp(struct vn_cs_decoder *dec, VkDescriptorImageInfo *val) +{ + vn_decode_VkSampler_lookup(dec, &val->sampler); + vn_decode_VkImageView_lookup(dec, &val->imageView); + vn_decode_VkImageLayout(dec, &val->imageLayout); +} + +static inline void +vn_replace_VkDescriptorImageInfo_handle(VkDescriptorImageInfo *val) +{ + vn_replace_VkSampler_handle(&val->sampler); + vn_replace_VkImageView_handle(&val->imageView); + /* skip val->imageLayout */ +} + +/* struct VkDescriptorBufferInfo */ + +static inline void +vn_decode_VkDescriptorBufferInfo_temp(struct vn_cs_decoder *dec, VkDescriptorBufferInfo *val) +{ + vn_decode_VkBuffer_lookup(dec, &val->buffer); + vn_decode_VkDeviceSize(dec, &val->offset); + vn_decode_VkDeviceSize(dec, &val->range); +} + +static inline void +vn_replace_VkDescriptorBufferInfo_handle(VkDescriptorBufferInfo *val) +{ + vn_replace_VkBuffer_handle(&val->buffer); + /* skip val->offset */ + /* skip val->range */ +} + +/* struct VkWriteDescriptorSetInlineUniformBlock chain */ + +static inline void * +vn_decode_VkWriteDescriptorSetInlineUniformBlock_pnext_temp(struct vn_cs_decoder *dec) +{ + /* no known/supported struct */ + if (vn_decode_simple_pointer(dec)) + vn_cs_decoder_set_fatal(dec); + return NULL; +} + +static inline void +vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSetInlineUniformBlock *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_uint32_t(dec, &val->dataSize); + if (vn_peek_array_size(dec)) { + const size_t array_size = vn_decode_array_size(dec, val->dataSize); + val->pData = vn_cs_decoder_alloc_temp(dec, array_size); + if (!val->pData) return; + vn_decode_blob_array(dec, (void *)val->pData, array_size); + } else { + vn_decode_array_size(dec, val->dataSize); + val->pData = NULL; } +} + +static inline void +vn_decode_VkWriteDescriptorSetInlineUniformBlock_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSetInlineUniformBlock *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkWriteDescriptorSetInlineUniformBlock_pnext_temp(dec); + vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(dec, val); +} + +static inline void +vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self(VkWriteDescriptorSetInlineUniformBlock *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + /* skip val->dataSize */ + /* skip val->pData */ +} + +static inline void +vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle(VkWriteDescriptorSetInlineUniformBlock *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: + vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self((VkWriteDescriptorSetInlineUniformBlock *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); +} + +/* struct VkWriteDescriptorSet chain */ + +static inline void * +vn_decode_VkWriteDescriptorSet_pnext_temp(struct vn_cs_decoder *dec) +{ + VkBaseOutStructure *pnext; + VkStructureType stype; + + if (!vn_decode_simple_pointer(dec)) + return NULL; + + vn_decode_VkStructureType(dec, &stype); + switch ((int32_t)stype) { + case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: + pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkWriteDescriptorSetInlineUniformBlock)); + if (pnext) { + pnext->sType = stype; + pnext->pNext = vn_decode_VkWriteDescriptorSet_pnext_temp(dec); + vn_decode_VkWriteDescriptorSetInlineUniformBlock_self_temp(dec, (VkWriteDescriptorSetInlineUniformBlock *)pnext); + } break; default: + /* unexpected struct */ + pnext = NULL; vn_cs_decoder_set_fatal(dec); break; } + + return pnext; +} + +static inline void +vn_decode_VkWriteDescriptorSet_self_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSet *val) +{ + /* skip val->{sType,pNext} */ + vn_decode_VkDescriptorSet_lookup(dec, &val->dstSet); + vn_decode_uint32_t(dec, &val->dstBinding); + vn_decode_uint32_t(dec, &val->dstArrayElement); + vn_decode_uint32_t(dec, &val->descriptorCount); + vn_decode_VkDescriptorType(dec, &val->descriptorType); + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); + val->pImageInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pImageInfo) * iter_count); + if (!val->pImageInfo) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkDescriptorImageInfo_temp(dec, &((VkDescriptorImageInfo *)val->pImageInfo)[i]); + } else { + vn_decode_array_size_unchecked(dec); + val->pImageInfo = NULL; + } + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); + val->pBufferInfo = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pBufferInfo) * iter_count); + if (!val->pBufferInfo) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkDescriptorBufferInfo_temp(dec, &((VkDescriptorBufferInfo *)val->pBufferInfo)[i]); + } else { + vn_decode_array_size_unchecked(dec); + val->pBufferInfo = NULL; + } + if (vn_peek_array_size(dec)) { + const uint32_t iter_count = vn_decode_array_size(dec, val->descriptorCount); + val->pTexelBufferView = vn_cs_decoder_alloc_temp(dec, sizeof(*val->pTexelBufferView) * iter_count); + if (!val->pTexelBufferView) return; + for (uint32_t i = 0; i < iter_count; i++) + vn_decode_VkBufferView_lookup(dec, &((VkBufferView *)val->pTexelBufferView)[i]); + } else { + vn_decode_array_size_unchecked(dec); + val->pTexelBufferView = NULL; + } +} + +static inline void +vn_decode_VkWriteDescriptorSet_temp(struct vn_cs_decoder *dec, VkWriteDescriptorSet *val) +{ + VkStructureType stype; + vn_decode_VkStructureType(dec, &stype); + if (stype != VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET) + vn_cs_decoder_set_fatal(dec); + + val->sType = stype; + val->pNext = vn_decode_VkWriteDescriptorSet_pnext_temp(dec); + vn_decode_VkWriteDescriptorSet_self_temp(dec, val); +} + +static inline void +vn_replace_VkWriteDescriptorSet_handle_self(VkWriteDescriptorSet *val) +{ + /* skip val->sType */ + /* skip val->pNext */ + vn_replace_VkDescriptorSet_handle(&val->dstSet); + /* skip val->dstBinding */ + /* skip val->dstArrayElement */ + /* skip val->descriptorCount */ + /* skip val->descriptorType */ + if (val->pImageInfo) { + for (uint32_t i = 0; i < val->descriptorCount; i++) + vn_replace_VkDescriptorImageInfo_handle(&((VkDescriptorImageInfo *)val->pImageInfo)[i]); + } + if (val->pBufferInfo) { + for (uint32_t i = 0; i < val->descriptorCount; i++) + vn_replace_VkDescriptorBufferInfo_handle(&((VkDescriptorBufferInfo *)val->pBufferInfo)[i]); + } + if (val->pTexelBufferView) { + for (uint32_t i = 0; i < val->descriptorCount; i++) + vn_replace_VkBufferView_handle(&((VkBufferView *)val->pTexelBufferView)[i]); + } +} + +static inline void +vn_replace_VkWriteDescriptorSet_handle(VkWriteDescriptorSet *val) +{ + struct VkBaseOutStructure *pnext = (struct VkBaseOutStructure *)val; + + do { + switch ((int32_t)pnext->sType) { + case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET: + vn_replace_VkWriteDescriptorSet_handle_self((VkWriteDescriptorSet *)pnext); + break; + case VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET_INLINE_UNIFORM_BLOCK: + vn_replace_VkWriteDescriptorSetInlineUniformBlock_handle_self((VkWriteDescriptorSetInlineUniformBlock *)pnext); + break; + default: + /* ignore unknown/unsupported struct */ + break; + } + pnext = pnext->pNext; + } while (pnext); } /* struct VkMemoryDedicatedRequirements chain */ diff --git a/src/venus/venus-protocol/vn_protocol_renderer_transport.h b/src/venus/venus-protocol/vn_protocol_renderer_transport.h index 570ee57a..0d9e7d73 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_transport.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_transport.h @@ -14,14 +14,6 @@ #pragma GCC diagnostic ignored "-Wpointer-arith" #pragma GCC diagnostic ignored "-Wunused-parameter" -/* - * These structs/unions/commands are not included - * - * vkGetMemoryFdKHR - * vkGetMemoryFdPropertiesKHR - * vkImportFenceFdKHR - */ - /* struct VkCommandStreamDescriptionMESA */ static inline void @@ -135,150 +127,6 @@ vn_replace_VkRingCreateInfoMESA_handle(VkRingCreateInfoMESA *val) } while (pnext); } -/* struct VkMemoryResourceAllocationSizeProperties100000MESA chain */ - -static inline void -vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext(struct vn_cs_encoder *enc, const void *val) -{ - /* no known/supported struct */ - vn_encode_simple_pointer(enc, NULL); -} - -static inline void -vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(struct vn_cs_encoder *enc, const VkMemoryResourceAllocationSizeProperties100000MESA *val) -{ - /* skip val->{sType,pNext} */ - vn_encode_uint64_t(enc, &val->allocationSize); -} - -static inline void -vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA(struct vn_cs_encoder *enc, const VkMemoryResourceAllocationSizeProperties100000MESA *val) -{ - assert(val->sType == VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA); - vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA }); - vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext(enc, val->pNext); - vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(enc, val); -} - -static inline void * -vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext_partial_temp(struct vn_cs_decoder *dec) -{ - /* no known/supported struct */ - if (vn_decode_simple_pointer(dec)) - vn_cs_decoder_set_fatal(dec); - return NULL; -} - -static inline void -vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourceAllocationSizeProperties100000MESA *val) -{ - /* skip val->{sType,pNext} */ - /* skip val->allocationSize */ -} - -static inline void -vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourceAllocationSizeProperties100000MESA *val) -{ - VkStructureType stype; - vn_decode_VkStructureType(dec, &stype); - if (stype != VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA) - vn_cs_decoder_set_fatal(dec); - - val->sType = stype; - val->pNext = vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_pnext_partial_temp(dec); - vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(dec, val); -} - -/* struct VkMemoryResourcePropertiesMESA chain */ - -static inline void -vn_encode_VkMemoryResourcePropertiesMESA_pnext(struct vn_cs_encoder *enc, const void *val) -{ - const VkBaseInStructure *pnext = val; - - while (pnext) { - switch ((int32_t)pnext->sType) { - case VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA: - vn_encode_simple_pointer(enc, pnext); - vn_encode_VkStructureType(enc, &pnext->sType); - vn_encode_VkMemoryResourcePropertiesMESA_pnext(enc, pnext->pNext); - vn_encode_VkMemoryResourceAllocationSizeProperties100000MESA_self(enc, (const VkMemoryResourceAllocationSizeProperties100000MESA *)pnext); - return; - default: - /* ignore unknown/unsupported struct */ - break; - } - pnext = pnext->pNext; - } - - vn_encode_simple_pointer(enc, NULL); -} - -static inline void -vn_encode_VkMemoryResourcePropertiesMESA_self(struct vn_cs_encoder *enc, const VkMemoryResourcePropertiesMESA *val) -{ - /* skip val->{sType,pNext} */ - vn_encode_uint32_t(enc, &val->memoryTypeBits); -} - -static inline void -vn_encode_VkMemoryResourcePropertiesMESA(struct vn_cs_encoder *enc, const VkMemoryResourcePropertiesMESA *val) -{ - assert(val->sType == VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA); - vn_encode_VkStructureType(enc, &(VkStructureType){ VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA }); - vn_encode_VkMemoryResourcePropertiesMESA_pnext(enc, val->pNext); - vn_encode_VkMemoryResourcePropertiesMESA_self(enc, val); -} - -static inline void * -vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(struct vn_cs_decoder *dec) -{ - VkBaseOutStructure *pnext; - VkStructureType stype; - - if (!vn_decode_simple_pointer(dec)) - return NULL; - - vn_decode_VkStructureType(dec, &stype); - switch ((int32_t)stype) { - case VK_STRUCTURE_TYPE_MEMORY_RESOURCE_ALLOCATION_SIZE_PROPERTIES_100000_MESA: - pnext = vn_cs_decoder_alloc_temp(dec, sizeof(VkMemoryResourceAllocationSizeProperties100000MESA)); - if (pnext) { - pnext->sType = stype; - pnext->pNext = vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(dec); - vn_decode_VkMemoryResourceAllocationSizeProperties100000MESA_self_partial_temp(dec, (VkMemoryResourceAllocationSizeProperties100000MESA *)pnext); - } - break; - default: - /* unexpected struct */ - pnext = NULL; - vn_cs_decoder_set_fatal(dec); - break; - } - - return pnext; -} - -static inline void -vn_decode_VkMemoryResourcePropertiesMESA_self_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourcePropertiesMESA *val) -{ - /* skip val->{sType,pNext} */ - /* skip val->memoryTypeBits */ -} - -static inline void -vn_decode_VkMemoryResourcePropertiesMESA_partial_temp(struct vn_cs_decoder *dec, VkMemoryResourcePropertiesMESA *val) -{ - VkStructureType stype; - vn_decode_VkStructureType(dec, &stype); - if (stype != VK_STRUCTURE_TYPE_MEMORY_RESOURCE_PROPERTIES_MESA) - vn_cs_decoder_set_fatal(dec); - - val->sType = stype; - val->pNext = vn_decode_VkMemoryResourcePropertiesMESA_pnext_partial_temp(dec); - vn_decode_VkMemoryResourcePropertiesMESA_self_partial_temp(dec, val); -} - static inline void vn_decode_vkSetReplyCommandStreamMESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkSetReplyCommandStreamMESA *args) { if (vn_decode_simple_pointer(dec)) { @@ -476,38 +324,6 @@ static inline void vn_encode_vkWriteRingExtraMESA_reply(struct vn_cs_encoder *en /* skip args->value */ } -static inline void vn_decode_vkGetMemoryResourcePropertiesMESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkGetMemoryResourcePropertiesMESA *args) -{ - vn_decode_VkDevice_lookup(dec, &args->device); - vn_decode_uint32_t(dec, &args->resourceId); - if (vn_decode_simple_pointer(dec)) { - args->pMemoryResourceProperties = vn_cs_decoder_alloc_temp(dec, sizeof(*args->pMemoryResourceProperties)); - if (!args->pMemoryResourceProperties) return; - vn_decode_VkMemoryResourcePropertiesMESA_partial_temp(dec, args->pMemoryResourceProperties); - } else { - args->pMemoryResourceProperties = NULL; - vn_cs_decoder_set_fatal(dec); - } -} - -static inline void vn_replace_vkGetMemoryResourcePropertiesMESA_args_handle(struct vn_command_vkGetMemoryResourcePropertiesMESA *args) -{ - vn_replace_VkDevice_handle(&args->device); - /* skip args->resourceId */ - /* skip args->pMemoryResourceProperties */ -} - -static inline void vn_encode_vkGetMemoryResourcePropertiesMESA_reply(struct vn_cs_encoder *enc, const struct vn_command_vkGetMemoryResourcePropertiesMESA *args) -{ - vn_encode_VkCommandTypeEXT(enc, &(VkCommandTypeEXT){VK_COMMAND_TYPE_vkGetMemoryResourcePropertiesMESA_EXT}); - - vn_encode_VkResult(enc, &args->ret); - /* skip args->device */ - /* skip args->resourceId */ - if (vn_encode_simple_pointer(enc, args->pMemoryResourceProperties)) - vn_encode_VkMemoryResourcePropertiesMESA(enc, args->pMemoryResourceProperties); -} - static inline void vn_decode_vkGetVenusExperimentalFeatureData100000MESA_args_temp(struct vn_cs_decoder *dec, struct vn_command_vkGetVenusExperimentalFeatureData100000MESA *args) { if (vn_decode_simple_pointer(dec)) { @@ -695,35 +511,6 @@ static inline void vn_dispatch_vkWriteRingExtraMESA(struct vn_dispatch_context * vn_cs_decoder_reset_temp_pool(ctx->decoder); } -static inline void vn_dispatch_vkGetMemoryResourcePropertiesMESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) -{ - struct vn_command_vkGetMemoryResourcePropertiesMESA args; - - if (!ctx->dispatch_vkGetMemoryResourcePropertiesMESA) { - vn_cs_decoder_set_fatal(ctx->decoder); - return; - } - - vn_decode_vkGetMemoryResourcePropertiesMESA_args_temp(ctx->decoder, &args); - if (!args.device) { - vn_cs_decoder_set_fatal(ctx->decoder); - return; - } - - if (!vn_cs_decoder_get_fatal(ctx->decoder)) - ctx->dispatch_vkGetMemoryResourcePropertiesMESA(ctx, &args); - -#ifdef DEBUG - if (!vn_cs_decoder_get_fatal(ctx->decoder) && vn_dispatch_should_log_result(args.ret)) - vn_dispatch_debug_log(ctx, "vkGetMemoryResourcePropertiesMESA returned %d", args.ret); -#endif - - if (!vn_cs_decoder_get_fatal(ctx->decoder) && (flags & VK_COMMAND_GENERATE_REPLY_BIT_EXT)) - vn_encode_vkGetMemoryResourcePropertiesMESA_reply(ctx->encoder, &args); - - vn_cs_decoder_reset_temp_pool(ctx->decoder); -} - static inline void vn_dispatch_vkGetVenusExperimentalFeatureData100000MESA(struct vn_dispatch_context *ctx, VkCommandFlagsEXT flags) { struct vn_command_vkGetVenusExperimentalFeatureData100000MESA args; diff --git a/src/venus/venus-protocol/vn_protocol_renderer_types.h b/src/venus/venus-protocol/vn_protocol_renderer_types.h index 69aa0608..0e6e18be 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_types.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_types.h @@ -497,6 +497,20 @@ vn_decode_VkSamplerCreateFlagBits(struct vn_cs_decoder *dec, VkSamplerCreateFlag vn_decode_int32_t(dec, (int32_t *)val); } +/* enum VkPipelineLayoutCreateFlagBits */ + +static inline void +vn_encode_VkPipelineLayoutCreateFlagBits(struct vn_cs_encoder *enc, const VkPipelineLayoutCreateFlagBits *val) +{ + vn_encode_int32_t(enc, (const int32_t *)val); +} + +static inline void +vn_decode_VkPipelineLayoutCreateFlagBits(struct vn_cs_decoder *dec, VkPipelineLayoutCreateFlagBits *val) +{ + vn_decode_int32_t(dec, (int32_t *)val); +} + /* enum VkPipelineCacheCreateFlagBits */ static inline void @@ -567,6 +581,20 @@ vn_decode_VkDescriptorSetLayoutCreateFlagBits(struct vn_cs_decoder *dec, VkDescr vn_decode_int32_t(dec, (int32_t *)val); } +/* enum VkInstanceCreateFlagBits */ + +static inline void +vn_encode_VkInstanceCreateFlagBits(struct vn_cs_encoder *enc, const VkInstanceCreateFlagBits *val) +{ + vn_encode_int32_t(enc, (const int32_t *)val); +} + +static inline void +vn_decode_VkInstanceCreateFlagBits(struct vn_cs_decoder *dec, VkInstanceCreateFlagBits *val) +{ + vn_decode_int32_t(dec, (int32_t *)val); +} + /* enum VkDeviceQueueCreateFlagBits */ static inline void diff --git a/src/venus/venus-protocol/vn_protocol_renderer_util.h b/src/venus/venus-protocol/vn_protocol_renderer_util.h index dea29c3b..0f243be3 100644 --- a/src/venus/venus-protocol/vn_protocol_renderer_util.h +++ b/src/venus/venus-protocol/vn_protocol_renderer_util.h @@ -62,6 +62,8 @@ struct vn_device_proc_table { PFN_vkCmdDrawIndirect CmdDrawIndirect; PFN_vkCmdDrawIndirectByteCountEXT CmdDrawIndirectByteCountEXT; PFN_vkCmdDrawIndirectCount CmdDrawIndirectCount; + PFN_vkCmdDrawMultiEXT CmdDrawMultiEXT; + PFN_vkCmdDrawMultiIndexedEXT CmdDrawMultiIndexedEXT; PFN_vkCmdEndConditionalRenderingEXT CmdEndConditionalRenderingEXT; PFN_vkCmdEndQuery CmdEndQuery; PFN_vkCmdEndQueryIndexedEXT CmdEndQueryIndexedEXT; @@ -76,6 +78,8 @@ struct vn_device_proc_table { PFN_vkCmdPipelineBarrier CmdPipelineBarrier; PFN_vkCmdPipelineBarrier2 CmdPipelineBarrier2; PFN_vkCmdPushConstants CmdPushConstants; + PFN_vkCmdPushDescriptorSetKHR CmdPushDescriptorSetKHR; + PFN_vkCmdPushDescriptorSetWithTemplateKHR CmdPushDescriptorSetWithTemplateKHR; PFN_vkCmdResetEvent CmdResetEvent; PFN_vkCmdResetEvent2 CmdResetEvent2; PFN_vkCmdResetQueryPool CmdResetQueryPool; @@ -197,7 +201,9 @@ struct vn_device_proc_table { PFN_vkGetQueryPoolResults GetQueryPoolResults; PFN_vkGetRenderAreaGranularity GetRenderAreaGranularity; PFN_vkGetSemaphoreCounterValue GetSemaphoreCounterValue; + PFN_vkGetSemaphoreFdKHR GetSemaphoreFdKHR; PFN_vkImportFenceFdKHR ImportFenceFdKHR; + PFN_vkImportSemaphoreFdKHR ImportSemaphoreFdKHR; PFN_vkInvalidateMappedMemoryRanges InvalidateMappedMemoryRanges; PFN_vkMapMemory MapMemory; PFN_vkMergePipelineCaches MergePipelineCaches; @@ -336,6 +342,12 @@ vn_util_init_device_proc_table(VkDevice dev, api_version >= VK_API_VERSION_1_2 ? VN_GDPA(dev, vkCmdDrawIndirectCount) : ext_table->KHR_draw_indirect_count ? VN_GDPA(dev, vkCmdDrawIndirectCountKHR) : NULL; + proc_table->CmdDrawMultiEXT = + ext_table->EXT_multi_draw ? VN_GDPA(dev, vkCmdDrawMultiEXT) : + NULL; + proc_table->CmdDrawMultiIndexedEXT = + ext_table->EXT_multi_draw ? VN_GDPA(dev, vkCmdDrawMultiIndexedEXT) : + NULL; proc_table->CmdEndConditionalRenderingEXT = ext_table->EXT_conditional_rendering ? VN_GDPA(dev, vkCmdEndConditionalRenderingEXT) : NULL; @@ -368,6 +380,12 @@ vn_util_init_device_proc_table(VkDevice dev, ext_table->KHR_synchronization2 ? VN_GDPA(dev, vkCmdPipelineBarrier2KHR) : NULL; proc_table->CmdPushConstants = VN_GDPA(dev, vkCmdPushConstants); + proc_table->CmdPushDescriptorSetKHR = + ext_table->KHR_push_descriptor ? VN_GDPA(dev, vkCmdPushDescriptorSetKHR) : + NULL; + proc_table->CmdPushDescriptorSetWithTemplateKHR = + ext_table->KHR_push_descriptor ? VN_GDPA(dev, vkCmdPushDescriptorSetWithTemplateKHR) : + NULL; proc_table->CmdResetEvent = VN_GDPA(dev, vkCmdResetEvent); proc_table->CmdResetEvent2 = api_version >= VK_API_VERSION_1_3 ? VN_GDPA(dev, vkCmdResetEvent2) : @@ -627,9 +645,15 @@ vn_util_init_device_proc_table(VkDevice dev, api_version >= VK_API_VERSION_1_2 ? VN_GDPA(dev, vkGetSemaphoreCounterValue) : ext_table->KHR_timeline_semaphore ? VN_GDPA(dev, vkGetSemaphoreCounterValueKHR) : NULL; + proc_table->GetSemaphoreFdKHR = + ext_table->KHR_external_semaphore_fd ? VN_GDPA(dev, vkGetSemaphoreFdKHR) : + NULL; proc_table->ImportFenceFdKHR = ext_table->KHR_external_fence_fd ? VN_GDPA(dev, vkImportFenceFdKHR) : NULL; + proc_table->ImportSemaphoreFdKHR = + ext_table->KHR_external_semaphore_fd ? VN_GDPA(dev, vkImportSemaphoreFdKHR) : + NULL; proc_table->InvalidateMappedMemoryRanges = VN_GDPA(dev, vkInvalidateMappedMemoryRanges); proc_table->MapMemory = VN_GDPA(dev, vkMapMemory); proc_table->MergePipelineCaches = VN_GDPA(dev, vkMergePipelineCaches); diff --git a/src/venus/venus-protocol/vulkan.h b/src/venus/venus-protocol/vulkan.h index 004fa709..3510ac91 100644 --- a/src/venus/venus-protocol/vulkan.h +++ b/src/venus/venus-protocol/vulkan.h @@ -38,7 +38,6 @@ #ifdef VK_USE_PLATFORM_WAYLAND_KHR -#include <wayland-client.h> #include "vulkan_wayland.h" #endif diff --git a/src/venus/venus-protocol/vulkan_core.h b/src/venus/venus-protocol/vulkan_core.h index 228e4ef6..6cc788e7 100644 --- a/src/venus/venus-protocol/vulkan_core.h +++ b/src/venus/venus-protocol/vulkan_core.h @@ -72,7 +72,7 @@ extern "C" { #define VK_API_VERSION_1_0 VK_MAKE_API_VERSION(0, 1, 0, 0)// Patch version should always be set to 0 // Version of this file -#define VK_HEADER_VERSION 204 +#define VK_HEADER_VERSION 228 // Complete version of this file #define VK_HEADER_VERSION_COMPLETE VK_MAKE_API_VERSION(0, 1, 3, VK_HEADER_VERSION) @@ -120,7 +120,6 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorSet) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkDescriptorPool) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkFramebuffer) VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) -#define VK_UUID_SIZE 16U #define VK_ATTACHMENT_UNUSED (~0U) #define VK_FALSE 0U #define VK_LOD_CLAMP_NONE 1000.0F @@ -131,10 +130,11 @@ VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkCommandPool) #define VK_TRUE 1U #define VK_WHOLE_SIZE (~0ULL) #define VK_MAX_MEMORY_TYPES 32U -#define VK_MAX_MEMORY_HEAPS 16U #define VK_MAX_PHYSICAL_DEVICE_NAME_SIZE 256U +#define VK_UUID_SIZE 16U #define VK_MAX_EXTENSION_NAME_SIZE 256U #define VK_MAX_DESCRIPTION_SIZE 256U +#define VK_MAX_MEMORY_HEAPS 16U typedef enum VkResult { VK_SUCCESS = 0, @@ -168,6 +168,24 @@ typedef enum VkResult { VK_ERROR_INCOMPATIBLE_DISPLAY_KHR = -1000003001, VK_ERROR_VALIDATION_FAILED_EXT = -1000011001, VK_ERROR_INVALID_SHADER_NV = -1000012000, +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_IMAGE_USAGE_NOT_SUPPORTED_KHR = -1000023000, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_VIDEO_PICTURE_LAYOUT_NOT_SUPPORTED_KHR = -1000023001, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_VIDEO_PROFILE_OPERATION_NOT_SUPPORTED_KHR = -1000023002, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_VIDEO_PROFILE_FORMAT_NOT_SUPPORTED_KHR = -1000023003, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_VIDEO_PROFILE_CODEC_NOT_SUPPORTED_KHR = -1000023004, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_ERROR_VIDEO_STD_VERSION_NOT_SUPPORTED_KHR = -1000023005, +#endif VK_ERROR_INVALID_DRM_FORMAT_MODIFIER_PLANE_LAYOUT_EXT = -1000158000, VK_ERROR_NOT_PERMITTED_KHR = -1000174001, VK_ERROR_FULL_SCREEN_EXCLUSIVE_MODE_LOST_EXT = -1000255000, @@ -175,6 +193,7 @@ typedef enum VkResult { VK_THREAD_DONE_KHR = 1000268001, VK_OPERATION_DEFERRED_KHR = 1000268002, VK_OPERATION_NOT_DEFERRED_KHR = 1000268003, + VK_ERROR_COMPRESSION_EXHAUSTED_EXT = -1000338000, VK_ERROR_OUT_OF_POOL_MEMORY_KHR = VK_ERROR_OUT_OF_POOL_MEMORY, VK_ERROR_INVALID_EXTERNAL_HANDLE_KHR = VK_ERROR_INVALID_EXTERNAL_HANDLE, VK_ERROR_FRAGMENTATION_EXT = VK_ERROR_FRAGMENTATION, @@ -425,19 +444,19 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_DEBUG_MARKER_OBJECT_TAG_INFO_EXT = 1000022001, VK_STRUCTURE_TYPE_DEBUG_MARKER_MARKER_INFO_EXT = 1000022002, #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_PROFILE_KHR = 1000023000, + VK_STRUCTURE_TYPE_VIDEO_PROFILE_INFO_KHR = 1000023000, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_CAPABILITIES_KHR = 1000023001, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_KHR = 1000023002, + VK_STRUCTURE_TYPE_VIDEO_PICTURE_RESOURCE_INFO_KHR = 1000023002, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_GET_MEMORY_PROPERTIES_KHR = 1000023003, + VK_STRUCTURE_TYPE_VIDEO_SESSION_MEMORY_REQUIREMENTS_KHR = 1000023003, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_BIND_MEMORY_KHR = 1000023004, + VK_STRUCTURE_TYPE_BIND_VIDEO_SESSION_MEMORY_INFO_KHR = 1000023004, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_SESSION_CREATE_INFO_KHR = 1000023005, @@ -458,13 +477,13 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_CODING_CONTROL_INFO_KHR = 1000023010, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_KHR = 1000023011, + VK_STRUCTURE_TYPE_VIDEO_REFERENCE_SLOT_INFO_KHR = 1000023011, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_QUEUE_FAMILY_PROPERTIES_2_KHR = 1000023012, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_VIDEO_PROPERTIES_KHR = 1000023012, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_PROFILES_KHR = 1000023013, + VK_STRUCTURE_TYPE_VIDEO_PROFILE_LIST_INFO_KHR = 1000023013, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VIDEO_FORMAT_INFO_KHR = 1000023014, @@ -473,11 +492,17 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_FORMAT_PROPERTIES_KHR = 1000023015, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_2_KHR = 1000023016, + VK_STRUCTURE_TYPE_QUEUE_FAMILY_QUERY_RESULT_STATUS_PROPERTIES_KHR = 1000023016, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_DECODE_INFO_KHR = 1000024000, #endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_VIDEO_DECODE_CAPABILITIES_KHR = 1000024001, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_VIDEO_DECODE_USAGE_INFO_KHR = 1000024002, +#endif VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_IMAGE_CREATE_INFO_NV = 1000026000, VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV = 1000026001, VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV = 1000026002, @@ -493,94 +518,88 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_CAPABILITIES_EXT = 1000038000, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_CREATE_INFO_EXT = 1000038001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038001, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000038002, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038002, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000038003, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038003, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_VCL_FRAME_INFO_EXT = 1000038004, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038004, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_DPB_SLOT_INFO_EXT = 1000038005, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_INFO_EXT = 1000038005, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_NALU_SLICE_EXT = 1000038006, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000038006, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_EMIT_PICTURE_PARAMETERS_EXT = 1000038007, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_INFO_EXT = 1000038007, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_PROFILE_EXT = 1000038008, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_EXT = 1000038008, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_INFO_EXT = 1000038009, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_EXT = 1000038009, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_RATE_CONTROL_LAYER_INFO_EXT = 1000038010, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H264_REFERENCE_LISTS_INFO_EXT = 1000038010, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_CAPABILITIES_EXT = 1000039000, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_CREATE_INFO_EXT = 1000039001, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000039001, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000039002, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000039002, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000039003, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT = 1000039003, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_VCL_FRAME_INFO_EXT = 1000039004, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_EXT = 1000039004, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_DPB_SLOT_INFO_EXT = 1000039005, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_SEGMENT_INFO_EXT = 1000039005, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_NALU_SLICE_EXT = 1000039006, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_INFO_EXT = 1000039006, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_EMIT_PICTURE_PARAMETERS_EXT = 1000039007, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_INFO_EXT = 1000039007, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_PROFILE_EXT = 1000039008, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_INFO_EXT = 1000039008, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_REFERENCE_LISTS_EXT = 1000039009, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT = 1000039009, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_INFO_EXT = 1000039010, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039011, + VK_STRUCTURE_TYPE_VIDEO_ENCODE_H265_RATE_CONTROL_LAYER_INFO_EXT = 1000039010, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_CAPABILITIES_EXT = 1000040000, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_CREATE_INFO_EXT = 1000040001, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040001, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PICTURE_INFO_EXT = 1000040002, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_INFO_EXT = 1000040002, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_MVC_EXT = 1000040003, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_INFO_EXT = 1000040003, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_PROFILE_EXT = 1000040004, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040004, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000040005, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040005, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_SESSION_PARAMETERS_ADD_INFO_EXT = 1000040006, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040007, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H264_DPB_SLOT_INFO_EXT = 1000040006, #endif VK_STRUCTURE_TYPE_TEXTURE_LOD_GATHER_FORMAT_PROPERTIES_AMD = 1000041000, VK_STRUCTURE_TYPE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_INFO_KHR = 1000044006, @@ -598,6 +617,9 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VI_SURFACE_CREATE_INFO_NN = 1000062000, VK_STRUCTURE_TYPE_IMAGE_VIEW_ASTC_DECODE_MODE_EXT = 1000067000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ASTC_DECODE_FEATURES_EXT = 1000067001, + VK_STRUCTURE_TYPE_PIPELINE_ROBUSTNESS_CREATE_INFO_EXT = 1000068000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_FEATURES_EXT = 1000068001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_ROBUSTNESS_PROPERTIES_EXT = 1000068002, VK_STRUCTURE_TYPE_IMPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073000, VK_STRUCTURE_TYPE_EXPORT_MEMORY_WIN32_HANDLE_INFO_KHR = 1000073001, VK_STRUCTURE_TYPE_MEMORY_WIN32_HANDLE_PROPERTIES_KHR = 1000073002, @@ -745,22 +767,19 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_CAPABILITIES_EXT = 1000187000, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_CREATE_INFO_EXT = 1000187001, -#endif -#ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187002, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_CREATE_INFO_EXT = 1000187001, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187003, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_SESSION_PARAMETERS_ADD_INFO_EXT = 1000187002, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_EXT = 1000187004, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PROFILE_INFO_EXT = 1000187003, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187005, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_PICTURE_INFO_EXT = 1000187004, #endif #ifdef VK_ENABLE_BETA_EXTENSIONS - VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187006, + VK_STRUCTURE_TYPE_VIDEO_DECODE_H265_DPB_SLOT_INFO_EXT = 1000187005, #endif VK_STRUCTURE_TYPE_DEVICE_QUEUE_GLOBAL_PRIORITY_CREATE_INFO_KHR = 1000174000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR = 1000388000, @@ -773,7 +792,6 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COMPUTE_SHADER_DERIVATIVES_FEATURES_NV = 1000201000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_NV = 1000202000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_NV = 1000202001, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = 1000203000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_IMAGE_FOOTPRINT_FEATURES_NV = 1000204000, VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV = 1000205000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXCLUSIVE_SCISSOR_FEATURES_NV = 1000205002, @@ -872,10 +890,34 @@ typedef enum VkStructureType { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_STRUCTURE_TYPE_VIDEO_ENCODE_RATE_CONTROL_LAYER_INFO_KHR = 1000299002, #endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_VIDEO_ENCODE_CAPABILITIES_KHR = 1000299003, +#endif +#ifdef VK_ENABLE_BETA_EXTENSIONS + VK_STRUCTURE_TYPE_VIDEO_ENCODE_USAGE_INFO_KHR = 1000299004, +#endif VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DIAGNOSTICS_CONFIG_FEATURES_NV = 1000300000, VK_STRUCTURE_TYPE_DEVICE_DIAGNOSTICS_CONFIG_CREATE_INFO_NV = 1000300001, + VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECT_CREATE_INFO_EXT = 1000311000, + VK_STRUCTURE_TYPE_EXPORT_METAL_OBJECTS_INFO_EXT = 1000311001, + VK_STRUCTURE_TYPE_EXPORT_METAL_DEVICE_INFO_EXT = 1000311002, + VK_STRUCTURE_TYPE_EXPORT_METAL_COMMAND_QUEUE_INFO_EXT = 1000311003, + VK_STRUCTURE_TYPE_EXPORT_METAL_BUFFER_INFO_EXT = 1000311004, + VK_STRUCTURE_TYPE_IMPORT_METAL_BUFFER_INFO_EXT = 1000311005, + VK_STRUCTURE_TYPE_EXPORT_METAL_TEXTURE_INFO_EXT = 1000311006, + VK_STRUCTURE_TYPE_IMPORT_METAL_TEXTURE_INFO_EXT = 1000311007, + VK_STRUCTURE_TYPE_EXPORT_METAL_IO_SURFACE_INFO_EXT = 1000311008, + VK_STRUCTURE_TYPE_IMPORT_METAL_IO_SURFACE_INFO_EXT = 1000311009, + VK_STRUCTURE_TYPE_EXPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311010, + VK_STRUCTURE_TYPE_IMPORT_METAL_SHARED_EVENT_INFO_EXT = 1000311011, VK_STRUCTURE_TYPE_QUEUE_FAMILY_CHECKPOINT_PROPERTIES_2_NV = 1000314008, VK_STRUCTURE_TYPE_CHECKPOINT_DATA_2_NV = 1000314009, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_FEATURES_EXT = 1000320000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GRAPHICS_PIPELINE_LIBRARY_PROPERTIES_EXT = 1000320001, + VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_LIBRARY_CREATE_INFO_EXT = 1000320002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_FEATURES_AMD = 1000321000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR = 1000203000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_PROPERTIES_KHR = 1000322000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_FEATURES_KHR = 1000323000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_PROPERTIES_NV = 1000326000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_ENUMS_FEATURES_NV = 1000326001, @@ -883,17 +925,22 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_GEOMETRY_MOTION_TRIANGLES_DATA_NV = 1000327000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MOTION_BLUR_FEATURES_NV = 1000327001, VK_STRUCTURE_TYPE_ACCELERATION_STRUCTURE_MOTION_INFO_NV = 1000327002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_FEATURES_EXT = 1000328000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MESH_SHADER_PROPERTIES_EXT = 1000328001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_YCBCR_2_PLANE_444_FORMATS_FEATURES_EXT = 1000330000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_FEATURES_EXT = 1000332000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_2_PROPERTIES_EXT = 1000332001, VK_STRUCTURE_TYPE_COPY_COMMAND_TRANSFORM_INFO_QCOM = 1000333000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_WORKGROUP_MEMORY_EXPLICIT_LAYOUT_FEATURES_KHR = 1000336000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_FEATURES_EXT = 1000338000, + VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_CONTROL_EXT = 1000338001, + VK_STRUCTURE_TYPE_SUBRESOURCE_LAYOUT_2_EXT = 1000338002, + VK_STRUCTURE_TYPE_IMAGE_SUBRESOURCE_2_EXT = 1000338003, + VK_STRUCTURE_TYPE_IMAGE_COMPRESSION_PROPERTIES_EXT = 1000338004, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_FEATURES_EXT = 1000339000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_4444_FORMATS_FEATURES_EXT = 1000340000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = 1000342000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RGBA10X6_FORMATS_FEATURES_EXT = 1000344000, VK_STRUCTURE_TYPE_DIRECTFB_SURFACE_CREATE_INFO_EXT = 1000346000, - VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = 1000351000, - VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = 1000351002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VERTEX_INPUT_DYNAMIC_STATE_FEATURES_EXT = 1000352000, VK_STRUCTURE_TYPE_VERTEX_INPUT_BINDING_DESCRIPTION_2_EXT = 1000352001, VK_STRUCTURE_TYPE_VERTEX_INPUT_ATTRIBUTE_DESCRIPTION_2_EXT = 1000352002, @@ -922,21 +969,54 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_INVOCATION_MASK_FEATURES_HUAWEI = 1000370000, VK_STRUCTURE_TYPE_MEMORY_GET_REMOTE_ADDRESS_INFO_NV = 1000371000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTERNAL_MEMORY_RDMA_FEATURES_NV = 1000371001, + VK_STRUCTURE_TYPE_PIPELINE_PROPERTIES_IDENTIFIER_EXT = 1000372000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PIPELINE_PROPERTIES_FEATURES_EXT = 1000372001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_FEATURES_EXT = 1000376000, + VK_STRUCTURE_TYPE_SUBPASS_RESOLVE_PERFORMANCE_QUERY_EXT = 1000376001, + VK_STRUCTURE_TYPE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_INFO_EXT = 1000376002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_EXTENDED_DYNAMIC_STATE_2_FEATURES_EXT = 1000377000, VK_STRUCTURE_TYPE_SCREEN_SURFACE_CREATE_INFO_QNX = 1000378000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_COLOR_WRITE_ENABLE_FEATURES_EXT = 1000381000, VK_STRUCTURE_TYPE_PIPELINE_COLOR_WRITE_CREATE_INFO_EXT = 1000381001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PRIMITIVES_GENERATED_QUERY_FEATURES_EXT = 1000382000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RAY_TRACING_MAINTENANCE_1_FEATURES_KHR = 1000386000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_VIEW_MIN_LOD_FEATURES_EXT = 1000391000, VK_STRUCTURE_TYPE_IMAGE_VIEW_MIN_LOD_CREATE_INFO_EXT = 1000391001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_FEATURES_EXT = 1000392000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MULTI_DRAW_PROPERTIES_EXT = 1000392001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_2D_VIEW_OF_3D_FEATURES_EXT = 1000393000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_BORDER_COLOR_SWIZZLE_FEATURES_EXT = 1000411000, VK_STRUCTURE_TYPE_SAMPLER_BORDER_COLOR_COMPONENT_MAPPING_CREATE_INFO_EXT = 1000411001, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PAGEABLE_DEVICE_LOCAL_MEMORY_FEATURES_EXT = 1000412000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_SET_HOST_MAPPING_FEATURES_VALVE = 1000420000, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_BINDING_REFERENCE_VALVE = 1000420001, + VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_HOST_MAPPING_INFO_VALVE = 1000420002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_CLAMP_ZERO_ONE_FEATURES_EXT = 1000421000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_NON_SEAMLESS_CUBE_MAP_FEATURES_EXT = 1000422000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_FEATURES_QCOM = 1000425000, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_DENSITY_MAP_OFFSET_PROPERTIES_QCOM = 1000425001, VK_STRUCTURE_TYPE_SUBPASS_FRAGMENT_DENSITY_MAP_OFFSET_END_INFO_QCOM = 1000425002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LINEAR_COLOR_ATTACHMENT_FEATURES_NV = 1000430000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_FEATURES_EXT = 1000437000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_FEATURES_QCOM = 1000440000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_IMAGE_PROCESSING_PROPERTIES_QCOM = 1000440001, + VK_STRUCTURE_TYPE_IMAGE_VIEW_SAMPLE_WEIGHT_CREATE_INFO_QCOM = 1000440002, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SUBPASS_MERGE_FEEDBACK_FEATURES_EXT = 1000458000, + VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_CONTROL_EXT = 1000458001, + VK_STRUCTURE_TYPE_RENDER_PASS_CREATION_FEEDBACK_CREATE_INFO_EXT = 1000458002, + VK_STRUCTURE_TYPE_RENDER_PASS_SUBPASS_FEEDBACK_CREATE_INFO_EXT = 1000458003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_FEATURES_EXT = 1000462000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_MODULE_IDENTIFIER_PROPERTIES_EXT = 1000462001, + VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_MODULE_IDENTIFIER_CREATE_INFO_EXT = 1000462002, + VK_STRUCTURE_TYPE_SHADER_MODULE_IDENTIFIER_EXT = 1000462003, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT = 1000342000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_LEGACY_DITHERING_FEATURES_EXT = 1000465000, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TILE_PROPERTIES_FEATURES_QCOM = 1000484000, + VK_STRUCTURE_TYPE_TILE_PROPERTIES_QCOM = 1000484001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_AMIGO_PROFILING_FEATURES_SEC = 1000485000, + VK_STRUCTURE_TYPE_AMIGO_PROFILING_SUBMIT_INFO_SEC = 1000485001, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT = 1000351000, + VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT = 1000351002, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VARIABLE_POINTERS_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETER_FEATURES = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_DRAW_PARAMETERS_FEATURES, VK_STRUCTURE_TYPE_DEBUG_REPORT_CREATE_INFO_EXT = VK_STRUCTURE_TYPE_DEBUG_REPORT_CALLBACK_CREATE_INFO_EXT, @@ -1042,6 +1122,7 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FLOAT_CONTROLS_PROPERTIES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DEPTH_STENCIL_RESOLVE_PROPERTIES, VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE_KHR = VK_STRUCTURE_TYPE_SUBPASS_DESCRIPTION_DEPTH_STENCIL_RESOLVE, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_NV = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADER_BARYCENTRIC_FEATURES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_PROPERTIES, VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO_KHR = VK_STRUCTURE_TYPE_SEMAPHORE_TYPE_CREATE_INFO, @@ -1098,7 +1179,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_IMAGE_BLIT_2_KHR = VK_STRUCTURE_TYPE_IMAGE_BLIT_2, VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR = VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2, VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR = VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_ARM = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_FEATURES_EXT, + VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_VALVE = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MUTABLE_DESCRIPTOR_TYPE_FEATURES_EXT, + VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_VALVE = VK_STRUCTURE_TYPE_MUTABLE_DESCRIPTOR_TYPE_CREATE_INFO_EXT, VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3_KHR = VK_STRUCTURE_TYPE_FORMAT_PROPERTIES_3, + VK_STRUCTURE_TYPE_PIPELINE_INFO_EXT = VK_STRUCTURE_TYPE_PIPELINE_INFO_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_EXT = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_GLOBAL_PRIORITY_QUERY_FEATURES_KHR, VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_EXT = VK_STRUCTURE_TYPE_QUEUE_FAMILY_GLOBAL_PRIORITY_PROPERTIES_KHR, VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES_KHR = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_MAINTENANCE_4_FEATURES, @@ -1108,6 +1193,11 @@ typedef enum VkStructureType { VK_STRUCTURE_TYPE_MAX_ENUM = 0x7FFFFFFF } VkStructureType; +typedef enum VkPipelineCacheHeaderVersion { + VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, + VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF +} VkPipelineCacheHeaderVersion; + typedef enum VkImageLayout { VK_IMAGE_LAYOUT_UNDEFINED = 0, VK_IMAGE_LAYOUT_GENERAL = 1, @@ -1148,6 +1238,7 @@ typedef enum VkImageLayout { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_LAYOUT_VIDEO_ENCODE_DPB_KHR = 1000299002, #endif + VK_IMAGE_LAYOUT_ATTACHMENT_FEEDBACK_LOOP_OPTIMAL_EXT = 1000339000, VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL_KHR = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_SHADING_RATE_OPTIMAL_NV = VK_IMAGE_LAYOUT_FRAGMENT_SHADING_RATE_ATTACHMENT_OPTIMAL_KHR, @@ -1217,11 +1308,6 @@ typedef enum VkObjectType { VK_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF } VkObjectType; -typedef enum VkPipelineCacheHeaderVersion { - VK_PIPELINE_CACHE_HEADER_VERSION_ONE = 1, - VK_PIPELINE_CACHE_HEADER_VERSION_MAX_ENUM = 0x7FFFFFFF -} VkPipelineCacheHeaderVersion; - typedef enum VkVendorId { VK_VENDOR_ID_VIV = 0x10001, VK_VENDOR_ID_VSI = 0x10002, @@ -1590,6 +1676,10 @@ typedef enum VkQueryType { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_QUERY_TYPE_VIDEO_ENCODE_BITSTREAM_BUFFER_RANGE_KHR = 1000299000, #endif + VK_QUERY_TYPE_MESH_PRIMITIVES_GENERATED_EXT = 1000328000, + VK_QUERY_TYPE_PRIMITIVES_GENERATED_EXT = 1000382000, + VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SERIALIZATION_BOTTOM_LEVEL_POINTERS_KHR = 1000386000, + VK_QUERY_TYPE_ACCELERATION_STRUCTURE_SIZE_KHR = 1000386001, VK_QUERY_TYPE_MAX_ENUM = 0x7FFFFFFF } VkQueryType; @@ -1849,8 +1939,8 @@ typedef enum VkBorderColor { typedef enum VkFilter { VK_FILTER_NEAREST = 0, VK_FILTER_LINEAR = 1, - VK_FILTER_CUBIC_IMG = 1000015000, - VK_FILTER_CUBIC_EXT = VK_FILTER_CUBIC_IMG, + VK_FILTER_CUBIC_EXT = 1000015000, + VK_FILTER_CUBIC_IMG = VK_FILTER_CUBIC_EXT, VK_FILTER_MAX_ENUM = 0x7FFFFFFF } VkFilter; @@ -1885,8 +1975,11 @@ typedef enum VkDescriptorType { VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK = 1000138000, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR = 1000150000, VK_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_NV = 1000165000, - VK_DESCRIPTOR_TYPE_MUTABLE_VALVE = 1000351000, + VK_DESCRIPTOR_TYPE_SAMPLE_WEIGHT_IMAGE_QCOM = 1000440000, + VK_DESCRIPTOR_TYPE_BLOCK_MATCH_IMAGE_QCOM = 1000440001, + VK_DESCRIPTOR_TYPE_MUTABLE_EXT = 1000351000, VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK_EXT = VK_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK, + VK_DESCRIPTOR_TYPE_MUTABLE_VALVE = VK_DESCRIPTOR_TYPE_MUTABLE_EXT, VK_DESCRIPTOR_TYPE_MAX_ENUM = 0x7FFFFFFF } VkDescriptorType; @@ -1984,14 +2077,15 @@ typedef enum VkImageAspectFlagBits { VK_IMAGE_ASPECT_PLANE_0_BIT = 0x00000010, VK_IMAGE_ASPECT_PLANE_1_BIT = 0x00000020, VK_IMAGE_ASPECT_PLANE_2_BIT = 0x00000040, + VK_IMAGE_ASPECT_NONE = 0, VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT = 0x00000080, VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT = 0x00000100, VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT = 0x00000200, VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT = 0x00000400, - VK_IMAGE_ASPECT_NONE_KHR = 0, VK_IMAGE_ASPECT_PLANE_0_BIT_KHR = VK_IMAGE_ASPECT_PLANE_0_BIT, VK_IMAGE_ASPECT_PLANE_1_BIT_KHR = VK_IMAGE_ASPECT_PLANE_1_BIT, VK_IMAGE_ASPECT_PLANE_2_BIT_KHR = VK_IMAGE_ASPECT_PLANE_2_BIT, + VK_IMAGE_ASPECT_NONE_KHR = VK_IMAGE_ASPECT_NONE, VK_IMAGE_ASPECT_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageAspectFlagBits; typedef VkFlags VkImageAspectFlags; @@ -2020,7 +2114,6 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_DISJOINT_BIT = 0x00400000, VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT = 0x00800000, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT = 0x00010000, - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = 0x00002000, #ifdef VK_ENABLE_BETA_EXTENSIONS VK_FORMAT_FEATURE_VIDEO_DECODE_OUTPUT_BIT_KHR = 0x02000000, #endif @@ -2028,6 +2121,7 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_VIDEO_DECODE_DPB_BIT_KHR = 0x04000000, #endif VK_FORMAT_FEATURE_ACCELERATION_STRUCTURE_VERTEX_BUFFER_BIT_KHR = 0x20000000, + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = 0x00002000, VK_FORMAT_FEATURE_FRAGMENT_DENSITY_MAP_BIT_EXT = 0x01000000, VK_FORMAT_FEATURE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x40000000, #ifdef VK_ENABLE_BETA_EXTENSIONS @@ -2036,6 +2130,7 @@ typedef enum VkFormatFeatureFlagBits { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_FORMAT_FEATURE_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000, #endif + VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT, VK_FORMAT_FEATURE_TRANSFER_SRC_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT, VK_FORMAT_FEATURE_TRANSFER_DST_BIT_KHR = VK_FORMAT_FEATURE_TRANSFER_DST_BIT, VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_MINMAX_BIT, @@ -2046,7 +2141,6 @@ typedef enum VkFormatFeatureFlagBits { VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT_KHR = VK_FORMAT_FEATURE_SAMPLED_IMAGE_YCBCR_CONVERSION_CHROMA_RECONSTRUCTION_EXPLICIT_FORCEABLE_BIT, VK_FORMAT_FEATURE_DISJOINT_BIT_KHR = VK_FORMAT_FEATURE_DISJOINT_BIT, VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT_KHR = VK_FORMAT_FEATURE_COSITED_CHROMA_SAMPLES_BIT, - VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT = VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_IMG, VK_FORMAT_FEATURE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkFormatFeatureFlagBits; typedef VkFlags VkFormatFeatureFlags; @@ -2067,6 +2161,8 @@ typedef enum VkImageCreateFlagBits { VK_IMAGE_CREATE_CORNER_SAMPLED_BIT_NV = 0x00002000, VK_IMAGE_CREATE_SAMPLE_LOCATIONS_COMPATIBLE_DEPTH_BIT_EXT = 0x00001000, VK_IMAGE_CREATE_SUBSAMPLED_BIT_EXT = 0x00004000, + VK_IMAGE_CREATE_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_BIT_EXT = 0x00040000, + VK_IMAGE_CREATE_2D_VIEW_COMPATIBLE_BIT_EXT = 0x00020000, VK_IMAGE_CREATE_FRAGMENT_DENSITY_MAP_OFFSET_BIT_QCOM = 0x00008000, VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT_KHR = VK_IMAGE_CREATE_SPLIT_INSTANCE_BIND_REGIONS_BIT, VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT_KHR = VK_IMAGE_CREATE_2D_ARRAY_COMPATIBLE_BIT, @@ -2119,11 +2215,19 @@ typedef enum VkImageUsageFlagBits { #ifdef VK_ENABLE_BETA_EXTENSIONS VK_IMAGE_USAGE_VIDEO_ENCODE_DPB_BIT_KHR = 0x00008000, #endif + VK_IMAGE_USAGE_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x00080000, VK_IMAGE_USAGE_INVOCATION_MASK_BIT_HUAWEI = 0x00040000, + VK_IMAGE_USAGE_SAMPLE_WEIGHT_BIT_QCOM = 0x00100000, + VK_IMAGE_USAGE_SAMPLE_BLOCK_MATCH_BIT_QCOM = 0x00200000, VK_IMAGE_USAGE_SHADING_RATE_IMAGE_BIT_NV = VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_IMAGE_USAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkImageUsageFlagBits; typedef VkFlags VkImageUsageFlags; + +typedef enum VkInstanceCreateFlagBits { + VK_INSTANCE_CREATE_ENUMERATE_PORTABILITY_BIT_KHR = 0x00000001, + VK_INSTANCE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkInstanceCreateFlagBits; typedef VkFlags VkInstanceCreateFlags; typedef enum VkMemoryHeapFlagBits { @@ -2194,14 +2298,16 @@ typedef enum VkPipelineStageFlagBits { VK_PIPELINE_STAGE_CONDITIONAL_RENDERING_BIT_EXT = 0x00040000, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR = 0x02000000, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR = 0x00200000, - VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV = 0x00080000, - VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV = 0x00100000, VK_PIPELINE_STAGE_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000, VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = 0x00400000, VK_PIPELINE_STAGE_COMMAND_PREPROCESS_BIT_NV = 0x00020000, + VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT = 0x00080000, + VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT = 0x00100000, VK_PIPELINE_STAGE_SHADING_RATE_IMAGE_BIT_NV = VK_PIPELINE_STAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_NV = VK_PIPELINE_STAGE_RAY_TRACING_SHADER_BIT_KHR, VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_NV = VK_PIPELINE_STAGE_ACCELERATION_STRUCTURE_BUILD_BIT_KHR, + VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV = VK_PIPELINE_STAGE_TASK_SHADER_BIT_EXT, + VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV = VK_PIPELINE_STAGE_MESH_SHADER_BIT_EXT, VK_PIPELINE_STAGE_NONE_KHR = VK_PIPELINE_STAGE_NONE, VK_PIPELINE_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineStageFlagBits; @@ -2248,6 +2354,8 @@ typedef enum VkQueryPipelineStatisticFlagBits { VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_CONTROL_SHADER_PATCHES_BIT = 0x00000100, VK_QUERY_PIPELINE_STATISTIC_TESSELLATION_EVALUATION_SHADER_INVOCATIONS_BIT = 0x00000200, VK_QUERY_PIPELINE_STATISTIC_COMPUTE_SHADER_INVOCATIONS_BIT = 0x00000400, + VK_QUERY_PIPELINE_STATISTIC_TASK_SHADER_INVOCATIONS_BIT_EXT = 0x00000800, + VK_QUERY_PIPELINE_STATISTIC_MESH_SHADER_INVOCATIONS_BIT_EXT = 0x00001000, VK_QUERY_PIPELINE_STATISTIC_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkQueryPipelineStatisticFlagBits; typedef VkFlags VkQueryPipelineStatisticFlags; @@ -2360,7 +2468,11 @@ typedef enum VkPipelineCreateFlagBits { VK_PIPELINE_CREATE_CAPTURE_INTERNAL_REPRESENTATIONS_BIT_KHR = 0x00000080, VK_PIPELINE_CREATE_INDIRECT_BINDABLE_BIT_NV = 0x00040000, VK_PIPELINE_CREATE_LIBRARY_BIT_KHR = 0x00000800, + VK_PIPELINE_CREATE_RETAIN_LINK_TIME_OPTIMIZATION_INFO_BIT_EXT = 0x00800000, + VK_PIPELINE_CREATE_LINK_TIME_OPTIMIZATION_BIT_EXT = 0x00000400, VK_PIPELINE_CREATE_RAY_TRACING_ALLOW_MOTION_BIT_NV = 0x00100000, + VK_PIPELINE_CREATE_COLOR_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x02000000, + VK_PIPELINE_CREATE_DEPTH_STENCIL_ATTACHMENT_FEEDBACK_LOOP_BIT_EXT = 0x04000000, VK_PIPELINE_CREATE_DISPATCH_BASE = VK_PIPELINE_CREATE_DISPATCH_BASE_BIT, VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR, VK_PIPELINE_RASTERIZATION_STATE_CREATE_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT = VK_PIPELINE_CREATE_RENDERING_FRAGMENT_DENSITY_MAP_ATTACHMENT_BIT_EXT, @@ -2396,8 +2508,8 @@ typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_MISS_BIT_KHR = 0x00000800, VK_SHADER_STAGE_INTERSECTION_BIT_KHR = 0x00001000, VK_SHADER_STAGE_CALLABLE_BIT_KHR = 0x00002000, - VK_SHADER_STAGE_TASK_BIT_NV = 0x00000040, - VK_SHADER_STAGE_MESH_BIT_NV = 0x00000080, + VK_SHADER_STAGE_TASK_BIT_EXT = 0x00000040, + VK_SHADER_STAGE_MESH_BIT_EXT = 0x00000080, VK_SHADER_STAGE_SUBPASS_SHADING_BIT_HUAWEI = 0x00004000, VK_SHADER_STAGE_RAYGEN_BIT_NV = VK_SHADER_STAGE_RAYGEN_BIT_KHR, VK_SHADER_STAGE_ANY_HIT_BIT_NV = VK_SHADER_STAGE_ANY_HIT_BIT_KHR, @@ -2405,6 +2517,8 @@ typedef enum VkShaderStageFlagBits { VK_SHADER_STAGE_MISS_BIT_NV = VK_SHADER_STAGE_MISS_BIT_KHR, VK_SHADER_STAGE_INTERSECTION_BIT_NV = VK_SHADER_STAGE_INTERSECTION_BIT_KHR, VK_SHADER_STAGE_CALLABLE_BIT_NV = VK_SHADER_STAGE_CALLABLE_BIT_KHR, + VK_SHADER_STAGE_TASK_BIT_NV = VK_SHADER_STAGE_TASK_BIT_EXT, + VK_SHADER_STAGE_MESH_BIT_NV = VK_SHADER_STAGE_MESH_BIT_EXT, VK_SHADER_STAGE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkShaderStageFlagBits; @@ -2424,24 +2538,34 @@ typedef VkFlags VkPipelineRasterizationStateCreateFlags; typedef VkFlags VkPipelineMultisampleStateCreateFlags; typedef enum VkPipelineDepthStencilStateCreateFlagBits { - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = 0x00000001, - VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = 0x00000002, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000001, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000002, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, + VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, VK_PIPELINE_DEPTH_STENCIL_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineDepthStencilStateCreateFlagBits; typedef VkFlags VkPipelineDepthStencilStateCreateFlags; typedef enum VkPipelineColorBlendStateCreateFlagBits { - VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM = 0x00000001, + VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT = 0x00000001, + VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_ARM = VK_PIPELINE_COLOR_BLEND_STATE_CREATE_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_BIT_EXT, VK_PIPELINE_COLOR_BLEND_STATE_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkPipelineColorBlendStateCreateFlagBits; typedef VkFlags VkPipelineColorBlendStateCreateFlags; typedef VkFlags VkPipelineDynamicStateCreateFlags; + +typedef enum VkPipelineLayoutCreateFlagBits { + VK_PIPELINE_LAYOUT_CREATE_INDEPENDENT_SETS_BIT_EXT = 0x00000002, + VK_PIPELINE_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF +} VkPipelineLayoutCreateFlagBits; typedef VkFlags VkPipelineLayoutCreateFlags; typedef VkFlags VkShaderStageFlags; typedef enum VkSamplerCreateFlagBits { VK_SAMPLER_CREATE_SUBSAMPLED_BIT_EXT = 0x00000001, VK_SAMPLER_CREATE_SUBSAMPLED_COARSE_RECONSTRUCTION_BIT_EXT = 0x00000002, + VK_SAMPLER_CREATE_NON_SEAMLESS_CUBE_MAP_BIT_EXT = 0x00000004, + VK_SAMPLER_CREATE_IMAGE_PROCESSING_BIT_QCOM = 0x00000010, VK_SAMPLER_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSamplerCreateFlagBits; typedef VkFlags VkSamplerCreateFlags; @@ -2449,8 +2573,9 @@ typedef VkFlags VkSamplerCreateFlags; typedef enum VkDescriptorPoolCreateFlagBits { VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT = 0x00000001, VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT = 0x00000002, - VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE = 0x00000004, + VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT = 0x00000004, VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT_EXT = VK_DESCRIPTOR_POOL_CREATE_UPDATE_AFTER_BIND_BIT, + VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_VALVE = VK_DESCRIPTOR_POOL_CREATE_HOST_ONLY_BIT_EXT, VK_DESCRIPTOR_POOL_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorPoolCreateFlagBits; typedef VkFlags VkDescriptorPoolCreateFlags; @@ -2459,8 +2584,9 @@ typedef VkFlags VkDescriptorPoolResetFlags; typedef enum VkDescriptorSetLayoutCreateFlagBits { VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT = 0x00000002, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR = 0x00000001, - VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE = 0x00000004, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT = 0x00000004, VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT_EXT = VK_DESCRIPTOR_SET_LAYOUT_CREATE_UPDATE_AFTER_BIND_POOL_BIT, + VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_VALVE = VK_DESCRIPTOR_SET_LAYOUT_CREATE_HOST_ONLY_POOL_BIT_EXT, VK_DESCRIPTOR_SET_LAYOUT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkDescriptorSetLayoutCreateFlagBits; typedef VkFlags VkDescriptorSetLayoutCreateFlags; @@ -2475,6 +2601,7 @@ typedef enum VkDependencyFlagBits { VK_DEPENDENCY_BY_REGION_BIT = 0x00000001, VK_DEPENDENCY_DEVICE_GROUP_BIT = 0x00000004, VK_DEPENDENCY_VIEW_LOCAL_BIT = 0x00000002, + VK_DEPENDENCY_FEEDBACK_LOOP_BIT_EXT = 0x00000008, VK_DEPENDENCY_VIEW_LOCAL_BIT_KHR = VK_DEPENDENCY_VIEW_LOCAL_BIT, VK_DEPENDENCY_DEVICE_GROUP_BIT_KHR = VK_DEPENDENCY_DEVICE_GROUP_BIT, VK_DEPENDENCY_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF @@ -2499,9 +2626,13 @@ typedef enum VkSubpassDescriptionFlagBits { VK_SUBPASS_DESCRIPTION_PER_VIEW_POSITION_X_ONLY_BIT_NVX = 0x00000002, VK_SUBPASS_DESCRIPTION_FRAGMENT_REGION_BIT_QCOM = 0x00000004, VK_SUBPASS_DESCRIPTION_SHADER_RESOLVE_BIT_QCOM = 0x00000008, - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM = 0x00000010, - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = 0x00000020, - VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = 0x00000040, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT = 0x00000010, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT = 0x00000020, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT = 0x00000040, + VK_SUBPASS_DESCRIPTION_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000080, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_COLOR_ACCESS_BIT_EXT, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_DEPTH_ACCESS_BIT_EXT, + VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_ARM = VK_SUBPASS_DESCRIPTION_RASTERIZATION_ORDER_ATTACHMENT_STENCIL_ACCESS_BIT_EXT, VK_SUBPASS_DESCRIPTION_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkSubpassDescriptionFlagBits; typedef VkFlags VkSubpassDescriptionFlags; @@ -5504,6 +5635,7 @@ typedef enum VkDriverId { VK_DRIVER_ID_MESA_PANVK = 20, VK_DRIVER_ID_SAMSUNG_PROPRIETARY = 21, VK_DRIVER_ID_MESA_VENUS = 22, + VK_DRIVER_ID_MESA_DOZEN = 23, VK_DRIVER_ID_AMD_PROPRIETARY_KHR = VK_DRIVER_ID_AMD_PROPRIETARY, VK_DRIVER_ID_AMD_OPEN_SOURCE_KHR = VK_DRIVER_ID_AMD_OPEN_SOURCE, VK_DRIVER_ID_MESA_RADV_KHR = VK_DRIVER_ID_MESA_RADV, @@ -6259,10 +6391,6 @@ typedef enum VkToolPurposeFlagBits { VK_TOOL_PURPOSE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF } VkToolPurposeFlagBits; typedef VkFlags VkToolPurposeFlags; - -typedef enum VkPrivateDataSlotCreateFlagBits { - VK_PRIVATE_DATA_SLOT_CREATE_FLAG_BITS_MAX_ENUM = 0x7FFFFFFF -} VkPrivateDataSlotCreateFlagBits; typedef VkFlags VkPrivateDataSlotCreateFlags; typedef VkFlags64 VkPipelineStageFlags2; @@ -6338,8 +6466,11 @@ static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_FRAGMENT_DENSITY_PROCESS_BIT_EXT = 0x00800000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_NV = 0x00080000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_NV = 0x00100000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_TASK_SHADER_BIT_EXT = 0x00080000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_MESH_SHADER_BIT_EXT = 0x00100000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_SUBPASS_SHADING_BIT_HUAWEI = 0x8000000000ULL; static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_INVOCATION_MASK_BIT_HUAWEI = 0x10000000000ULL; +static const VkPipelineStageFlagBits2 VK_PIPELINE_STAGE_2_ACCELERATION_STRUCTURE_COPY_BIT_KHR = 0x10000000ULL; typedef VkFlags64 VkAccessFlags2; @@ -6414,6 +6545,7 @@ static const VkAccessFlagBits2 VK_ACCESS_2_ACCELERATION_STRUCTURE_WRITE_BIT_NV = static const VkAccessFlagBits2 VK_ACCESS_2_FRAGMENT_DENSITY_MAP_READ_BIT_EXT = 0x01000000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_COLOR_ATTACHMENT_READ_NONCOHERENT_BIT_EXT = 0x00080000ULL; static const VkAccessFlagBits2 VK_ACCESS_2_INVOCATION_MASK_READ_BIT_HUAWEI = 0x8000000000ULL; +static const VkAccessFlagBits2 VK_ACCESS_2_SHADER_BINDING_TABLE_READ_BIT_KHR = 0x10000000000ULL; typedef enum VkSubmitFlagBits { @@ -6427,6 +6559,7 @@ typedef enum VkRenderingFlagBits { VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT = 0x00000001, VK_RENDERING_SUSPENDING_BIT = 0x00000002, VK_RENDERING_RESUMING_BIT = 0x00000004, + VK_RENDERING_ENABLE_LEGACY_DITHERING_BIT_EXT = 0x00000008, VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT_KHR = VK_RENDERING_CONTENTS_SECONDARY_COMMAND_BUFFERS_BIT, VK_RENDERING_SUSPENDING_BIT_KHR = VK_RENDERING_SUSPENDING_BIT, VK_RENDERING_RESUMING_BIT_KHR = VK_RENDERING_RESUMING_BIT, @@ -6507,6 +6640,10 @@ static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_INPUT_BIT static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_VIDEO_ENCODE_DPB_BIT_KHR = 0x10000000ULL; #endif static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_LINEAR_COLOR_ATTACHMENT_BIT_NV = 0x4000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_IMAGE_BIT_QCOM = 0x400000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_WEIGHT_SAMPLED_IMAGE_BIT_QCOM = 0x800000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BLOCK_MATCHING_BIT_QCOM = 0x1000000000ULL; +static const VkFormatFeatureFlagBits2 VK_FORMAT_FEATURE_2_BOX_FILTER_SAMPLED_BIT_QCOM = 0x2000000000ULL; typedef struct VkPhysicalDeviceVulkan13Features { VkStructureType sType; @@ -9366,6 +9503,23 @@ VKAPI_ATTR void VKAPI_CALL vkGetQueueCheckpointData2NV( #endif +#define VK_KHR_fragment_shader_barycentric 1 +#define VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION 1 +#define VK_KHR_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME "VK_KHR_fragment_shader_barycentric" +typedef struct VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 fragmentShaderBarycentric; +} VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR; + +typedef struct VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR { + VkStructureType sType; + void* pNext; + VkBool32 triStripVertexOrderIndependentOfProvokingVertex; +} VkPhysicalDeviceFragmentShaderBarycentricPropertiesKHR; + + + #define VK_KHR_shader_subgroup_uniform_control_flow 1 #define VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_SPEC_VERSION 1 #define VK_KHR_SHADER_SUBGROUP_UNIFORM_CONTROL_FLOW_EXTENSION_NAME "VK_KHR_shader_subgroup_uniform_control_flow" @@ -9458,7 +9612,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdResolveImage2KHR( #define VK_KHR_format_feature_flags2 1 -#define VK_KHR_FORMAT_FEATURE_FLAGS_2_SPEC_VERSION 1 +#define VK_KHR_FORMAT_FEATURE_FLAGS_2_SPEC_VERSION 2 #define VK_KHR_FORMAT_FEATURE_FLAGS_2_EXTENSION_NAME "VK_KHR_format_feature_flags2" typedef VkFormatFeatureFlags2 VkFormatFeatureFlags2KHR; @@ -9468,6 +9622,47 @@ typedef VkFormatProperties3 VkFormatProperties3KHR; +#define VK_KHR_ray_tracing_maintenance1 1 +#define VK_KHR_RAY_TRACING_MAINTENANCE_1_SPEC_VERSION 1 +#define VK_KHR_RAY_TRACING_MAINTENANCE_1_EXTENSION_NAME "VK_KHR_ray_tracing_maintenance1" +typedef struct VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR { + VkStructureType sType; + void* pNext; + VkBool32 rayTracingMaintenance1; + VkBool32 rayTracingPipelineTraceRaysIndirect2; +} VkPhysicalDeviceRayTracingMaintenance1FeaturesKHR; + +typedef struct VkTraceRaysIndirectCommand2KHR { + VkDeviceAddress raygenShaderRecordAddress; + VkDeviceSize raygenShaderRecordSize; + VkDeviceAddress missShaderBindingTableAddress; + VkDeviceSize missShaderBindingTableSize; + VkDeviceSize missShaderBindingTableStride; + VkDeviceAddress hitShaderBindingTableAddress; + VkDeviceSize hitShaderBindingTableSize; + VkDeviceSize hitShaderBindingTableStride; + VkDeviceAddress callableShaderBindingTableAddress; + VkDeviceSize callableShaderBindingTableSize; + VkDeviceSize callableShaderBindingTableStride; + uint32_t width; + uint32_t height; + uint32_t depth; +} VkTraceRaysIndirectCommand2KHR; + +typedef void (VKAPI_PTR *PFN_vkCmdTraceRaysIndirect2KHR)(VkCommandBuffer commandBuffer, VkDeviceAddress indirectDeviceAddress); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdTraceRaysIndirect2KHR( + VkCommandBuffer commandBuffer, + VkDeviceAddress indirectDeviceAddress); +#endif + + +#define VK_KHR_portability_enumeration 1 +#define VK_KHR_PORTABILITY_ENUMERATION_SPEC_VERSION 1 +#define VK_KHR_PORTABILITY_ENUMERATION_EXTENSION_NAME "VK_KHR_portability_enumeration" + + #define VK_KHR_maintenance4 1 #define VK_KHR_MAINTENANCE_4_SPEC_VERSION 2 #define VK_KHR_MAINTENANCE_4_EXTENSION_NAME "VK_KHR_maintenance4" @@ -10153,6 +10348,51 @@ typedef struct VkPhysicalDeviceASTCDecodeFeaturesEXT { +#define VK_EXT_pipeline_robustness 1 +#define VK_EXT_PIPELINE_ROBUSTNESS_SPEC_VERSION 1 +#define VK_EXT_PIPELINE_ROBUSTNESS_EXTENSION_NAME "VK_EXT_pipeline_robustness" + +typedef enum VkPipelineRobustnessBufferBehaviorEXT { + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DEVICE_DEFAULT_EXT = 0, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_DISABLED_EXT = 1, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_EXT = 2, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_ROBUST_BUFFER_ACCESS_2_EXT = 3, + VK_PIPELINE_ROBUSTNESS_BUFFER_BEHAVIOR_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPipelineRobustnessBufferBehaviorEXT; + +typedef enum VkPipelineRobustnessImageBehaviorEXT { + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DEVICE_DEFAULT_EXT = 0, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_DISABLED_EXT = 1, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_EXT = 2, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_ROBUST_IMAGE_ACCESS_2_EXT = 3, + VK_PIPELINE_ROBUSTNESS_IMAGE_BEHAVIOR_MAX_ENUM_EXT = 0x7FFFFFFF +} VkPipelineRobustnessImageBehaviorEXT; +typedef struct VkPhysicalDevicePipelineRobustnessFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 pipelineRobustness; +} VkPhysicalDevicePipelineRobustnessFeaturesEXT; + +typedef struct VkPhysicalDevicePipelineRobustnessPropertiesEXT { + VkStructureType sType; + void* pNext; + VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessStorageBuffers; + VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessUniformBuffers; + VkPipelineRobustnessBufferBehaviorEXT defaultRobustnessVertexInputs; + VkPipelineRobustnessImageBehaviorEXT defaultRobustnessImages; +} VkPhysicalDevicePipelineRobustnessPropertiesEXT; + +typedef struct VkPipelineRobustnessCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkPipelineRobustnessBufferBehaviorEXT storageBuffers; + VkPipelineRobustnessBufferBehaviorEXT uniformBuffers; + VkPipelineRobustnessBufferBehaviorEXT vertexInputs; + VkPipelineRobustnessImageBehaviorEXT images; +} VkPipelineRobustnessCreateInfoEXT; + + + #define VK_EXT_conditional_rendering 1 #define VK_EXT_CONDITIONAL_RENDERING_SPEC_VERSION 2 #define VK_EXT_CONDITIONAL_RENDERING_EXTENSION_NAME "VK_EXT_conditional_rendering" @@ -11883,11 +12123,7 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountNV( #define VK_NV_fragment_shader_barycentric 1 #define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_SPEC_VERSION 1 #define VK_NV_FRAGMENT_SHADER_BARYCENTRIC_EXTENSION_NAME "VK_NV_fragment_shader_barycentric" -typedef struct VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV { - VkStructureType sType; - void* pNext; - VkBool32 fragmentShaderBarycentric; -} VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV; +typedef VkPhysicalDeviceFragmentShaderBarycentricFeaturesKHR VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV; @@ -12779,6 +13015,7 @@ typedef enum VkIndirectCommandsTokenTypeNV { VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_INDEXED_NV = 5, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_NV = 6, VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_TASKS_NV = 7, + VK_INDIRECT_COMMANDS_TOKEN_TYPE_DRAW_MESH_TASKS_NV = 1000328000, VK_INDIRECT_COMMANDS_TOKEN_TYPE_MAX_ENUM_NV = 0x7FFFFFFF } VkIndirectCommandsTokenTypeNV; @@ -12988,7 +13225,7 @@ typedef VkPhysicalDeviceTexelBufferAlignmentProperties VkPhysicalDeviceTexelBuff #define VK_QCOM_render_pass_transform 1 -#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 2 +#define VK_QCOM_RENDER_PASS_TRANSFORM_SPEC_VERSION 3 #define VK_QCOM_RENDER_PASS_TRANSFORM_EXTENSION_NAME "VK_QCOM_render_pass_transform" typedef struct VkRenderPassTransformBeginInfoQCOM { VkStructureType sType; @@ -13127,8 +13364,6 @@ typedef VkPrivateDataSlot VkPrivateDataSlotEXT; #define VK_EXT_PRIVATE_DATA_EXTENSION_NAME "VK_EXT_private_data" typedef VkPrivateDataSlotCreateFlags VkPrivateDataSlotCreateFlagsEXT; -typedef VkPrivateDataSlotCreateFlagBits VkPrivateDataSlotCreateFlagBitsEXT; - typedef VkPhysicalDevicePrivateDataFeatures VkPhysicalDevicePrivateDataFeaturesEXT; typedef VkDevicePrivateDataCreateInfo VkDevicePrivateDataCreateInfoEXT; @@ -13176,13 +13411,14 @@ typedef VkPhysicalDevicePipelineCreationCacheControlFeatures VkPhysicalDevicePip #define VK_NV_device_diagnostics_config 1 -#define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION 1 +#define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_SPEC_VERSION 2 #define VK_NV_DEVICE_DIAGNOSTICS_CONFIG_EXTENSION_NAME "VK_NV_device_diagnostics_config" typedef enum VkDeviceDiagnosticsConfigFlagBitsNV { VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_DEBUG_INFO_BIT_NV = 0x00000001, VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_RESOURCE_TRACKING_BIT_NV = 0x00000002, VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_AUTOMATIC_CHECKPOINTS_BIT_NV = 0x00000004, + VK_DEVICE_DIAGNOSTICS_CONFIG_ENABLE_SHADER_ERROR_REPORTING_BIT_NV = 0x00000008, VK_DEVICE_DIAGNOSTICS_CONFIG_FLAG_BITS_MAX_ENUM_NV = 0x7FFFFFFF } VkDeviceDiagnosticsConfigFlagBitsNV; typedef VkFlags VkDeviceDiagnosticsConfigFlagsNV; @@ -13205,6 +13441,50 @@ typedef struct VkDeviceDiagnosticsConfigCreateInfoNV { #define VK_QCOM_RENDER_PASS_STORE_OPS_EXTENSION_NAME "VK_QCOM_render_pass_store_ops" +#define VK_EXT_graphics_pipeline_library 1 +#define VK_EXT_GRAPHICS_PIPELINE_LIBRARY_SPEC_VERSION 1 +#define VK_EXT_GRAPHICS_PIPELINE_LIBRARY_EXTENSION_NAME "VK_EXT_graphics_pipeline_library" + +typedef enum VkGraphicsPipelineLibraryFlagBitsEXT { + VK_GRAPHICS_PIPELINE_LIBRARY_VERTEX_INPUT_INTERFACE_BIT_EXT = 0x00000001, + VK_GRAPHICS_PIPELINE_LIBRARY_PRE_RASTERIZATION_SHADERS_BIT_EXT = 0x00000002, + VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_SHADER_BIT_EXT = 0x00000004, + VK_GRAPHICS_PIPELINE_LIBRARY_FRAGMENT_OUTPUT_INTERFACE_BIT_EXT = 0x00000008, + VK_GRAPHICS_PIPELINE_LIBRARY_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkGraphicsPipelineLibraryFlagBitsEXT; +typedef VkFlags VkGraphicsPipelineLibraryFlagsEXT; +typedef struct VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 graphicsPipelineLibrary; +} VkPhysicalDeviceGraphicsPipelineLibraryFeaturesEXT; + +typedef struct VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT { + VkStructureType sType; + void* pNext; + VkBool32 graphicsPipelineLibraryFastLinking; + VkBool32 graphicsPipelineLibraryIndependentInterpolationDecoration; +} VkPhysicalDeviceGraphicsPipelineLibraryPropertiesEXT; + +typedef struct VkGraphicsPipelineLibraryCreateInfoEXT { + VkStructureType sType; + void* pNext; + VkGraphicsPipelineLibraryFlagsEXT flags; +} VkGraphicsPipelineLibraryCreateInfoEXT; + + + +#define VK_AMD_shader_early_and_late_fragment_tests 1 +#define VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_SPEC_VERSION 1 +#define VK_AMD_SHADER_EARLY_AND_LATE_FRAGMENT_TESTS_EXTENSION_NAME "VK_AMD_shader_early_and_late_fragment_tests" +typedef struct VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD { + VkStructureType sType; + void* pNext; + VkBool32 shaderEarlyAndLateFragmentTests; +} VkPhysicalDeviceShaderEarlyAndLateFragmentTestsFeaturesAMD; + + + #define VK_NV_fragment_shading_rate_enums 1 #define VK_NV_FRAGMENT_SHADING_RATE_ENUMS_SPEC_VERSION 1 #define VK_NV_FRAGMENT_SHADING_RATE_ENUMS_EXTENSION_NAME "VK_NV_fragment_shading_rate_enums" @@ -13401,6 +13681,103 @@ typedef VkPhysicalDeviceImageRobustnessFeatures VkPhysicalDeviceImageRobustnessF +#define VK_EXT_image_compression_control 1 +#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SPEC_VERSION 1 +#define VK_EXT_IMAGE_COMPRESSION_CONTROL_EXTENSION_NAME "VK_EXT_image_compression_control" + +typedef enum VkImageCompressionFlagBitsEXT { + VK_IMAGE_COMPRESSION_DEFAULT_EXT = 0, + VK_IMAGE_COMPRESSION_FIXED_RATE_DEFAULT_EXT = 0x00000001, + VK_IMAGE_COMPRESSION_FIXED_RATE_EXPLICIT_EXT = 0x00000002, + VK_IMAGE_COMPRESSION_DISABLED_EXT = 0x00000004, + VK_IMAGE_COMPRESSION_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkImageCompressionFlagBitsEXT; +typedef VkFlags VkImageCompressionFlagsEXT; + +typedef enum VkImageCompressionFixedRateFlagBitsEXT { + VK_IMAGE_COMPRESSION_FIXED_RATE_NONE_EXT = 0, + VK_IMAGE_COMPRESSION_FIXED_RATE_1BPC_BIT_EXT = 0x00000001, + VK_IMAGE_COMPRESSION_FIXED_RATE_2BPC_BIT_EXT = 0x00000002, + VK_IMAGE_COMPRESSION_FIXED_RATE_3BPC_BIT_EXT = 0x00000004, + VK_IMAGE_COMPRESSION_FIXED_RATE_4BPC_BIT_EXT = 0x00000008, + VK_IMAGE_COMPRESSION_FIXED_RATE_5BPC_BIT_EXT = 0x00000010, + VK_IMAGE_COMPRESSION_FIXED_RATE_6BPC_BIT_EXT = 0x00000020, + VK_IMAGE_COMPRESSION_FIXED_RATE_7BPC_BIT_EXT = 0x00000040, + VK_IMAGE_COMPRESSION_FIXED_RATE_8BPC_BIT_EXT = 0x00000080, + VK_IMAGE_COMPRESSION_FIXED_RATE_9BPC_BIT_EXT = 0x00000100, + VK_IMAGE_COMPRESSION_FIXED_RATE_10BPC_BIT_EXT = 0x00000200, + VK_IMAGE_COMPRESSION_FIXED_RATE_11BPC_BIT_EXT = 0x00000400, + VK_IMAGE_COMPRESSION_FIXED_RATE_12BPC_BIT_EXT = 0x00000800, + VK_IMAGE_COMPRESSION_FIXED_RATE_13BPC_BIT_EXT = 0x00001000, + VK_IMAGE_COMPRESSION_FIXED_RATE_14BPC_BIT_EXT = 0x00002000, + VK_IMAGE_COMPRESSION_FIXED_RATE_15BPC_BIT_EXT = 0x00004000, + VK_IMAGE_COMPRESSION_FIXED_RATE_16BPC_BIT_EXT = 0x00008000, + VK_IMAGE_COMPRESSION_FIXED_RATE_17BPC_BIT_EXT = 0x00010000, + VK_IMAGE_COMPRESSION_FIXED_RATE_18BPC_BIT_EXT = 0x00020000, + VK_IMAGE_COMPRESSION_FIXED_RATE_19BPC_BIT_EXT = 0x00040000, + VK_IMAGE_COMPRESSION_FIXED_RATE_20BPC_BIT_EXT = 0x00080000, + VK_IMAGE_COMPRESSION_FIXED_RATE_21BPC_BIT_EXT = 0x00100000, + VK_IMAGE_COMPRESSION_FIXED_RATE_22BPC_BIT_EXT = 0x00200000, + VK_IMAGE_COMPRESSION_FIXED_RATE_23BPC_BIT_EXT = 0x00400000, + VK_IMAGE_COMPRESSION_FIXED_RATE_24BPC_BIT_EXT = 0x00800000, + VK_IMAGE_COMPRESSION_FIXED_RATE_FLAG_BITS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkImageCompressionFixedRateFlagBitsEXT; +typedef VkFlags VkImageCompressionFixedRateFlagsEXT; +typedef struct VkPhysicalDeviceImageCompressionControlFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 imageCompressionControl; +} VkPhysicalDeviceImageCompressionControlFeaturesEXT; + +typedef struct VkImageCompressionControlEXT { + VkStructureType sType; + const void* pNext; + VkImageCompressionFlagsEXT flags; + uint32_t compressionControlPlaneCount; + VkImageCompressionFixedRateFlagsEXT* pFixedRateFlags; +} VkImageCompressionControlEXT; + +typedef struct VkSubresourceLayout2EXT { + VkStructureType sType; + void* pNext; + VkSubresourceLayout subresourceLayout; +} VkSubresourceLayout2EXT; + +typedef struct VkImageSubresource2EXT { + VkStructureType sType; + void* pNext; + VkImageSubresource imageSubresource; +} VkImageSubresource2EXT; + +typedef struct VkImageCompressionPropertiesEXT { + VkStructureType sType; + void* pNext; + VkImageCompressionFlagsEXT imageCompressionFlags; + VkImageCompressionFixedRateFlagsEXT imageCompressionFixedRateFlags; +} VkImageCompressionPropertiesEXT; + +typedef void (VKAPI_PTR *PFN_vkGetImageSubresourceLayout2EXT)(VkDevice device, VkImage image, const VkImageSubresource2EXT* pSubresource, VkSubresourceLayout2EXT* pLayout); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetImageSubresourceLayout2EXT( + VkDevice device, + VkImage image, + const VkImageSubresource2EXT* pSubresource, + VkSubresourceLayout2EXT* pLayout); +#endif + + +#define VK_EXT_attachment_feedback_loop_layout 1 +#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_SPEC_VERSION 2 +#define VK_EXT_ATTACHMENT_FEEDBACK_LOOP_LAYOUT_EXTENSION_NAME "VK_EXT_attachment_feedback_loop_layout" +typedef struct VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 attachmentFeedbackLoopLayout; +} VkPhysicalDeviceAttachmentFeedbackLoopLayoutFeaturesEXT; + + + #define VK_EXT_4444_formats 1 #define VK_EXT_4444_FORMATS_SPEC_VERSION 1 #define VK_EXT_4444_FORMATS_EXTENSION_NAME "VK_EXT_4444_formats" @@ -13416,13 +13793,15 @@ typedef struct VkPhysicalDevice4444FormatsFeaturesEXT { #define VK_ARM_rasterization_order_attachment_access 1 #define VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION 1 #define VK_ARM_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME "VK_ARM_rasterization_order_attachment_access" -typedef struct VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM { +typedef struct VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT { VkStructureType sType; - const void* pNext; + void* pNext; VkBool32 rasterizationOrderColorAttachmentAccess; VkBool32 rasterizationOrderDepthAttachmentAccess; VkBool32 rasterizationOrderStencilAttachmentAccess; -} VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM; +} VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT; + +typedef VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesEXT VkPhysicalDeviceRasterizationOrderAttachmentAccessFeaturesARM; @@ -13458,23 +13837,29 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetWinrtDisplayNV( #define VK_VALVE_mutable_descriptor_type 1 #define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1 #define VK_VALVE_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME "VK_VALVE_mutable_descriptor_type" -typedef struct VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE { +typedef struct VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT { VkStructureType sType; void* pNext; VkBool32 mutableDescriptorType; -} VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE; +} VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT; + +typedef VkPhysicalDeviceMutableDescriptorTypeFeaturesEXT VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE; -typedef struct VkMutableDescriptorTypeListVALVE { +typedef struct VkMutableDescriptorTypeListEXT { uint32_t descriptorTypeCount; const VkDescriptorType* pDescriptorTypes; -} VkMutableDescriptorTypeListVALVE; +} VkMutableDescriptorTypeListEXT; -typedef struct VkMutableDescriptorTypeCreateInfoVALVE { - VkStructureType sType; - const void* pNext; - uint32_t mutableDescriptorTypeListCount; - const VkMutableDescriptorTypeListVALVE* pMutableDescriptorTypeLists; -} VkMutableDescriptorTypeCreateInfoVALVE; +typedef VkMutableDescriptorTypeListEXT VkMutableDescriptorTypeListVALVE; + +typedef struct VkMutableDescriptorTypeCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t mutableDescriptorTypeListCount; + const VkMutableDescriptorTypeListEXT* pMutableDescriptorTypeLists; +} VkMutableDescriptorTypeCreateInfoEXT; + +typedef VkMutableDescriptorTypeCreateInfoEXT VkMutableDescriptorTypeCreateInfoVALVE; @@ -13644,6 +14029,57 @@ VKAPI_ATTR VkResult VKAPI_CALL vkGetMemoryRemoteAddressNV( #endif +#define VK_EXT_pipeline_properties 1 +#define VK_EXT_PIPELINE_PROPERTIES_SPEC_VERSION 1 +#define VK_EXT_PIPELINE_PROPERTIES_EXTENSION_NAME "VK_EXT_pipeline_properties" +typedef VkPipelineInfoKHR VkPipelineInfoEXT; + +typedef struct VkPipelinePropertiesIdentifierEXT { + VkStructureType sType; + void* pNext; + uint8_t pipelineIdentifier[VK_UUID_SIZE]; +} VkPipelinePropertiesIdentifierEXT; + +typedef struct VkPhysicalDevicePipelinePropertiesFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 pipelinePropertiesIdentifier; +} VkPhysicalDevicePipelinePropertiesFeaturesEXT; + +typedef VkResult (VKAPI_PTR *PFN_vkGetPipelinePropertiesEXT)(VkDevice device, const VkPipelineInfoEXT* pPipelineInfo, VkBaseOutStructure* pPipelineProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetPipelinePropertiesEXT( + VkDevice device, + const VkPipelineInfoEXT* pPipelineInfo, + VkBaseOutStructure* pPipelineProperties); +#endif + + +#define VK_EXT_multisampled_render_to_single_sampled 1 +#define VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_SPEC_VERSION 1 +#define VK_EXT_MULTISAMPLED_RENDER_TO_SINGLE_SAMPLED_EXTENSION_NAME "VK_EXT_multisampled_render_to_single_sampled" +typedef struct VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 multisampledRenderToSingleSampled; +} VkPhysicalDeviceMultisampledRenderToSingleSampledFeaturesEXT; + +typedef struct VkSubpassResolvePerformanceQueryEXT { + VkStructureType sType; + void* pNext; + VkBool32 optimal; +} VkSubpassResolvePerformanceQueryEXT; + +typedef struct VkMultisampledRenderToSingleSampledInfoEXT { + VkStructureType sType; + const void* pNext; + VkBool32 multisampledRenderToSingleSampledEnable; + VkSampleCountFlagBits rasterizationSamples; +} VkMultisampledRenderToSingleSampledInfoEXT; + + + #define VK_EXT_extended_dynamic_state2 1 #define VK_EXT_EXTENDED_DYNAMIC_STATE_2_SPEC_VERSION 1 #define VK_EXT_EXTENDED_DYNAMIC_STATE_2_EXTENSION_NAME "VK_EXT_extended_dynamic_state2" @@ -13710,6 +14146,19 @@ VKAPI_ATTR void VKAPI_CALL vkCmdSetColorWrite #endif +#define VK_EXT_primitives_generated_query 1 +#define VK_EXT_PRIMITIVES_GENERATED_QUERY_SPEC_VERSION 1 +#define VK_EXT_PRIMITIVES_GENERATED_QUERY_EXTENSION_NAME "VK_EXT_primitives_generated_query" +typedef struct VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 primitivesGeneratedQuery; + VkBool32 primitivesGeneratedQueryWithRasterizerDiscard; + VkBool32 primitivesGeneratedQueryWithNonZeroStreams; +} VkPhysicalDevicePrimitivesGeneratedQueryFeaturesEXT; + + + #define VK_EXT_global_priority_query 1 #define VK_EXT_GLOBAL_PRIORITY_QUERY_SPEC_VERSION 1 #define VK_EXT_GLOBAL_PRIORITY_QUERY_EXTENSION_NAME "VK_EXT_global_priority_query" @@ -13786,6 +14235,18 @@ VKAPI_ATTR void VKAPI_CALL vkCmdDrawMultiIndexedEXT( #endif +#define VK_EXT_image_2d_view_of_3d 1 +#define VK_EXT_IMAGE_2D_VIEW_OF_3D_SPEC_VERSION 1 +#define VK_EXT_IMAGE_2D_VIEW_OF_3D_EXTENSION_NAME "VK_EXT_image_2d_view_of_3d" +typedef struct VkPhysicalDeviceImage2DViewOf3DFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 image2DViewOf3D; + VkBool32 sampler2DViewOf3D; +} VkPhysicalDeviceImage2DViewOf3DFeaturesEXT; + + + #define VK_EXT_load_store_op_none 1 #define VK_EXT_LOAD_STORE_OP_NONE_SPEC_VERSION 1 #define VK_EXT_LOAD_STORE_OP_NONE_EXTENSION_NAME "VK_EXT_load_store_op_none" @@ -13829,6 +14290,67 @@ VKAPI_ATTR void VKAPI_CALL vkSetDeviceMemoryPriorityEXT( #endif +#define VK_VALVE_descriptor_set_host_mapping 1 +#define VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_SPEC_VERSION 1 +#define VK_VALVE_DESCRIPTOR_SET_HOST_MAPPING_EXTENSION_NAME "VK_VALVE_descriptor_set_host_mapping" +typedef struct VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE { + VkStructureType sType; + void* pNext; + VkBool32 descriptorSetHostMapping; +} VkPhysicalDeviceDescriptorSetHostMappingFeaturesVALVE; + +typedef struct VkDescriptorSetBindingReferenceVALVE { + VkStructureType sType; + const void* pNext; + VkDescriptorSetLayout descriptorSetLayout; + uint32_t binding; +} VkDescriptorSetBindingReferenceVALVE; + +typedef struct VkDescriptorSetLayoutHostMappingInfoVALVE { + VkStructureType sType; + void* pNext; + size_t descriptorOffset; + uint32_t descriptorSize; +} VkDescriptorSetLayoutHostMappingInfoVALVE; + +typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetLayoutHostMappingInfoVALVE)(VkDevice device, const VkDescriptorSetBindingReferenceVALVE* pBindingReference, VkDescriptorSetLayoutHostMappingInfoVALVE* pHostMapping); +typedef void (VKAPI_PTR *PFN_vkGetDescriptorSetHostMappingVALVE)(VkDevice device, VkDescriptorSet descriptorSet, void** ppData); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetLayoutHostMappingInfoVALVE( + VkDevice device, + const VkDescriptorSetBindingReferenceVALVE* pBindingReference, + VkDescriptorSetLayoutHostMappingInfoVALVE* pHostMapping); + +VKAPI_ATTR void VKAPI_CALL vkGetDescriptorSetHostMappingVALVE( + VkDevice device, + VkDescriptorSet descriptorSet, + void** ppData); +#endif + + +#define VK_EXT_depth_clamp_zero_one 1 +#define VK_EXT_DEPTH_CLAMP_ZERO_ONE_SPEC_VERSION 1 +#define VK_EXT_DEPTH_CLAMP_ZERO_ONE_EXTENSION_NAME "VK_EXT_depth_clamp_zero_one" +typedef struct VkPhysicalDeviceDepthClampZeroOneFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 depthClampZeroOne; +} VkPhysicalDeviceDepthClampZeroOneFeaturesEXT; + + + +#define VK_EXT_non_seamless_cube_map 1 +#define VK_EXT_NON_SEAMLESS_CUBE_MAP_SPEC_VERSION 1 +#define VK_EXT_NON_SEAMLESS_CUBE_MAP_EXTENSION_NAME "VK_EXT_non_seamless_cube_map" +typedef struct VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 nonSeamlessCubeMap; +} VkPhysicalDeviceNonSeamlessCubeMapFeaturesEXT; + + + #define VK_QCOM_fragment_density_map_offset 1 #define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_SPEC_VERSION 1 #define VK_QCOM_FRAGMENT_DENSITY_MAP_OFFSET_EXTENSION_NAME "VK_QCOM_fragment_density_map_offset" @@ -13865,10 +14387,227 @@ typedef struct VkPhysicalDeviceLinearColorAttachmentFeaturesNV { #define VK_GOOGLE_surfaceless_query 1 -#define VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION 1 +#define VK_GOOGLE_SURFACELESS_QUERY_SPEC_VERSION 2 #define VK_GOOGLE_SURFACELESS_QUERY_EXTENSION_NAME "VK_GOOGLE_surfaceless_query" +#define VK_EXT_image_compression_control_swapchain 1 +#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_SPEC_VERSION 1 +#define VK_EXT_IMAGE_COMPRESSION_CONTROL_SWAPCHAIN_EXTENSION_NAME "VK_EXT_image_compression_control_swapchain" +typedef struct VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 imageCompressionControlSwapchain; +} VkPhysicalDeviceImageCompressionControlSwapchainFeaturesEXT; + + + +#define VK_QCOM_image_processing 1 +#define VK_QCOM_IMAGE_PROCESSING_SPEC_VERSION 1 +#define VK_QCOM_IMAGE_PROCESSING_EXTENSION_NAME "VK_QCOM_image_processing" +typedef struct VkImageViewSampleWeightCreateInfoQCOM { + VkStructureType sType; + const void* pNext; + VkOffset2D filterCenter; + VkExtent2D filterSize; + uint32_t numPhases; +} VkImageViewSampleWeightCreateInfoQCOM; + +typedef struct VkPhysicalDeviceImageProcessingFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 textureSampleWeighted; + VkBool32 textureBoxFilter; + VkBool32 textureBlockMatch; +} VkPhysicalDeviceImageProcessingFeaturesQCOM; + +typedef struct VkPhysicalDeviceImageProcessingPropertiesQCOM { + VkStructureType sType; + void* pNext; + uint32_t maxWeightFilterPhases; + VkExtent2D maxWeightFilterDimension; + VkExtent2D maxBlockMatchRegion; + VkExtent2D maxBoxFilterBlockSize; +} VkPhysicalDeviceImageProcessingPropertiesQCOM; + + + +#define VK_EXT_subpass_merge_feedback 1 +#define VK_EXT_SUBPASS_MERGE_FEEDBACK_SPEC_VERSION 2 +#define VK_EXT_SUBPASS_MERGE_FEEDBACK_EXTENSION_NAME "VK_EXT_subpass_merge_feedback" + +typedef enum VkSubpassMergeStatusEXT { + VK_SUBPASS_MERGE_STATUS_MERGED_EXT = 0, + VK_SUBPASS_MERGE_STATUS_DISALLOWED_EXT = 1, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SIDE_EFFECTS_EXT = 2, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SAMPLES_MISMATCH_EXT = 3, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_VIEWS_MISMATCH_EXT = 4, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_ALIASING_EXT = 5, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPENDENCIES_EXT = 6, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INCOMPATIBLE_INPUT_ATTACHMENT_EXT = 7, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_TOO_MANY_ATTACHMENTS_EXT = 8, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_INSUFFICIENT_STORAGE_EXT = 9, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_DEPTH_STENCIL_COUNT_EXT = 10, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_RESOLVE_ATTACHMENT_REUSE_EXT = 11, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_SINGLE_SUBPASS_EXT = 12, + VK_SUBPASS_MERGE_STATUS_NOT_MERGED_UNSPECIFIED_EXT = 13, + VK_SUBPASS_MERGE_STATUS_MAX_ENUM_EXT = 0x7FFFFFFF +} VkSubpassMergeStatusEXT; +typedef struct VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 subpassMergeFeedback; +} VkPhysicalDeviceSubpassMergeFeedbackFeaturesEXT; + +typedef struct VkRenderPassCreationControlEXT { + VkStructureType sType; + const void* pNext; + VkBool32 disallowMerging; +} VkRenderPassCreationControlEXT; + +typedef struct VkRenderPassCreationFeedbackInfoEXT { + uint32_t postMergeSubpassCount; +} VkRenderPassCreationFeedbackInfoEXT; + +typedef struct VkRenderPassCreationFeedbackCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkRenderPassCreationFeedbackInfoEXT* pRenderPassFeedback; +} VkRenderPassCreationFeedbackCreateInfoEXT; + +typedef struct VkRenderPassSubpassFeedbackInfoEXT { + VkSubpassMergeStatusEXT subpassMergeStatus; + char description[VK_MAX_DESCRIPTION_SIZE]; + uint32_t postMergeIndex; +} VkRenderPassSubpassFeedbackInfoEXT; + +typedef struct VkRenderPassSubpassFeedbackCreateInfoEXT { + VkStructureType sType; + const void* pNext; + VkRenderPassSubpassFeedbackInfoEXT* pSubpassFeedback; +} VkRenderPassSubpassFeedbackCreateInfoEXT; + + + +#define VK_EXT_shader_module_identifier 1 +#define VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT 32U +#define VK_EXT_SHADER_MODULE_IDENTIFIER_SPEC_VERSION 1 +#define VK_EXT_SHADER_MODULE_IDENTIFIER_EXTENSION_NAME "VK_EXT_shader_module_identifier" +typedef struct VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 shaderModuleIdentifier; +} VkPhysicalDeviceShaderModuleIdentifierFeaturesEXT; + +typedef struct VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT { + VkStructureType sType; + void* pNext; + uint8_t shaderModuleIdentifierAlgorithmUUID[VK_UUID_SIZE]; +} VkPhysicalDeviceShaderModuleIdentifierPropertiesEXT; + +typedef struct VkPipelineShaderStageModuleIdentifierCreateInfoEXT { + VkStructureType sType; + const void* pNext; + uint32_t identifierSize; + const uint8_t* pIdentifier; +} VkPipelineShaderStageModuleIdentifierCreateInfoEXT; + +typedef struct VkShaderModuleIdentifierEXT { + VkStructureType sType; + void* pNext; + uint32_t identifierSize; + uint8_t identifier[VK_MAX_SHADER_MODULE_IDENTIFIER_SIZE_EXT]; +} VkShaderModuleIdentifierEXT; + +typedef void (VKAPI_PTR *PFN_vkGetShaderModuleIdentifierEXT)(VkDevice device, VkShaderModule shaderModule, VkShaderModuleIdentifierEXT* pIdentifier); +typedef void (VKAPI_PTR *PFN_vkGetShaderModuleCreateInfoIdentifierEXT)(VkDevice device, const VkShaderModuleCreateInfo* pCreateInfo, VkShaderModuleIdentifierEXT* pIdentifier); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkGetShaderModuleIdentifierEXT( + VkDevice device, + VkShaderModule shaderModule, + VkShaderModuleIdentifierEXT* pIdentifier); + +VKAPI_ATTR void VKAPI_CALL vkGetShaderModuleCreateInfoIdentifierEXT( + VkDevice device, + const VkShaderModuleCreateInfo* pCreateInfo, + VkShaderModuleIdentifierEXT* pIdentifier); +#endif + + +#define VK_EXT_rasterization_order_attachment_access 1 +#define VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_SPEC_VERSION 1 +#define VK_EXT_RASTERIZATION_ORDER_ATTACHMENT_ACCESS_EXTENSION_NAME "VK_EXT_rasterization_order_attachment_access" + + +#define VK_EXT_legacy_dithering 1 +#define VK_EXT_LEGACY_DITHERING_SPEC_VERSION 1 +#define VK_EXT_LEGACY_DITHERING_EXTENSION_NAME "VK_EXT_legacy_dithering" +typedef struct VkPhysicalDeviceLegacyDitheringFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 legacyDithering; +} VkPhysicalDeviceLegacyDitheringFeaturesEXT; + + + +#define VK_QCOM_tile_properties 1 +#define VK_QCOM_TILE_PROPERTIES_SPEC_VERSION 1 +#define VK_QCOM_TILE_PROPERTIES_EXTENSION_NAME "VK_QCOM_tile_properties" +typedef struct VkPhysicalDeviceTilePropertiesFeaturesQCOM { + VkStructureType sType; + void* pNext; + VkBool32 tileProperties; +} VkPhysicalDeviceTilePropertiesFeaturesQCOM; + +typedef struct VkTilePropertiesQCOM { + VkStructureType sType; + void* pNext; + VkExtent3D tileSize; + VkExtent2D apronSize; + VkOffset2D origin; +} VkTilePropertiesQCOM; + +typedef VkResult (VKAPI_PTR *PFN_vkGetFramebufferTilePropertiesQCOM)(VkDevice device, VkFramebuffer framebuffer, uint32_t* pPropertiesCount, VkTilePropertiesQCOM* pProperties); +typedef VkResult (VKAPI_PTR *PFN_vkGetDynamicRenderingTilePropertiesQCOM)(VkDevice device, const VkRenderingInfo* pRenderingInfo, VkTilePropertiesQCOM* pProperties); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR VkResult VKAPI_CALL vkGetFramebufferTilePropertiesQCOM( + VkDevice device, + VkFramebuffer framebuffer, + uint32_t* pPropertiesCount, + VkTilePropertiesQCOM* pProperties); + +VKAPI_ATTR VkResult VKAPI_CALL vkGetDynamicRenderingTilePropertiesQCOM( + VkDevice device, + const VkRenderingInfo* pRenderingInfo, + VkTilePropertiesQCOM* pProperties); +#endif + + +#define VK_SEC_amigo_profiling 1 +#define VK_SEC_AMIGO_PROFILING_SPEC_VERSION 1 +#define VK_SEC_AMIGO_PROFILING_EXTENSION_NAME "VK_SEC_amigo_profiling" +typedef struct VkPhysicalDeviceAmigoProfilingFeaturesSEC { + VkStructureType sType; + void* pNext; + VkBool32 amigoProfiling; +} VkPhysicalDeviceAmigoProfilingFeaturesSEC; + +typedef struct VkAmigoProfilingSubmitInfoSEC { + VkStructureType sType; + const void* pNext; + uint64_t firstDrawTimestamp; + uint64_t swapBufferTimestamp; +} VkAmigoProfilingSubmitInfoSEC; + + + +#define VK_EXT_mutable_descriptor_type 1 +#define VK_EXT_MUTABLE_DESCRIPTOR_TYPE_SPEC_VERSION 1 +#define VK_EXT_MUTABLE_DESCRIPTOR_TYPE_EXTENSION_NAME "VK_EXT_mutable_descriptor_type" + + #define VK_KHR_acceleration_structure 1 VK_DEFINE_NON_DISPATCHABLE_HANDLE(VkAccelerationStructureKHR) #define VK_KHR_ACCELERATION_STRUCTURE_SPEC_VERSION 13 @@ -14308,6 +15047,87 @@ typedef struct VkPhysicalDeviceRayQueryFeaturesKHR { } VkPhysicalDeviceRayQueryFeaturesKHR; + +#define VK_EXT_mesh_shader 1 +#define VK_EXT_MESH_SHADER_SPEC_VERSION 1 +#define VK_EXT_MESH_SHADER_EXTENSION_NAME "VK_EXT_mesh_shader" +typedef struct VkPhysicalDeviceMeshShaderFeaturesEXT { + VkStructureType sType; + void* pNext; + VkBool32 taskShader; + VkBool32 meshShader; + VkBool32 multiviewMeshShader; + VkBool32 primitiveFragmentShadingRateMeshShader; + VkBool32 meshShaderQueries; +} VkPhysicalDeviceMeshShaderFeaturesEXT; + +typedef struct VkPhysicalDeviceMeshShaderPropertiesEXT { + VkStructureType sType; + void* pNext; + uint32_t maxTaskWorkGroupTotalCount; + uint32_t maxTaskWorkGroupCount[3]; + uint32_t maxTaskWorkGroupInvocations; + uint32_t maxTaskWorkGroupSize[3]; + uint32_t maxTaskPayloadSize; + uint32_t maxTaskSharedMemorySize; + uint32_t maxTaskPayloadAndSharedMemorySize; + uint32_t maxMeshWorkGroupTotalCount; + uint32_t maxMeshWorkGroupCount[3]; + uint32_t maxMeshWorkGroupInvocations; + uint32_t maxMeshWorkGroupSize[3]; + uint32_t maxMeshSharedMemorySize; + uint32_t maxMeshPayloadAndSharedMemorySize; + uint32_t maxMeshOutputMemorySize; + uint32_t maxMeshPayloadAndOutputMemorySize; + uint32_t maxMeshOutputComponents; + uint32_t maxMeshOutputVertices; + uint32_t maxMeshOutputPrimitives; + uint32_t maxMeshOutputLayers; + uint32_t maxMeshMultiviewViewCount; + uint32_t meshOutputPerVertexGranularity; + uint32_t meshOutputPerPrimitiveGranularity; + uint32_t maxPreferredTaskWorkGroupInvocations; + uint32_t maxPreferredMeshWorkGroupInvocations; + VkBool32 prefersLocalInvocationVertexOutput; + VkBool32 prefersLocalInvocationPrimitiveOutput; + VkBool32 prefersCompactVertexOutput; + VkBool32 prefersCompactPrimitiveOutput; +} VkPhysicalDeviceMeshShaderPropertiesEXT; + +typedef struct VkDrawMeshTasksIndirectCommandEXT { + uint32_t groupCountX; + uint32_t groupCountY; + uint32_t groupCountZ; +} VkDrawMeshTasksIndirectCommandEXT; + +typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksEXT)(VkCommandBuffer commandBuffer, uint32_t groupCountX, uint32_t groupCountY, uint32_t groupCountZ); +typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectEXT)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, uint32_t drawCount, uint32_t stride); +typedef void (VKAPI_PTR *PFN_vkCmdDrawMeshTasksIndirectCountEXT)(VkCommandBuffer commandBuffer, VkBuffer buffer, VkDeviceSize offset, VkBuffer countBuffer, VkDeviceSize countBufferOffset, uint32_t maxDrawCount, uint32_t stride); + +#ifndef VK_NO_PROTOTYPES +VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksEXT( + VkCommandBuffer commandBuffer, + uint32_t groupCountX, + uint32_t groupCountY, + uint32_t groupCountZ); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectEXT( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + uint32_t drawCount, + uint32_t stride); + +VKAPI_ATTR void VKAPI_CALL vkCmdDrawMeshTasksIndirectCountEXT( + VkCommandBuffer commandBuffer, + VkBuffer buffer, + VkDeviceSize offset, + VkBuffer countBuffer, + VkDeviceSize countBufferOffset, + uint32_t maxDrawCount, + uint32_t stride); +#endif + #ifdef __cplusplus } #endif diff --git a/src/venus/vkr_allocator.c b/src/venus/vkr_allocator.c index 878c5632..b0144eab 100644 --- a/src/venus/vkr_allocator.c +++ b/src/venus/vkr_allocator.c @@ -132,7 +132,7 @@ vkr_allocator_allocate_memory(struct virgl_resource *res) } void -vkr_allocator_fini() +vkr_allocator_fini(void) { if (!vkr_allocator_initialized) return; @@ -152,7 +152,7 @@ vkr_allocator_fini() } int -vkr_allocator_init() +vkr_allocator_init(void) { VkResult res; diff --git a/src/venus/vkr_command_buffer.c b/src/venus/vkr_command_buffer.c index 10197597..abb2befe 100644 --- a/src/venus/vkr_command_buffer.c +++ b/src/venus/vkr_command_buffer.c @@ -797,6 +797,67 @@ vkr_dispatch_vkCmdEndRendering(UNUSED struct vn_dispatch_context *ctx, VKR_CMD_CALL(CmdEndRendering, args); } +static void +vkr_dispatch_vkCmdPipelineBarrier2(UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkCmdPipelineBarrier2 *args) +{ + VKR_CMD_CALL(CmdPipelineBarrier2, args, args->pDependencyInfo); +} + +static void +vkr_dispatch_vkCmdResetEvent2(UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkCmdResetEvent2 *args) +{ + VKR_CMD_CALL(CmdResetEvent2, args, args->event, args->stageMask); +} + +static void +vkr_dispatch_vkCmdSetEvent2(UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkCmdSetEvent2 *args) +{ + VKR_CMD_CALL(CmdSetEvent2, args, args->event, args->pDependencyInfo); +} + +static void +vkr_dispatch_vkCmdWaitEvents2(UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkCmdWaitEvents2 *args) +{ + VKR_CMD_CALL(CmdWaitEvents2, args, args->eventCount, args->pEvents, + args->pDependencyInfos); +} + +static void +vkr_dispatch_vkCmdWriteTimestamp2(UNUSED struct vn_dispatch_context *ctx, + struct vn_command_vkCmdWriteTimestamp2 *args) +{ + VKR_CMD_CALL(CmdWriteTimestamp2, args, args->stage, args->queryPool, args->query); +} + +static void +vkr_dispatch_vkCmdDrawMultiEXT(UNUSED struct vn_dispatch_context *dispatch, + struct vn_command_vkCmdDrawMultiEXT *args) +{ + VKR_CMD_CALL(CmdDrawMultiEXT, args, args->drawCount, args->pVertexInfo, + args->instanceCount, args->firstInstance, args->stride); +} + +static void +vkr_dispatch_vkCmdDrawMultiIndexedEXT(UNUSED struct vn_dispatch_context *dispatch, + struct vn_command_vkCmdDrawMultiIndexedEXT *args) +{ + VKR_CMD_CALL(CmdDrawMultiIndexedEXT, args, args->drawCount, args->pIndexInfo, + args->instanceCount, args->firstInstance, args->stride, + args->pVertexOffset); +} + +static void +vkr_dispatch_vkCmdPushDescriptorSetKHR(UNUSED struct vn_dispatch_context *dispatch, + struct vn_command_vkCmdPushDescriptorSetKHR *args) +{ + VKR_CMD_CALL(CmdPushDescriptorSetKHR, args, args->pipelineBindPoint, args->layout, + args->set, args->descriptorWriteCount, args->pDescriptorWrites); +} + void vkr_context_init_command_pool_dispatch(struct vkr_context *ctx) { @@ -911,6 +972,13 @@ vkr_context_init_command_buffer_dispatch(struct vkr_context *ctx) dispatch->dispatch_vkCmdBeginRendering = vkr_dispatch_vkCmdBeginRendering; dispatch->dispatch_vkCmdEndRendering = vkr_dispatch_vkCmdEndRendering; + /* VK_KHR_synchronization2 */ + dispatch->dispatch_vkCmdPipelineBarrier2 = vkr_dispatch_vkCmdPipelineBarrier2; + dispatch->dispatch_vkCmdResetEvent2 = vkr_dispatch_vkCmdResetEvent2; + dispatch->dispatch_vkCmdSetEvent2 = vkr_dispatch_vkCmdSetEvent2; + dispatch->dispatch_vkCmdWaitEvents2 = vkr_dispatch_vkCmdWaitEvents2; + dispatch->dispatch_vkCmdWriteTimestamp2 = vkr_dispatch_vkCmdWriteTimestamp2; + /* VK_EXT_extended_dynamic_state2 */ dispatch->dispatch_vkCmdSetRasterizerDiscardEnable = vkr_dispatch_vkCmdSetRasterizerDiscardEnable; @@ -926,4 +994,12 @@ vkr_context_init_command_buffer_dispatch(struct vkr_context *ctx) vkr_dispatch_vkCmdBeginConditionalRenderingEXT; dispatch->dispatch_vkCmdEndConditionalRenderingEXT = vkr_dispatch_vkCmdEndConditionalRenderingEXT; + + /* VK_EXT_multi_draw */ + dispatch->dispatch_vkCmdDrawMultiEXT = vkr_dispatch_vkCmdDrawMultiEXT; + dispatch->dispatch_vkCmdDrawMultiIndexedEXT = vkr_dispatch_vkCmdDrawMultiIndexedEXT; + + /* VK_KHR_push_descriptor */ + dispatch->dispatch_vkCmdPushDescriptorSetKHR = vkr_dispatch_vkCmdPushDescriptorSetKHR; + dispatch->dispatch_vkCmdPushDescriptorSetWithTemplateKHR = NULL; } diff --git a/src/venus/vkr_common.c b/src/venus/vkr_common.c index b2e85980..e3c33627 100644 --- a/src/venus/vkr_common.c +++ b/src/venus/vkr_common.c @@ -71,45 +71,56 @@ static const struct vn_info_extension_table vkr_extension_table = { .KHR_dynamic_rendering = true, .KHR_format_feature_flags2 = false, .KHR_maintenance4 = true, - .KHR_shader_integer_dot_product = false, - .KHR_shader_non_semantic_info = false, - .KHR_shader_terminate_invocation = false, - .KHR_synchronization2 = false, - .KHR_zero_initialize_workgroup_memory = false, + .KHR_shader_integer_dot_product = true, + .KHR_shader_non_semantic_info = true, + .KHR_shader_terminate_invocation = true, + .KHR_synchronization2 = true, + .KHR_zero_initialize_workgroup_memory = true, .EXT_4444_formats = true, .EXT_extended_dynamic_state = true, .EXT_extended_dynamic_state2 = true, .EXT_image_robustness = true, .EXT_inline_uniform_block = true, - .EXT_pipeline_creation_cache_control = false, - .EXT_pipeline_creation_feedback = false, - .EXT_private_data = false, + .EXT_pipeline_creation_cache_control = true, + .EXT_pipeline_creation_feedback = true, + /* TODO(VK_EXT_private_data): Support natively in the guest */ + .EXT_private_data = true, .EXT_shader_demote_to_helper_invocation = true, - .EXT_subgroup_size_control = false, - .EXT_texel_buffer_alignment = false, - .EXT_texture_compression_astc_hdr = false, - .EXT_tooling_info = false, - .EXT_ycbcr_2plane_444_formats = false, + .EXT_subgroup_size_control = true, + .EXT_texel_buffer_alignment = true, + .EXT_texture_compression_astc_hdr = true, + .EXT_tooling_info = false, /* implementation in driver */ + .EXT_ycbcr_2plane_444_formats = true, /* KHR extensions */ - .KHR_external_fence_fd = false, + .KHR_external_fence_fd = true, .KHR_external_memory_fd = true, + .KHR_external_semaphore_fd = true, + .KHR_push_descriptor = true, /* EXT extensions */ .EXT_calibrated_timestamps = true, .EXT_conservative_rasterization = true, .EXT_conditional_rendering = true, .EXT_custom_border_color = true, + .EXT_depth_clip_control = true, .EXT_depth_clip_enable = true, .EXT_external_memory_dma_buf = true, .EXT_image_drm_format_modifier = true, .EXT_image_view_min_lod = true, .EXT_index_type_uint8 = true, .EXT_line_rasterization = true, + .EXT_multi_draw = true, + .EXT_mutable_descriptor_type = true, + .EXT_pci_bus_info = true, + .EXT_primitive_topology_list_restart = true, + .EXT_primitives_generated_query = true, .EXT_provoking_vertex = true, .EXT_queue_family_foreign = true, .EXT_robustness2 = true, .EXT_shader_stencil_export = true, .EXT_transform_feedback = true, .EXT_vertex_attribute_divisor = true, + /* vendor extensions */ + .VALVE_mutable_descriptor_type = true, }; void @@ -219,5 +230,5 @@ object_array_init(struct vkr_context *ctx, arr->objects[i] = obj; } - return arr; + return true; } diff --git a/src/venus/vkr_common.h b/src/venus/vkr_common.h index e1c9ce5a..df1ca325 100644 --- a/src/venus/vkr_common.h +++ b/src/venus/vkr_common.h @@ -35,7 +35,7 @@ #include "vkr_renderer.h" /* cap instance and device api versions to this */ -#define VKR_MAX_API_VERSION VK_API_VERSION_1_2 +#define VKR_MAX_API_VERSION VK_API_VERSION_1_3 #define VKR_DEBUG(category) (unlikely(vkr_debug_flags & VKR_DEBUG_##category)) diff --git a/src/venus/vkr_context.c b/src/venus/vkr_context.c index 9ecb9cdf..26dfaa0d 100644 --- a/src/venus/vkr_context.c +++ b/src/venus/vkr_context.c @@ -120,25 +120,58 @@ vkr_context_init_dispatch(struct vkr_context *ctx) vkr_context_init_command_buffer_dispatch(ctx); } +static struct vkr_cpu_sync * +vkr_alloc_cpu_sync(uint32_t flags, uint32_t ring_idx, uint64_t fence_id) +{ + struct vkr_cpu_sync *sync; + sync = malloc(sizeof(*sync)); + if (!sync) + return NULL; + + sync->flags = flags; + sync->fence_id = fence_id; + sync->ring_idx = ring_idx; + list_inithead(&sync->head); + + return sync; +} + static int vkr_context_submit_fence_locked(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vkr_context *ctx = (struct vkr_context *)base; - struct vn_device_proc_table *vk; - struct vkr_queue *queue; VkResult result; - queue = vkr_context_get_object(ctx, queue_id); - if (!queue) + if (ring_idx >= ARRAY_SIZE(ctx->sync_queues)) { + vkr_log("invalid sync ring_idx %u", ring_idx); + return -EINVAL; + } + + if (ring_idx == 0) { + if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) { + ctx->base.fence_retire(&ctx->base, ring_idx, fence_id); + } else { + struct vkr_cpu_sync *sync = vkr_alloc_cpu_sync(flags, ring_idx, fence_id); + if (!sync) + return -ENOMEM; + + list_addtail(&sync->head, &ctx->signaled_cpu_syncs); + } + return 0; + } else if (!ctx->sync_queues[ring_idx]) { + vkr_log("invalid ring_idx %u", ring_idx); return -EINVAL; + } + + struct vkr_queue *queue = ctx->sync_queues[ring_idx]; struct vkr_device *dev = queue->device; - vk = &dev->proc_table; + struct vn_device_proc_table *vk = &dev->proc_table; struct vkr_queue_sync *sync = - vkr_device_alloc_queue_sync(dev, flags, queue_id, fence_id); + vkr_device_alloc_queue_sync(dev, flags, ring_idx, fence_id); if (!sync) return -ENOMEM; @@ -168,14 +201,18 @@ vkr_context_submit_fence_locked(struct virgl_context *base, static int vkr_context_submit_fence(struct virgl_context *base, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vkr_context *ctx = (struct vkr_context *)base; int ret; + /* always merge fences */ + assert(!(flags & ~VIRGL_RENDERER_FENCE_FLAG_MERGEABLE)); + flags = VIRGL_RENDERER_FENCE_FLAG_MERGEABLE; + mtx_lock(&ctx->mutex); - ret = vkr_context_submit_fence_locked(base, flags, queue_id, fence_id); + ret = vkr_context_submit_fence_locked(base, flags, ring_idx, fence_id); mtx_unlock(&ctx->mutex); return ret; } @@ -191,12 +228,20 @@ vkr_context_retire_fences_locked(struct virgl_context *base) /* retire syncs from destroyed devices */ LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &ctx->signaled_syncs, head) { - /* queue_id might have already get reused but is opaque to the clients */ - ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_id); + /* ring_idx might have already get reused but is opaque to the clients */ + ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id); free(sync); } list_inithead(&ctx->signaled_syncs); + /* retire syncs from CPU timeline */ + struct vkr_cpu_sync *cpu_sync, *cpu_sync_tmp; + LIST_FOR_EACH_ENTRY_SAFE (cpu_sync, cpu_sync_tmp, &ctx->signaled_cpu_syncs, head) { + ctx->base.fence_retire(&ctx->base, cpu_sync->ring_idx, cpu_sync->fence_id); + free(cpu_sync); + } + list_inithead(&ctx->signaled_cpu_syncs); + /* flush first and once because the per-queue sync threads might write to * it any time */ @@ -211,7 +256,7 @@ vkr_context_retire_fences_locked(struct virgl_context *base) vkr_queue_get_signaled_syncs(queue, &retired_syncs, &queue_empty); LIST_FOR_EACH_ENTRY_SAFE (sync, sync_tmp, &retired_syncs, head) { - ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_id); + ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id); vkr_device_free_queue_sync(dev, sync); } @@ -359,7 +404,7 @@ vkr_context_get_blob_locked(struct virgl_context *base, return ret; if (fd_type == VIRGL_RESOURCE_FD_DMABUF && - (uint64_t)lseek64(fd, 0, SEEK_END) < blob_size) { + (uint64_t)lseek(fd, 0, SEEK_END) < blob_size) { close(fd); return -EINVAL; } @@ -538,6 +583,10 @@ vkr_context_destroy(struct virgl_context *base) LIST_FOR_EACH_ENTRY_SAFE (sync, tmp, &ctx->signaled_syncs, head) free(sync); + struct vkr_queue_sync *cpu_sync, *cpu_sync_tmp; + LIST_FOR_EACH_ENTRY_SAFE (cpu_sync, cpu_sync_tmp, &ctx->signaled_cpu_syncs, head) + free(cpu_sync); + if (ctx->fence_eventfd >= 0) close(ctx->fence_eventfd); @@ -645,6 +694,7 @@ vkr_context_create(size_t debug_len, const char *debug_name) list_inithead(&ctx->rings); list_inithead(&ctx->busy_queues); list_inithead(&ctx->signaled_syncs); + list_inithead(&ctx->signaled_cpu_syncs); return &ctx->base; diff --git a/src/venus/vkr_context.h b/src/venus/vkr_context.h index ccbf5d9c..c6f7e11c 100644 --- a/src/venus/vkr_context.h +++ b/src/venus/vkr_context.h @@ -42,6 +42,14 @@ enum vkr_context_validate_level { VKR_CONTEXT_VALIDATE_FULL, }; +struct vkr_cpu_sync { + uint32_t flags; + uint32_t ring_idx; + uint64_t fence_id; + + struct list_head head; +}; + struct vkr_context { struct virgl_context base; @@ -62,6 +70,9 @@ struct vkr_context { int fence_eventfd; struct list_head busy_queues; struct list_head signaled_syncs; + struct list_head signaled_cpu_syncs; + + struct vkr_queue *sync_queues[64]; struct vkr_instance *instance; char *instance_name; diff --git a/src/venus/vkr_device.h b/src/venus/vkr_device.h index 4a5a1096..c7a2a5ce 100644 --- a/src/venus/vkr_device.h +++ b/src/venus/vkr_device.h @@ -6,9 +6,10 @@ #ifndef VKR_DEVICE_H #define VKR_DEVICE_H +#include "vkr_common.h" + #include "venus-protocol/vn_protocol_renderer_util.h" -#include "vkr_common.h" #include "vkr_context.h" struct vkr_device { diff --git a/src/venus/vkr_device_object.py b/src/venus/vkr_device_object.py index c45be01f..282c39e6 100644 --- a/src/venus/vkr_device_object.py +++ b/src/venus/vkr_device_object.py @@ -170,7 +170,12 @@ vkr_{create_func_name}_create_array( if (vkr_{create_func_name}_init_array(ctx, args, arr) != VK_SUCCESS) return args->ret; - if (vkr_{create_func_name}_create_driver_handles(ctx, args, arr) != VK_SUCCESS) {{ + if (vkr_{create_func_name}_create_driver_handles(ctx, args, arr) < VK_SUCCESS) {{ + /* In case the client expects a reply, clear all returned handles to + * VK_NULL_HANDLE. + */ + memset(args->{create_objs}, 0, + args->{create_count} * sizeof(args->{create_objs}[0])); object_array_fini(arr); return args->ret; }} @@ -234,14 +239,22 @@ static inline void vkr_{create_func_name}_add_array( struct vkr_context *ctx, struct vkr_device *dev, - struct object_array *arr) + struct object_array *arr, + {vk_type} *args_{create_objs}) {{ for (uint32_t i = 0; i < arr->count; i++) {{ struct vkr_{vkr_type} *obj = arr->objects[i]; obj->base.handle.{vkr_type} = (({vk_type} *)arr->handle_storage)[i]; - vkr_device_add_object(ctx, dev, &obj->base); + /* Individual pipelines may fail creation. */ + if (obj->base.handle.{vkr_type} == VK_NULL_HANDLE) {{ + free(obj); + arr->objects[i] = NULL; + args_{create_objs}[i] = VK_NULL_HANDLE; + }} else {{ + vkr_device_add_object(ctx, dev, &obj->base); + }} }} arr->objects_stolen = true; diff --git a/src/venus/vkr_physical_device.c b/src/venus/vkr_physical_device.c index 633e07b7..686fec06 100644 --- a/src/venus/vkr_physical_device.c +++ b/src/venus/vkr_physical_device.c @@ -16,7 +16,7 @@ static struct gbm_device *vkr_gbm_dev; static void -vkr_gbm_device_init_once() +vkr_gbm_device_init_once(void) { struct virgl_gbm *vkr_gbm = virgl_gbm_init(-1); if (!vkr_gbm) { @@ -244,9 +244,6 @@ vkr_physical_device_init_properties(struct vkr_physical_device *physical_dev) VkPhysicalDeviceProperties *props = &physical_dev->properties; props->apiVersion = vkr_api_version_cap_minor(props->apiVersion, VKR_MAX_API_VERSION); - props->driverVersion = 0; - - /* TODO lie about props->pipelineCacheUUID and patch cache header */ } static void @@ -524,59 +521,8 @@ vkr_dispatch_vkGetPhysicalDeviceProperties2( UNUSED struct vn_dispatch_context *dispatch, struct vn_command_vkGetPhysicalDeviceProperties2 *args) { - struct vkr_physical_device *physical_dev = - vkr_physical_device_from_handle(args->physicalDevice); - vn_replace_vkGetPhysicalDeviceProperties2_args_handle(args); vkGetPhysicalDeviceProperties2(args->physicalDevice, args->pProperties); - - union { - VkBaseOutStructure *pnext; - VkPhysicalDeviceProperties2 *props; - VkPhysicalDeviceVulkan11Properties *vk11; - VkPhysicalDeviceVulkan12Properties *vk12; - VkPhysicalDeviceIDProperties *id; - VkPhysicalDeviceDriverProperties *driver; - } u; - - u.pnext = (VkBaseOutStructure *)args->pProperties; - while (u.pnext) { - switch (u.pnext->sType) { - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2: - u.props->properties = physical_dev->properties; - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_1_PROPERTIES: - memset(u.vk11->deviceUUID, 0, sizeof(u.vk11->deviceUUID)); - memset(u.vk11->driverUUID, 0, sizeof(u.vk11->driverUUID)); - memset(u.vk11->deviceLUID, 0, sizeof(u.vk11->deviceLUID)); - u.vk11->deviceNodeMask = 0; - u.vk11->deviceLUIDValid = false; - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_VULKAN_1_2_PROPERTIES: - u.vk12->driverID = 0; - memset(u.vk12->driverName, 0, sizeof(u.vk12->driverName)); - memset(u.vk12->driverInfo, 0, sizeof(u.vk12->driverInfo)); - memset(&u.vk12->conformanceVersion, 0, sizeof(u.vk12->conformanceVersion)); - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ID_PROPERTIES: - memset(u.id->deviceUUID, 0, sizeof(u.id->deviceUUID)); - memset(u.id->driverUUID, 0, sizeof(u.id->driverUUID)); - memset(u.id->deviceLUID, 0, sizeof(u.id->deviceLUID)); - u.id->deviceNodeMask = 0; - u.id->deviceLUIDValid = false; - break; - case VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DRIVER_PROPERTIES: - u.driver->driverID = 0; - memset(u.driver->driverName, 0, sizeof(u.driver->driverName)); - memset(u.driver->driverInfo, 0, sizeof(u.driver->driverInfo)); - memset(&u.driver->conformanceVersion, 0, sizeof(u.driver->conformanceVersion)); - break; - default: - break; - } - - u.pnext = u.pnext->pNext; - } } static void diff --git a/src/venus/vkr_physical_device.h b/src/venus/vkr_physical_device.h index 8cafa8bf..03c2aceb 100644 --- a/src/venus/vkr_physical_device.h +++ b/src/venus/vkr_physical_device.h @@ -27,6 +27,7 @@ struct vkr_physical_device { bool EXT_external_memory_dma_buf; bool KHR_external_fence_fd; + bool KHR_external_semaphore_fd; VkPhysicalDeviceMemoryProperties memory_properties; VkPhysicalDeviceIDProperties id_properties; diff --git a/src/venus/vkr_pipeline.c b/src/venus/vkr_pipeline.c index 8fd1b059..967d2370 100644 --- a/src/venus/vkr_pipeline.c +++ b/src/venus/vkr_pipeline.c @@ -81,10 +81,10 @@ vkr_dispatch_vkCreateGraphicsPipelines(struct vn_dispatch_context *dispatch, struct vkr_device *dev = vkr_device_from_handle(args->device); struct object_array arr; - if (vkr_graphics_pipeline_create_array(ctx, args, &arr) != VK_SUCCESS) + if (vkr_graphics_pipeline_create_array(ctx, args, &arr) < VK_SUCCESS) return; - vkr_pipeline_add_array(ctx, dev, &arr); + vkr_pipeline_add_array(ctx, dev, &arr, args->pPipelines); } static void @@ -95,10 +95,10 @@ vkr_dispatch_vkCreateComputePipelines(struct vn_dispatch_context *dispatch, struct vkr_device *dev = vkr_device_from_handle(args->device); struct object_array arr; - if (vkr_compute_pipeline_create_array(ctx, args, &arr) != VK_SUCCESS) + if (vkr_compute_pipeline_create_array(ctx, args, &arr) < VK_SUCCESS) return; - vkr_pipeline_add_array(ctx, dev, &arr); + vkr_pipeline_add_array(ctx, dev, &arr, args->pPipelines); } static void diff --git a/src/venus/vkr_queue.c b/src/venus/vkr_queue.c index 213a47f6..3b38d8ce 100644 --- a/src/venus/vkr_queue.c +++ b/src/venus/vkr_queue.c @@ -7,13 +7,14 @@ #include "venus-protocol/vn_protocol_renderer_queue.h" +#include "vkr_context.h" #include "vkr_physical_device.h" #include "vkr_queue_gen.h" struct vkr_queue_sync * vkr_device_alloc_queue_sync(struct vkr_device *dev, uint32_t fence_flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vn_device_proc_table *vk = &dev->proc_table; @@ -56,7 +57,7 @@ vkr_device_alloc_queue_sync(struct vkr_device *dev, sync->device_lost = false; sync->flags = fence_flags; - sync->queue_id = queue_id; + sync->ring_idx = ring_idx; sync->fence_id = fence_id; return sync; @@ -131,7 +132,7 @@ vkr_queue_sync_retire(struct vkr_context *ctx, struct vn_device_proc_table *vk = &dev->proc_table; if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) { - ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_id); + ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id); vkr_device_free_queue_sync(dev, sync); } else { vk->DestroyFence(dev->base.handle.device, sync->fence, NULL); @@ -177,6 +178,9 @@ vkr_queue_destroy(struct vkr_context *ctx, struct vkr_queue *queue) list_del(&queue->busy_head); list_del(&queue->base.track_head); + if (queue->ring_idx > 0) + ctx->sync_queues[queue->ring_idx] = NULL; + if (queue->base.id) vkr_context_remove_object(ctx, &queue->base); else @@ -225,7 +229,7 @@ vkr_queue_thread(void *arg) list_del(&sync->head); if (vkr_renderer_flags & VKR_RENDERER_ASYNC_FENCE_CB) { - ctx->base.fence_retire(&ctx->base, sync->queue_id, sync->fence_id); + ctx->base.fence_retire(&ctx->base, sync->ring_idx, sync->fence_id); vkr_device_free_queue_sync(queue->device, sync); } else { list_addtail(&sync->head, &queue->signaled_syncs); @@ -363,6 +367,26 @@ vkr_dispatch_vkGetDeviceQueue2(struct vn_dispatch_context *dispatch, return; } + const VkDeviceQueueTimelineInfoMESA *timeline_info = vkr_find_struct( + args->pQueueInfo->pNext, VK_STRUCTURE_TYPE_DEVICE_QUEUE_TIMELINE_INFO_MESA); + if (timeline_info) { + if (timeline_info->ringIdx == 0 || + timeline_info->ringIdx >= ARRAY_SIZE(ctx->sync_queues)) { + vkr_log("invalid ring_idx %d", timeline_info->ringIdx); + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + if (ctx->sync_queues[timeline_info->ringIdx]) { + vkr_log("sync_queue %d already bound", timeline_info->ringIdx); + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + queue->ring_idx = timeline_info->ringIdx; + ctx->sync_queues[timeline_info->ringIdx] = queue; + } + const vkr_object_id id = vkr_cs_handle_load_id((const void **)args->pQueue, VK_OBJECT_TYPE_QUEUE); vkr_queue_assign_object_id(ctx, queue, id); @@ -402,6 +426,18 @@ vkr_dispatch_vkQueueWaitIdle(struct vn_dispatch_context *dispatch, } static void +vkr_dispatch_vkQueueSubmit2(UNUSED struct vn_dispatch_context *dispatch, + struct vn_command_vkQueueSubmit2 *args) +{ + struct vkr_queue *queue = vkr_queue_from_handle(args->queue); + struct vn_device_proc_table *vk = &queue->device->proc_table; + + vn_replace_vkQueueSubmit2_args_handle(args); + args->ret = + vk->QueueSubmit2(args->queue, args->submitCount, args->pSubmits, args->fence); +} + +static void vkr_dispatch_vkCreateFence(struct vn_dispatch_context *dispatch, struct vn_command_vkCreateFence *args) { @@ -454,6 +490,33 @@ vkr_dispatch_vkWaitForFences(struct vn_dispatch_context *dispatch, } static void +vkr_dispatch_vkResetFenceResource100000MESA( + struct vn_dispatch_context *dispatch, + struct vn_command_vkResetFenceResource100000MESA *args) +{ + struct vkr_context *ctx = dispatch->data; + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + int fd = -1; + + vn_replace_vkResetFenceResource100000MESA_args_handle(args); + + const VkFenceGetFdInfoKHR info = { + .sType = VK_STRUCTURE_TYPE_FENCE_GET_FD_INFO_KHR, + .fence = args->fence, + .handleType = VK_EXTERNAL_FENCE_HANDLE_TYPE_SYNC_FD_BIT, + }; + VkResult result = vk->GetFenceFdKHR(args->device, &info, &fd); + if (result != VK_SUCCESS) { + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + if (fd >= 0) + close(fd); +} + +static void vkr_dispatch_vkCreateSemaphore(struct vn_dispatch_context *dispatch, struct vn_command_vkCreateSemaphore *args) { @@ -505,6 +568,61 @@ vkr_dispatch_vkSignalSemaphore(UNUSED struct vn_dispatch_context *dispatch, } static void +vkr_dispatch_vkWaitSemaphoreResource100000MESA( + struct vn_dispatch_context *dispatch, + struct vn_command_vkWaitSemaphoreResource100000MESA *args) +{ + struct vkr_context *ctx = dispatch->data; + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + int fd = -1; + + vn_replace_vkWaitSemaphoreResource100000MESA_args_handle(args); + + const VkSemaphoreGetFdInfoKHR info = { + .sType = VK_STRUCTURE_TYPE_SEMAPHORE_GET_FD_INFO_KHR, + .semaphore = args->semaphore, + .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + }; + VkResult result = vk->GetSemaphoreFdKHR(args->device, &info, &fd); + if (result != VK_SUCCESS) { + vkr_cs_decoder_set_fatal(&ctx->decoder); + return; + } + + if (fd >= 0) + close(fd); +} + +static void +vkr_dispatch_vkImportSemaphoreResource100000MESA( + struct vn_dispatch_context *dispatch, + struct vn_command_vkImportSemaphoreResource100000MESA *args) +{ + struct vkr_context *ctx = dispatch->data; + struct vkr_device *dev = vkr_device_from_handle(args->device); + struct vn_device_proc_table *vk = &dev->proc_table; + + vn_replace_vkImportSemaphoreResource100000MESA_args_handle(args); + + const VkImportSemaphoreResourceInfo100000MESA *res_info = + args->pImportSemaphoreResourceInfo; + + /* resourceId 0 is for importing a signaled payload to sync_fd fence */ + assert(!res_info->resourceId); + + const VkImportSemaphoreFdInfoKHR import_info = { + .sType = VK_STRUCTURE_TYPE_IMPORT_SEMAPHORE_FD_INFO_KHR, + .semaphore = res_info->semaphore, + .flags = VK_SEMAPHORE_IMPORT_TEMPORARY_BIT, + .handleType = VK_EXTERNAL_SEMAPHORE_HANDLE_TYPE_SYNC_FD_BIT, + .fd = -1, + }; + if (vk->ImportSemaphoreFdKHR(args->device, &import_info) != VK_SUCCESS) + vkr_cs_decoder_set_fatal(&ctx->decoder); +} + +static void vkr_dispatch_vkCreateEvent(struct vn_dispatch_context *dispatch, struct vn_command_vkCreateEvent *args) { @@ -561,6 +679,9 @@ vkr_context_init_queue_dispatch(struct vkr_context *ctx) dispatch->dispatch_vkQueueSubmit = vkr_dispatch_vkQueueSubmit; dispatch->dispatch_vkQueueBindSparse = vkr_dispatch_vkQueueBindSparse; dispatch->dispatch_vkQueueWaitIdle = vkr_dispatch_vkQueueWaitIdle; + + /* VK_KHR_synchronization2 */ + dispatch->dispatch_vkQueueSubmit2 = vkr_dispatch_vkQueueSubmit2; } void @@ -573,6 +694,9 @@ vkr_context_init_fence_dispatch(struct vkr_context *ctx) dispatch->dispatch_vkResetFences = vkr_dispatch_vkResetFences; dispatch->dispatch_vkGetFenceStatus = vkr_dispatch_vkGetFenceStatus; dispatch->dispatch_vkWaitForFences = vkr_dispatch_vkWaitForFences; + + dispatch->dispatch_vkResetFenceResource100000MESA = + vkr_dispatch_vkResetFenceResource100000MESA; } void @@ -586,6 +710,11 @@ vkr_context_init_semaphore_dispatch(struct vkr_context *ctx) vkr_dispatch_vkGetSemaphoreCounterValue; dispatch->dispatch_vkWaitSemaphores = vkr_dispatch_vkWaitSemaphores; dispatch->dispatch_vkSignalSemaphore = vkr_dispatch_vkSignalSemaphore; + + dispatch->dispatch_vkWaitSemaphoreResource100000MESA = + vkr_dispatch_vkWaitSemaphoreResource100000MESA; + dispatch->dispatch_vkImportSemaphoreResource100000MESA = + vkr_dispatch_vkImportSemaphoreResource100000MESA; } void diff --git a/src/venus/vkr_queue.h b/src/venus/vkr_queue.h index 2350be27..4ca9d649 100644 --- a/src/venus/vkr_queue.h +++ b/src/venus/vkr_queue.h @@ -13,7 +13,7 @@ struct vkr_queue_sync { bool device_lost; uint32_t flags; - uint64_t queue_id; + uint32_t ring_idx; uint64_t fence_id; struct list_head head; @@ -29,6 +29,9 @@ struct vkr_queue { uint32_t family; uint32_t index; + /* only used when client driver uses multiple timelines */ + uint32_t ring_idx; + /* Submitted fences are added to pending_syncs first. How submitted fences * are retired depends on VKR_RENDERER_THREAD_SYNC and * VKR_RENDERER_ASYNC_FENCE_CB. @@ -87,7 +90,7 @@ vkr_context_init_event_dispatch(struct vkr_context *ctx); struct vkr_queue_sync * vkr_device_alloc_queue_sync(struct vkr_device *dev, uint32_t fence_flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); void diff --git a/src/venus/vkr_renderer.c b/src/venus/vkr_renderer.c index ecc00eb3..64ab3725 100644 --- a/src/venus/vkr_renderer.c +++ b/src/venus/vkr_renderer.c @@ -47,6 +47,7 @@ vkr_get_capset(void *capset) c->vk_extension_mask1[0] |= 0x1u; c->allow_vk_wait_syncs = 1; + c->supports_multiple_timelines = 1; } return sizeof(*c); diff --git a/src/venus/vkr_transport.c b/src/venus/vkr_transport.c index 745b1249..361c7f31 100644 --- a/src/venus/vkr_transport.c +++ b/src/venus/vkr_transport.c @@ -225,8 +225,8 @@ vkr_ring_layout_init(struct vkr_ring_layout *layout, const size_t buf_size = vkr_region_size(&layout->buffer); if (buf_size > VKR_RING_BUFFER_MAX_SIZE || !util_is_power_of_two_nonzero(buf_size)) { - vkr_log("ring buffer size (%lu) must be a power of two and not exceed %lu", - buf_size, VKR_RING_BUFFER_MAX_SIZE); + vkr_log("ring buffer size (%z) must be a power of two and not exceed %lu", buf_size, + VKR_RING_BUFFER_MAX_SIZE); return false; } @@ -319,6 +319,7 @@ vkr_dispatch_vkGetVenusExperimentalFeatureData100000MESA( .memoryResourceAllocationSize = VK_TRUE, .globalFencing = VK_FALSE, .largeRing = VK_TRUE, + .syncFdFencing = VK_TRUE, }; vn_replace_vkGetVenusExperimentalFeatureData100000MESA_args_handle(args); diff --git a/src/venus_hw.h b/src/venus_hw.h index 23a34976..18bd1964 100644 --- a/src/venus_hw.h +++ b/src/venus_hw.h @@ -54,6 +54,16 @@ struct virgl_renderer_capset_venus { * shifts the responsibilities to the client drivers. */ uint32_t allow_vk_wait_syncs; + + /* This flag indicates that the renderer supports multiple fencing + * timelines. The client driver is expected to associate each VkQueue with + * one of these timelines at queue creation by binding it with an unused + * ring_idx. Queues created without a ring_idx binding are associated to a + * shared legacy timeline. The special ring_idx==0 is reserved for CPU + * fences that are signaled by the renderer immediately upon consumption of + * the associated renderer submission. + */ + uint32_t supports_multiple_timelines; }; #endif diff --git a/src/virgl_context.c b/src/virgl_context.c index f8c005a5..b74aad92 100644 --- a/src/virgl_context.c +++ b/src/virgl_context.c @@ -44,7 +44,7 @@ int virgl_context_table_init(void) { virgl_context_table = util_hash_table_create(hash_func_u32, - compare_func, + equal_func, virgl_context_destroy_func); return virgl_context_table ? 0 : ENOMEM; } diff --git a/src/virgl_context.h b/src/virgl_context.h index 4bf13704..046948d8 100644 --- a/src/virgl_context.h +++ b/src/virgl_context.h @@ -52,7 +52,7 @@ struct virgl_context_blob { struct virgl_context; typedef void (*virgl_context_fence_retire)(struct virgl_context *ctx, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); /** @@ -120,7 +120,7 @@ struct virgl_context { /* submit a fence to the queue identified by queue_id */ int (*submit_fence)(struct virgl_context *ctx, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); }; diff --git a/src/virgl_hw.h b/src/virgl_hw.h index be64717e..dfbcf816 100644 --- a/src/virgl_hw.h +++ b/src/virgl_hw.h @@ -344,6 +344,10 @@ enum virgl_formats { VIRGL_FORMAT_A8L8_SRGB = 261, VIRGL_FORMAT_A1B5G5R5_UNORM = 262, + VIRGL_FORMAT_A1R5G5B5_UNORM = 263, + VIRGL_FORMAT_A2B10G10R10_UNORM = 264, + VIRGL_FORMAT_A2R10G10B10_UNORM = 265, + VIRGL_FORMAT_A4R4G4B4_UNORM = 266, VIRGL_FORMAT_X8B8G8R8_SNORM = 268, @@ -399,6 +403,12 @@ enum virgl_formats { VIRGL_FORMAT_P012 = 315, VIRGL_FORMAT_P016 = 316, + VIRGL_FORMAT_B8G8R8_UNORM = 317, + VIRGL_FORMAT_R3G3B2_UNORM = 318, + VIRGL_FORMAT_R4G4B4A4_UNORM = 319, + VIRGL_FORMAT_R5G5B5A1_UNORM = 320, + VIRGL_FORMAT_R5G6B5_UNORM = 321, + VIRGL_FORMAT_MAX /* = PIPE_FORMAT_COUNT */, /* Below formats must not be used in the guest. */ @@ -428,7 +438,7 @@ enum virgl_formats { #define VIRGL_CAP_QBO (1 << 16) #define VIRGL_CAP_TRANSFER (1 << 17) #define VIRGL_CAP_FBO_MIXED_COLOR_FORMATS (1 << 18) -#define VIRGL_CAP_FAKE_FP64 (1 << 19) +#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) @@ -442,6 +452,9 @@ enum virgl_formats { #define VIRGL_CAP_CLEAR_TEXTURE (1 << 30) #define VIRGL_CAP_ARB_BUFFER_STORAGE (1 << 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) @@ -453,6 +466,7 @@ enum virgl_formats { #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) /* virgl bind flags - these are compatible with mesa 10.5 gallium. * but are fixed, no other should be passed to virgl either. @@ -554,6 +568,26 @@ struct virgl_caps_v1 { uint32_t max_texture_gather_components; }; +struct virgl_video_caps { + uint32_t profile:8; + uint32_t entrypoint:8; + uint32_t max_level:8; + uint32_t stacked_frames:8; + + uint32_t max_width:16; + uint32_t max_height:16; + + uint32_t prefered_format:16; + uint32_t max_macroblocks:16; + + uint32_t npot_texture:1; + uint32_t supports_progressive:1; + uint32_t supports_interlaced:1; + uint32_t prefers_interlaced:1; + uint32_t max_temporal_layers:8; + uint32_t reserved:20; +}; + /* * This struct should be growable when used in capset 2, * so we shouldn't have to add a v3 ever. @@ -611,6 +645,9 @@ struct virgl_caps_v2 { uint32_t max_texture_image_units; struct virgl_supported_format_mask supported_multisample_formats; uint32_t max_const_buffer_size[6]; // PIPE_SHADER_TYPES + uint32_t num_video_caps; + struct virgl_video_caps video_caps[32]; + uint32_t max_uniform_block_size; }; union virgl_caps { @@ -641,6 +678,7 @@ enum virgl_ctx_errors { VIRGL_ERROR_CTX_TRANSFER_IOV_BOUNDS, VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND, VIRGL_ERROR_CTX_UNSUPPORTED_FUNCTION, + VIRGL_ERROR_CTX_ILLEGAL_PROGRAM_PIPELINE, }; /** diff --git a/src/virgl_protocol.h b/src/virgl_protocol.h index cb378c11..98aa431e 100644 --- a/src/virgl_protocol.h +++ b/src/virgl_protocol.h @@ -117,6 +117,18 @@ enum virgl_context_cmd { VIRGL_CCMD_GET_MEMORY_INFO, VIRGL_CCMD_SEND_STRING_MARKER, VIRGL_CCMD_LINK_SHADER, + + /* video codec */ + VIRGL_CCMD_CREATE_VIDEO_CODEC, + VIRGL_CCMD_DESTROY_VIDEO_CODEC, + VIRGL_CCMD_CREATE_VIDEO_BUFFER, + VIRGL_CCMD_DESTROY_VIDEO_BUFFER, + VIRGL_CCMD_BEGIN_FRAME, + VIRGL_CCMD_DECODE_MACROBLOCK, + VIRGL_CCMD_DECODE_BITSTREAM, + VIRGL_CCMD_ENCODE_BITSTREAM, + VIRGL_CCMD_END_FRAME, + VIRGL_MAX_COMMANDS }; @@ -687,4 +699,59 @@ enum vrend_tweak_type { #define VIRGL_LINK_SHADER_TESS_EVAL_HANDLE 5 #define VIRGL_LINK_SHADER_COMPUTE_HANDLE 6 +/* VIRGL_CCMD_CREATE_VIDEO_CODEC */ +#define VIRGL_CREATE_VIDEO_CODEC_MIN_SIZE 7 +#define VIRGL_CREATE_VIDEO_CODEC_HANDLE 1 +#define VIRGL_CREATE_VIDEO_CODEC_PROFILE 2 +#define VIRGL_CREATE_VIDEO_CODEC_ENTRYPOINT 3 +#define VIRGL_CREATE_VIDEO_CODEC_CHROMA_FMT 4 +#define VIRGL_CREATE_VIDEO_CODEC_LEVEL 5 +#define VIRGL_CREATE_VIDEO_CODEC_WIDTH 6 +#define VIRGL_CREATE_VIDEO_CODEC_HEIGHT 7 +#define VIRGL_CREATE_VIDEO_CODEC_MAX_REF 8 + +/* VIRGL_CCMD_DESTROY_VIDEO_CODEC */ +#define VIRGL_DESTROY_VIDEO_CODEC_MIN_SIZE 1 +#define VIRGL_DESTROY_VIDEO_CODEC_HANDLE 1 + +/* VIRGL_CCMD_CREATE_VIDEO_BUFFER */ +#define VIRGL_CREATE_VIDEO_BUFFER_MIN_SIZE 5 +#define VIRGL_CREATE_VIDEO_BUFFER_HANDLE 1 +#define VIRGL_CREATE_VIDEO_BUFFER_FORMAT 2 +#define VIRGL_CREATE_VIDEO_BUFFER_WIDTH 3 +#define VIRGL_CREATE_VIDEO_BUFFER_HEIGHT 4 +#define VIRGL_CREATE_VIDEO_BUFFER_RES_BASE 5 + +/* VIRGL_CCMD_DESTROY_VIDEO_BUFFER */ +#define VIRGL_DESTROY_VIDEO_BUFFER_MIN_SIZE 1 +#define VIRGL_DESTROY_VIDEO_BUFFER_HANDLE 1 + +/* VIRGL_CCMD_BEGIN_FRAME */ +#define VIRGL_BEGIN_FRAME_MIN_SIZE 2 +#define VIRGL_BEGIN_FRAME_CDC_HANDLE 1 +#define VIRGL_BEGIN_FRAME_TGT_HANDLE 2 + +/* VIRGL_CCMD_DECODE_MACROBLOCK */ + +/* VIRGL_CCMD_DECODE_BITSTREAM */ +#define VIRGL_DECODE_BS_MIN_SIZE 5 +#define VIRGL_DECODE_BS_CDC_HANDLE 1 +#define VIRGL_DECODE_BS_TGT_HANDLE 2 +#define VIRGL_DECODE_BS_DSC_HANDLE 3 +#define VIRGL_DECODE_BS_BUF_HANDLE 4 +#define VIRGL_DECODE_BS_BUF_SIZE 5 + +/* VIRGL_CCMD_ENCODE_BITSTREAM */ +#define VIRGL_ENCODE_BS_MIN_SIZE 5 +#define VIRGL_ENCODE_BS_CDC_HANDLE 1 +#define VIRGL_ENCODE_BS_SRC_HANDLE 2 +#define VIRGL_ENCODE_BS_DEST_HANDLE 3 +#define VIRGL_ENCODE_BS_DESC_HANDLE 4 +#define VIRGL_ENCODE_BS_FEED_HANDLE 5 + +/* VIRGL_CCMD_END_FRAME */ +#define VIRGL_END_FRAME_MIN_SIZE 2 +#define VIRGL_END_FRAME_CDC_HANDLE 1 +#define VIRGL_END_FRAME_TGT_HANDLE 2 + #endif diff --git a/src/virgl_resource.c b/src/virgl_resource.c index 260e2916..7f2c3e6a 100644 --- a/src/virgl_resource.c +++ b/src/virgl_resource.c @@ -57,7 +57,7 @@ int virgl_resource_table_init(const struct virgl_resource_pipe_callbacks *callbacks) { virgl_resource_table = util_hash_table_create(hash_func_u32, - compare_func, + equal_func, virgl_resource_destroy_func); if (!virgl_resource_table) return ENOMEM; diff --git a/src/virgl_util.c b/src/virgl_util.c index 15d867d1..6ef1802e 100644 --- a/src/virgl_util.c +++ b/src/virgl_util.c @@ -53,20 +53,15 @@ #include <stdio.h> #endif -unsigned hash_func_u32(void *key) +uint32_t hash_func_u32(const void *key) { intptr_t ip = pointer_to_intptr(key); - return (unsigned)(ip & 0xffffffff); + return (uint32_t)(ip & 0xffffffff); } -int compare_func(void *key1, void *key2) +bool equal_func(const void *key1, const void *key2) { - if (key1 < key2) - return -1; - if (key1 > key2) - return 1; - else - return 0; + return key1 == key2; } bool has_eventfd(void) @@ -187,9 +182,14 @@ void trace_init(void) #endif #if ENABLE_TRACING == TRACE_WITH_PERFETTO +static void on_tracing_state_change(bool enabled) { + virgl_log("%s: tracing state change: %d\n", __func__, enabled); +} + void trace_init(void) { struct vperfetto_min_config config = { + .on_tracing_state_change = on_tracing_state_change, .init_flags = VPERFETTO_INIT_FLAG_USE_SYSTEM_BACKEND, .filename = NULL, .shmem_size_hint_kb = 32 * 1024, diff --git a/src/virgl_util.h b/src/virgl_util.h index 05649d10..d92ed29c 100644 --- a/src/virgl_util.h +++ b/src/virgl_util.h @@ -58,9 +58,9 @@ static inline bool is_only_bit(uint32_t mask, uint32_t bit) return (mask == bit); } -unsigned hash_func_u32(void *key); +uint32_t hash_func_u32(const void *key); -int compare_func(void *key1, void *key2); +bool equal_func(const void *key1, const void *key2); bool has_eventfd(void); int create_eventfd(unsigned int initval); @@ -122,7 +122,7 @@ void trace_end(const char **scope); #define TRACE_FUNC() #define TRACE_SCOPE(SCOPE) #define TRACE_SCOPE_SLOW(SCOPE) -#define TRACE_SCOPE_BEGIN(SCOPE, VAR) +#define TRACE_SCOPE_BEGIN(SCOPE) #define TRACE_SCOPE_END(VAR) #endif /* ENABLE_TRACING */ diff --git a/src/virgl_video.c b/src/virgl_video.c new file mode 100644 index 00000000..025ce00c --- /dev/null +++ b/src/virgl_video.c @@ -0,0 +1,2347 @@ +/************************************************************************** + * + * Copyright (C) 2022 Kylin Software Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * Implementation of general video codec interface. + * + * This implementation is currently based on VA-API, and other interfaces, + * such as VDPAU and proprietary interfaces, can also be considered in the + * future. + * + * Two objects are implemented here: + * virgl_video_buffer: + * Buffer for storing raw YUV formatted data. Currently, it is a wrapper + * for VASurface. + * virgl_video_codec: + * Represents a video encoder or decoder. It's a wrapper of VAContext and + * mainly provides the following methods: + * - virgl_video_begin_frame() + * It calls vaBeginPicture() to prepare for encoding and decoding. For + * encoding, it also needs to upload the raw picture data from the guest + * side into the local VASurface. + * - virgl_video_decode_bitstream() + * It constructs the decoding-related VABuffers according to the picture + * description information, and then calls vaRenderPicture() for decoding. + * - virgl_video_encode_bitstream() + * It constructs the encoding-related VABuffers according to the picture + * description information, and then calls vaRenderPicture() for encoding. + * - virgl_video_end_frame() + * It calls vaEndPicture() to end encoding and decoding. After decoding, + * it transmits the raw picture data from VASurface to the guest side, + * and after encoding, it transmits the result and the coded data in + * VACodedBuffer to the guest side. + * + * @author Feng Jiang <jiangfeng@kylinos.cn> + */ + + +#include <stdio.h> +#include <stdint.h> +#include <stdbool.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <epoxy/gl.h> +#include <epoxy/egl.h> +#include <va/va.h> +#include <va/va_drm.h> +#include <va/va_drmcommon.h> +#include <drm_fourcc.h> + +#include "pipe/p_video_state.h" +#include "util/u_memory.h" +#include "virgl_hw.h" +#include "virgl_video_hw.h" +#include "virgl_util.h" +#include "virgl_video.h" + +/* + * The max size of codec buffer is approximately: + * num_of_macroblocks * max_size_of_per_macroblock + size_of_some_headers + * Now, we only support YUV420 formats, this means that we have a limit of + * 3200 bits(400 Bytes) per macroblock. To simplify the calculation, we + * directly use 512 instead of 400. + */ +#define CODED_BUF_DEFAULT_SIZE(width, height) \ + ((width) * (height) / (16 * 16) * 512) + +struct virgl_video_buffer { + enum pipe_format format; + uint32_t width; + uint32_t height; + bool interlanced; + VASurfaceID va_sfc; + struct virgl_video_dma_buf *dmabuf; + void *opaque; /* User opaque data */ +}; + + +struct virgl_video_codec { + enum pipe_video_profile profile; + uint32_t level; + enum pipe_video_entrypoint entrypoint; + enum pipe_video_chroma_format chroma_format; + uint32_t width; + uint32_t height; + uint32_t max_references; + VAContextID va_ctx; + VAConfigID va_cfg; + struct virgl_video_buffer *buffer; + struct virgl_video_buffer *ref_pic_list[32]; /* Enc: reference pictures */ + VABufferID va_coded_buf; /* Enc: VACodedBuffer */ + void *opaque; /* User opaque data */ +}; + + +static VADisplay va_dpy; + +static struct virgl_video_callbacks *callbacks = NULL; + +static enum pipe_video_profile pipe_profile_from_va(VAProfile profile) +{ + switch (profile) { + case VAProfileMPEG2Simple: + return PIPE_VIDEO_PROFILE_MPEG2_SIMPLE; + case VAProfileMPEG2Main: + return PIPE_VIDEO_PROFILE_MPEG2_MAIN; + case VAProfileMPEG4Simple: + return PIPE_VIDEO_PROFILE_MPEG4_SIMPLE; + case VAProfileMPEG4AdvancedSimple: + return PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE; + case VAProfileVC1Simple: + return PIPE_VIDEO_PROFILE_VC1_SIMPLE; + case VAProfileVC1Main: + return PIPE_VIDEO_PROFILE_VC1_MAIN; + case VAProfileVC1Advanced: + return PIPE_VIDEO_PROFILE_VC1_ADVANCED; + case VAProfileH264ConstrainedBaseline: + return PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE; + case VAProfileH264Main: + return PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN; + case VAProfileH264High: + return PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH; + case VAProfileHEVCMain: + return PIPE_VIDEO_PROFILE_HEVC_MAIN; + case VAProfileHEVCMain10: + return PIPE_VIDEO_PROFILE_HEVC_MAIN_10; + case VAProfileJPEGBaseline: + return PIPE_VIDEO_PROFILE_JPEG_BASELINE; + case VAProfileVP9Profile0: + return PIPE_VIDEO_PROFILE_VP9_PROFILE0; + case VAProfileVP9Profile2: + return PIPE_VIDEO_PROFILE_VP9_PROFILE2; + case VAProfileAV1Profile0: + return PIPE_VIDEO_PROFILE_AV1_MAIN; + case VAProfileNone: + return PIPE_VIDEO_PROFILE_UNKNOWN; + default: + return PIPE_VIDEO_PROFILE_UNKNOWN; + } +} + +/* NOTE: mesa va frontend only supports VLD and EncSlice */ +static enum pipe_video_entrypoint pipe_entrypoint_from_va( + VAEntrypoint entrypoint) +{ + switch (entrypoint) { + case VAEntrypointVLD: + return PIPE_VIDEO_ENTRYPOINT_BITSTREAM; + case VAEntrypointIDCT: + return PIPE_VIDEO_ENTRYPOINT_IDCT; + case VAEntrypointMoComp: + return PIPE_VIDEO_ENTRYPOINT_MC; + case VAEntrypointEncSlice: /* fall through */ + case VAEntrypointEncSliceLP: + return PIPE_VIDEO_ENTRYPOINT_ENCODE; + default: + return PIPE_VIDEO_ENTRYPOINT_UNKNOWN; + } +} + +static enum pipe_format pipe_format_from_va_fourcc(unsigned format) +{ + switch(format) { + case VA_FOURCC('N','V','1','2'): + return PIPE_FORMAT_NV12; +/* TODO: These are already defined in mesa, but not yet in virglrenderer + case VA_FOURCC('P','0','1','0'): + return PIPE_FORMAT_P010; + case VA_FOURCC('P','0','1','6'): + return PIPE_FORMAT_P016; +*/ + case VA_FOURCC('I','4','2','0'): + return PIPE_FORMAT_IYUV; + case VA_FOURCC('Y','V','1','2'): + return PIPE_FORMAT_YV12; + case VA_FOURCC('Y','U','Y','V'): + case VA_FOURCC('Y','U','Y','2'): + return PIPE_FORMAT_YUYV; + case VA_FOURCC('U','Y','V','Y'): + return PIPE_FORMAT_UYVY; + case VA_FOURCC('B','G','R','A'): + return PIPE_FORMAT_B8G8R8A8_UNORM; + case VA_FOURCC('R','G','B','A'): + return PIPE_FORMAT_R8G8B8A8_UNORM; + case VA_FOURCC('B','G','R','X'): + return PIPE_FORMAT_B8G8R8X8_UNORM; + case VA_FOURCC('R','G','B','X'): + return PIPE_FORMAT_R8G8B8X8_UNORM; + default: + return PIPE_FORMAT_NONE; + } +} + + +static VAProfile va_profile_from_pipe(enum pipe_video_profile profile) +{ + switch (profile) { + case PIPE_VIDEO_PROFILE_MPEG2_SIMPLE: + return VAProfileMPEG2Simple; + case PIPE_VIDEO_PROFILE_MPEG2_MAIN: + return VAProfileMPEG2Main; + case PIPE_VIDEO_PROFILE_MPEG4_SIMPLE: + return VAProfileMPEG4Simple; + case PIPE_VIDEO_PROFILE_MPEG4_ADVANCED_SIMPLE: + return VAProfileMPEG4AdvancedSimple; + case PIPE_VIDEO_PROFILE_VC1_SIMPLE: + return VAProfileVC1Simple; + case PIPE_VIDEO_PROFILE_VC1_MAIN: + return VAProfileVC1Main; + case PIPE_VIDEO_PROFILE_VC1_ADVANCED: + return VAProfileVC1Advanced; + case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: + return VAProfileH264ConstrainedBaseline; + case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: + return VAProfileH264Main; + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: + return VAProfileH264High; + case PIPE_VIDEO_PROFILE_HEVC_MAIN: + return VAProfileHEVCMain; + case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: + return VAProfileHEVCMain10; + case PIPE_VIDEO_PROFILE_JPEG_BASELINE: + return VAProfileJPEGBaseline; + case PIPE_VIDEO_PROFILE_VP9_PROFILE0: + return VAProfileVP9Profile0; + case PIPE_VIDEO_PROFILE_VP9_PROFILE2: + return VAProfileVP9Profile2; + case PIPE_VIDEO_PROFILE_AV1_MAIN: + return VAProfileAV1Profile0; + case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_12: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_444: + case PIPE_VIDEO_PROFILE_UNKNOWN: + return VAProfileNone; + default: + return -1; + } +} + +/* + * There is no invalid entrypoint defined in libva, + * so add this definition to make the code clear + */ +#define VAEntrypointNone 0 +static int va_entrypoint_from_pipe(enum pipe_video_entrypoint entrypoint) +{ + switch (entrypoint) { + case PIPE_VIDEO_ENTRYPOINT_BITSTREAM: + return VAEntrypointVLD; + case PIPE_VIDEO_ENTRYPOINT_IDCT: + return VAEntrypointIDCT; + case PIPE_VIDEO_ENTRYPOINT_MC: + return VAEntrypointMoComp; + case PIPE_VIDEO_ENTRYPOINT_ENCODE: + return VAEntrypointEncSlice; + default: + return VAEntrypointNone; + } +} + +static uint32_t va_format_from_pipe_chroma( + enum pipe_video_chroma_format chroma_format) +{ + switch (chroma_format) { + case PIPE_VIDEO_CHROMA_FORMAT_400: + return VA_RT_FORMAT_YUV400; + case PIPE_VIDEO_CHROMA_FORMAT_420: + return VA_RT_FORMAT_YUV420; + case PIPE_VIDEO_CHROMA_FORMAT_422: + return VA_RT_FORMAT_YUV422; + case PIPE_VIDEO_CHROMA_FORMAT_444: + return VA_RT_FORMAT_YUV444; + case PIPE_VIDEO_CHROMA_FORMAT_NONE: + default: + return 0; + } +} + +static uint32_t drm_format_from_va_fourcc(uint32_t va_fourcc) +{ + switch (va_fourcc) { + case VA_FOURCC_NV12: + return DRM_FORMAT_NV12; + case VA_FOURCC_NV21: + return DRM_FORMAT_NV21; + default: + return DRM_FORMAT_INVALID; + } +} + +static void fill_video_dma_buf(struct virgl_video_dma_buf *dmabuf, + const VADRMPRIMESurfaceDescriptor *desc) +{ + unsigned i, j, obj_idx; + struct virgl_video_dma_buf_plane *plane; + +/* + virgl_log("surface: fourcc=0x%08x, size=%ux%u, num_objects=%u, + num_layers=%u\n", desc->fourcc, desc->width, desc->height, + desc->num_objects, desc->num_layers); + + for (i = 0; i < desc->num_objects; i++) + virgl_log(" objects[%u]: fd=%d, size=%u, modifier=0x%lx\n", + i, desc->objects[i].fd, desc->objects[i].size, + desc->objects[i].drm_format_modifier); + + for (i = 0; i < desc->num_layers; i++) + virgl_log(" layers[%u] : format=0x%08x, num_planes=%u, " + "obj=%u,%u,%u,%u, offset=%u,%u,%u,%u, pitch=%u,%u,%u,%u\n", + i, desc->layers[i].drm_format, desc->layers[i].num_planes, + desc->layers[i].object_index[0], + desc->layers[i].object_index[1], + desc->layers[i].object_index[2], + desc->layers[i].object_index[3], + desc->layers[i].offset[0], + desc->layers[i].offset[1], + desc->layers[i].offset[2], + desc->layers[i].offset[3], + desc->layers[i].pitch[0], + desc->layers[i].pitch[1], + desc->layers[i].pitch[2], + desc->layers[i].pitch[3]); +*/ + + dmabuf->drm_format = drm_format_from_va_fourcc(desc->fourcc); + dmabuf->width = desc->width; + dmabuf->height = desc->height; + + for (i = 0, dmabuf->num_planes = 0; i < desc->num_layers; i++) { + for (j = 0; j < desc->layers[i].num_planes && + dmabuf->num_planes < ARRAY_SIZE(dmabuf->planes); j++) { + + obj_idx = desc->layers[i].object_index[j]; + plane = &dmabuf->planes[dmabuf->num_planes++]; + plane->drm_format = desc->layers[i].drm_format; + plane->offset = desc->layers[i].offset[j]; + plane->pitch = desc->layers[i].pitch[j]; + plane->fd = desc->objects[obj_idx].fd; + plane->size = desc->objects[obj_idx].size; + plane->modifier = desc->objects[obj_idx].drm_format_modifier; + } + } +} + +static struct virgl_video_dma_buf *export_video_dma_buf( + struct virgl_video_buffer *buffer, + unsigned flags) +{ + struct virgl_video_dma_buf *dmabuf; + uint32_t exp_flags; + VAStatus va_stat; + VADRMPRIMESurfaceDescriptor desc; + + exp_flags = VA_EXPORT_SURFACE_SEPARATE_LAYERS; + + if (flags & VIRGL_VIDEO_DMABUF_READ_ONLY) + exp_flags |= VA_EXPORT_SURFACE_READ_ONLY; + + if (flags & VIRGL_VIDEO_DMABUF_WRITE_ONLY) + exp_flags |= VA_EXPORT_SURFACE_WRITE_ONLY; + + dmabuf = calloc(1, sizeof(*dmabuf)); + if (!dmabuf) + return NULL; + + va_stat = vaExportSurfaceHandle(va_dpy, buffer->va_sfc, + VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME_2, exp_flags, &desc); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("export surface failed, err = 0x%X\n", va_stat); + goto free_dmabuf; + } + + fill_video_dma_buf(dmabuf, &desc); + dmabuf->flags = flags; + dmabuf->buf = buffer; + + return dmabuf; + +free_dmabuf: + free(dmabuf); + return NULL; +} + +static void destroy_video_dma_buf(struct virgl_video_dma_buf *dmabuf) +{ + unsigned i; + + if (dmabuf) { + for (i = 0; i < dmabuf->num_planes; i++) + close(dmabuf->planes[i].fd); + + free(dmabuf); + } +} + +static void encode_upload_picture(struct virgl_video_codec *codec, + struct virgl_video_buffer *buffer) +{ + VAStatus va_stat; + + if (!callbacks || !callbacks->encode_upload_picture) + return; + + va_stat = vaSyncSurface(va_dpy, buffer->va_sfc); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("sync surface failed, err = 0x%x\n", va_stat); + return; + } + + if (!buffer->dmabuf) + buffer->dmabuf = export_video_dma_buf(buffer, VIRGL_VIDEO_DMABUF_WRITE_ONLY); + + if (buffer->dmabuf) + callbacks->encode_upload_picture(codec, buffer->dmabuf); +} + +static void encode_completed(struct virgl_video_codec *codec, + struct virgl_video_buffer *buffer) +{ + VAStatus va_stat; + VACodedBufferSegment *buf, *buf_list; + void **coded_bufs = NULL; + unsigned *coded_sizes = NULL; + unsigned i, num_coded_bufs = 0; + + if (!callbacks || !callbacks->encode_completed) + return; + + va_stat = vaMapBuffer(va_dpy, codec->va_coded_buf, (void **)(&buf_list)); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("map coded buffer failed, err = 0x%x\n", va_stat); + return; + } + + for (buf = buf_list; buf; buf = (VACodedBufferSegment *)buf->next) + num_coded_bufs++; + + coded_bufs = calloc(num_coded_bufs, sizeof(void *)); + coded_sizes = calloc(num_coded_bufs, sizeof(unsigned)); + if (!coded_bufs || !coded_sizes) { + virgl_log("alloc memory failed, num_coded_bufs %u\n", num_coded_bufs); + goto fail_unmap_buffer; + } + + for (buf = buf_list, i = 0; buf; buf = (VACodedBufferSegment *)buf->next) { + coded_bufs[i] = buf->buf; + coded_sizes[i++] = buf->size; + } + + callbacks->encode_completed(codec, buffer->dmabuf, NULL, num_coded_bufs, + (const void * const*)coded_bufs, coded_sizes); + +fail_unmap_buffer: + vaUnmapBuffer(va_dpy, codec->va_coded_buf); + free(coded_bufs); + free(coded_sizes); +} + +static void decode_completed(struct virgl_video_codec *codec, + struct virgl_video_buffer *buffer) +{ + if (!callbacks || !callbacks->decode_completed) + return; + + if (!buffer->dmabuf) + buffer->dmabuf = export_video_dma_buf(buffer, VIRGL_VIDEO_DMABUF_READ_ONLY); + + if (buffer->dmabuf) + callbacks->decode_completed(codec, buffer->dmabuf); +} + +static VASurfaceID get_enc_ref_pic(struct virgl_video_codec *codec, + uint32_t frame_num) +{ + uint32_t idx; + struct virgl_video_create_buffer_args args; + + if (frame_num == VA_INVALID_ID) + return VA_INVALID_ID; + + idx = frame_num % ARRAY_SIZE(codec->ref_pic_list); + + if (!codec->ref_pic_list[idx]) { + args.format = PIPE_FORMAT_NV21; + args.width = codec->width; + args.height = codec->height; + args.interlaced = 0; + args.opaque = NULL; + codec->ref_pic_list[idx] = virgl_video_create_buffer(&args); + if (!codec->ref_pic_list[idx]) { + virgl_log("create ref pic for frame_num %u failed\n", frame_num); + return VA_INVALID_ID; + } + } + + return codec->ref_pic_list[idx]->va_sfc; +} + +int virgl_video_init(int drm_fd, + struct virgl_video_callbacks *cbs, unsigned int flags) +{ + VAStatus va_stat; + int major_ver, minor_ver; + const char *driver; + + (void)flags; + + if (drm_fd < 0) { + virgl_log("invalid drm fd: %d\n", drm_fd); + return -1; + } + + va_dpy = vaGetDisplayDRM(drm_fd); + if (!va_dpy) { + virgl_log("get va display failed\n"); + return -1; + } + + va_stat = vaInitialize(va_dpy, &major_ver, &minor_ver); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("init va library failed\n"); + virgl_video_destroy(); + return -1; + } + + virgl_log("VA-API version: %d.%d\n", major_ver, minor_ver); + + driver = vaQueryVendorString(va_dpy); + virgl_log("Driver version: %s\n", driver ? driver : "<unknown>"); + + if (!driver || !strstr(driver, "Mesa Gallium")) { + virgl_log("only supports mesa va drivers now\n"); + virgl_video_destroy(); + return -1; + } + + callbacks = cbs; + + return 0; +} + +void virgl_video_destroy(void) +{ + if (va_dpy) { + vaTerminate(va_dpy); + va_dpy = NULL; + } + + callbacks = NULL; +} + +static int fill_vcaps_entry(VAProfile profile, VAEntrypoint entrypoint, + struct virgl_video_caps *vcaps) +{ + VAConfigID cfg; + VASurfaceAttrib *attrs; + unsigned i, num_attrs; + + /* FIXME: default values */ + vcaps->profile = pipe_profile_from_va(profile); + vcaps->entrypoint = pipe_entrypoint_from_va(entrypoint); + vcaps->max_level = 0; + vcaps->stacked_frames = 0; + vcaps->max_width = 0; + vcaps->max_height = 0; + vcaps->prefered_format = PIPE_FORMAT_NONE; + vcaps->max_macroblocks = 1; + vcaps->npot_texture = 1; + vcaps->supports_progressive = 1; + vcaps->supports_interlaced = 0; + vcaps->prefers_interlaced = 0; + vcaps->max_temporal_layers = 0; + + vaCreateConfig(va_dpy, profile, entrypoint, NULL, 0, &cfg); + + vaQuerySurfaceAttributes(va_dpy, cfg, NULL, &num_attrs); + attrs = calloc(num_attrs, sizeof(VASurfaceAttrib)); + if (!attrs) + return -1; + + vaQuerySurfaceAttributes(va_dpy, cfg, attrs, &num_attrs); + for (i = 0; i < num_attrs; i++) { + switch (attrs[i].type) { + case VASurfaceAttribMaxHeight: + vcaps->max_height = attrs[i].value.value.i; + break; + case VASurfaceAttribMaxWidth: + vcaps->max_width = attrs[i].value.value.i; + break; + case VASurfaceAttribPixelFormat: + if (PIPE_FORMAT_NONE == vcaps->prefered_format) + vcaps->prefered_format = \ + pipe_format_from_va_fourcc(attrs[i].value.value.i); + break; + default: + break; + } + } + + free(attrs); + + vaDestroyConfig(va_dpy, cfg); + + return 0; +} + +int virgl_video_fill_caps(union virgl_caps *caps) +{ + int i, j; + int num_profiles, num_entrypoints; + VAProfile *profiles = NULL; + VAEntrypoint *entrypoints = NULL; + + if (!va_dpy || !caps) + return -1; + + num_entrypoints = vaMaxNumEntrypoints(va_dpy); + entrypoints = calloc(num_entrypoints, sizeof(VAEntrypoint)); + if (!entrypoints) + return -1; + + num_profiles = vaMaxNumProfiles(va_dpy); + profiles = calloc(num_profiles, sizeof(VAProfile)); + if (!profiles) { + free(entrypoints); + return -1; + } + + vaQueryConfigProfiles(va_dpy, profiles, &num_profiles); + for (i = 0, caps->v2.num_video_caps = 0; i < num_profiles; i++) { + /* only support H.264 and H.265 now */ + if (profiles[i] != VAProfileH264Main && + profiles[i] != VAProfileH264High && + profiles[i] != VAProfileH264ConstrainedBaseline && + profiles[i] != VAProfileHEVCMain) + continue; + + vaQueryConfigEntrypoints(va_dpy, profiles[i], + entrypoints, &num_entrypoints); + for (j = 0; j < num_entrypoints && + caps->v2.num_video_caps < ARRAY_SIZE(caps->v2.video_caps); j++) { + /* support encoding and decoding */ + if (VAEntrypointVLD != entrypoints[j] && + VAEntrypointEncSlice != entrypoints[j]) + continue; + + fill_vcaps_entry(profiles[i], entrypoints[j], + &caps->v2.video_caps[caps->v2.num_video_caps++]); + } + } + + free(profiles); + free(entrypoints); + + return 0; +} + +struct virgl_video_codec *virgl_video_create_codec( + const struct virgl_video_create_codec_args *args) +{ + VAStatus va_stat; + VAConfigID cfg; + VAContextID ctx; + VAConfigAttrib attr; + VAProfile profile; + VAEntrypoint entrypoint; + uint32_t format; + struct virgl_video_codec *codec; + + if (!va_dpy || !args) + return NULL; + + profile = va_profile_from_pipe(args->profile); + entrypoint = va_entrypoint_from_pipe(args->entrypoint); + format = va_format_from_pipe_chroma(args->chroma_format); + if (VAProfileNone == profile || VAEntrypointNone == entrypoint) + return NULL; + + codec = (struct virgl_video_codec *)calloc(1, sizeof(*codec)); + if (!codec) + return NULL; + + attr.type = VAConfigAttribRTFormat; + vaGetConfigAttributes(va_dpy, profile, entrypoint, &attr, 1); + if (!(attr.value & format)) { + virgl_log("format 0x%x not supported, supported formats: 0x%x\n", + format, attr.value); + goto err; + } + + va_stat = vaCreateConfig(va_dpy, profile, entrypoint, &attr, 1, &cfg); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("create config failed, err = 0x%x\n", va_stat); + goto err; + } + codec->va_cfg = cfg; + + va_stat = vaCreateContext(va_dpy, cfg, args->width, args->height, + VA_PROGRESSIVE, NULL, 0, &ctx); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("create context failed, err = 0x%x\n", va_stat); + goto err; + } + codec->va_ctx = ctx; + + codec->profile = args->profile; + codec->level = args->level; + codec->entrypoint = args->entrypoint; + codec->chroma_format = args->chroma_format; + codec->width = args->width; + codec->height = args->height; + codec->max_references = args->max_references; + codec->opaque = args->opaque; + + if (entrypoint == VAEntrypointEncSlice) { + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncCodedBufferType, + CODED_BUF_DEFAULT_SIZE(codec->width, codec->height), + 1, NULL, &codec->va_coded_buf); + } + + return codec; + +err: + virgl_video_destroy_codec(codec); + + return NULL; +} + +void virgl_video_destroy_codec(struct virgl_video_codec *codec) +{ + unsigned i; + + if (!va_dpy || !codec) + return; + + if (codec->va_ctx) + vaDestroyContext(va_dpy, codec->va_ctx); + + if (codec->va_cfg) + vaDestroyConfig(va_dpy, codec->va_cfg); + + if (codec->va_coded_buf) + vaDestroyBuffer(va_dpy, codec->va_coded_buf); + + for (i = 0; i < ARRAY_SIZE(codec->ref_pic_list); i++) { + if (codec->ref_pic_list[i]) + free(codec->ref_pic_list[i]); + } + + free(codec); +} + +struct virgl_video_buffer *virgl_video_create_buffer( + const struct virgl_video_create_buffer_args *args) +{ + VAStatus va_stat; + VASurfaceID sfc; + uint32_t format; + struct virgl_video_buffer *buffer; + + if (!va_dpy || !args) + return NULL; + + /* + * FIXME: always use YUV420 now, + * may be use va_format_from_pipe(args->format) + */ + format = VA_RT_FORMAT_YUV420; + if (!format) { + virgl_log("pipe format %d not supported\n", args->format); + return NULL; + } + + buffer = (struct virgl_video_buffer *)calloc(1, sizeof(*buffer)); + if (!buffer) + return NULL; + + va_stat = vaCreateSurfaces(va_dpy, format, + args->width, args->height, &sfc, 1, NULL, 0); + if (VA_STATUS_SUCCESS != va_stat) { + free(buffer); + return NULL; + } + + buffer->va_sfc = sfc; + buffer->format = args->format; + buffer->width = args->width; + buffer->height = args->height; + buffer->opaque = args->opaque; + + return buffer; +} + +void virgl_video_destroy_buffer(struct virgl_video_buffer *buffer) +{ + if (!va_dpy || !buffer) + return; + + if (buffer->dmabuf) + destroy_video_dma_buf(buffer->dmabuf); + + if (buffer->va_sfc) + vaDestroySurfaces(va_dpy, &buffer->va_sfc, 1); + + free(buffer); +} + +void *virgl_video_codec_opaque_data(struct virgl_video_codec *codec) +{ + return codec ? codec->opaque : NULL; +} + +enum pipe_video_profile virgl_video_codec_profile( + const struct virgl_video_codec *codec) +{ + return codec ? codec->profile : PIPE_VIDEO_PROFILE_UNKNOWN; +} + +uint32_t virgl_video_buffer_id(const struct virgl_video_buffer *buffer) +{ + return (uint32_t)(buffer ? buffer->va_sfc : VA_INVALID_SURFACE); +} + +void *virgl_video_buffer_opaque_data(struct virgl_video_buffer *buffer) +{ + return buffer ? buffer->opaque : NULL; +} + +int virgl_video_begin_frame(struct virgl_video_codec *codec, + struct virgl_video_buffer *target) +{ + VAStatus va_stat; + + if (!va_dpy || !codec || !target) + return -1; + + if (codec->entrypoint == PIPE_VIDEO_ENTRYPOINT_ENCODE) + encode_upload_picture(codec, target); + + codec->buffer = target; + va_stat = vaBeginPicture(va_dpy, codec->va_ctx, target->va_sfc); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("begin picture failed, err = 0x%x\n", va_stat); + return -1; + } + + return 0; +} + + +#define ITEM_SET(dest, src, member) \ + (dest)->member = (src)->member + +#define ITEM_CPY(dest, src, member) \ + memcpy(&(dest)->member, &(src)->member, sizeof((dest)->member)) + + +static void h264_init_picture(VAPictureH264 *pic) +{ + pic->picture_id = VA_INVALID_SURFACE; + pic->frame_idx = 0; + pic->flags = VA_PICTURE_H264_INVALID; + pic->TopFieldOrderCnt = 0; + pic->BottomFieldOrderCnt = 0; +} + +/* + * Refer to vlVaHandlePictureParameterBufferH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_picture_param(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const struct virgl_h264_picture_desc *desc, + VAPictureParameterBufferH264 *vapp) +{ + unsigned i; + VAPictureH264 *pic; + + (void)codec; + + /* CurrPic */ + pic = &vapp->CurrPic; + pic->picture_id = target->va_sfc; + pic->frame_idx = desc->frame_num; + pic->flags = desc->is_reference ? VA_PICTURE_H264_SHORT_TERM_REFERENCE : 0; + if (desc->field_pic_flag) + pic->flags |= (desc->bottom_field_flag ? VA_PICTURE_H264_BOTTOM_FIELD + : VA_PICTURE_H264_TOP_FIELD); + pic->TopFieldOrderCnt = desc->field_order_cnt[0]; + pic->BottomFieldOrderCnt = desc->field_order_cnt[1]; + + + /* ReferenceFrames */ + for (i = 0; i < ARRAY_SIZE(vapp->ReferenceFrames); i++) + h264_init_picture(&vapp->ReferenceFrames[i]); + + for (i = 0; i < desc->num_ref_frames; i++) { + pic = &vapp->ReferenceFrames[i]; + + pic->picture_id = desc->buffer_id[i]; + pic->frame_idx = desc->frame_num_list[i]; + pic->flags = (desc->is_long_term[i] + ? VA_PICTURE_H264_LONG_TERM_REFERENCE + : VA_PICTURE_H264_SHORT_TERM_REFERENCE); + if (desc->top_is_reference[i] && desc->bottom_is_reference[i]) { + // Full frame. This block intentionally left blank. No flags set. + } else { + if (desc->top_is_reference[i]) + pic->flags |= VA_PICTURE_H264_TOP_FIELD; + else + pic->flags |= VA_PICTURE_H264_BOTTOM_FIELD; + } + pic->TopFieldOrderCnt = desc->field_order_cnt_list[i][0]; + pic->BottomFieldOrderCnt = desc->field_order_cnt_list[i][1]; + } + + //vapp->picture_width_in_mbs_minus1 = (codec->width - 1) / 16; + //vapp->picture_height_in_mbs_minus1 = (codec->height - 1) / 16; + ITEM_SET(vapp, &desc->pps.sps, bit_depth_luma_minus8); + ITEM_SET(vapp, &desc->pps.sps, bit_depth_chroma_minus8); + ITEM_SET(vapp, desc, num_ref_frames); + + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, chroma_format_idc); + //vapp->seq_fields.bits.residual_colour_transform_flag = 0; + //vapp->seq_fields.bits.gaps_in_frame_num_value_allowed_flag = 0; + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, frame_mbs_only_flag); + ITEM_SET(&vapp->seq_fields.bits, + &desc->pps.sps, mb_adaptive_frame_field_flag); + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, direct_8x8_inference_flag); + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, MinLumaBiPredSize8x8); + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, log2_max_frame_num_minus4); + ITEM_SET(&vapp->seq_fields.bits, &desc->pps.sps, pic_order_cnt_type); + ITEM_SET(&vapp->seq_fields.bits, + &desc->pps.sps, log2_max_pic_order_cnt_lsb_minus4); + ITEM_SET(&vapp->seq_fields.bits, + &desc->pps.sps, delta_pic_order_always_zero_flag); + + //ITEM_SET(vapp, &desc->pps, num_slice_groups_minus1); + //ITEM_SET(vapp, &desc->pps, slice_group_map_type); + //ITEM_SET(vapp, &desc->pps, slice_group_change_rate_minus1); + ITEM_SET(vapp, &desc->pps, pic_init_qp_minus26); + ITEM_SET(vapp, &desc->pps, pic_init_qs_minus26); + ITEM_SET(vapp, &desc->pps, chroma_qp_index_offset); + ITEM_SET(vapp, &desc->pps, second_chroma_qp_index_offset); + + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, entropy_coding_mode_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_pred_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_bipred_idc); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, transform_8x8_mode_flag); + ITEM_SET(&vapp->pic_fields.bits, desc, field_pic_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, constrained_intra_pred_flag); + vapp->pic_fields.bits.pic_order_present_flag = + desc->pps.bottom_field_pic_order_in_frame_present_flag; + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, deblocking_filter_control_present_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, redundant_pic_cnt_present_flag); + vapp->pic_fields.bits.reference_pic_flag = desc->is_reference; + + ITEM_SET(vapp, desc, frame_num); +} + + + /* Refer to vlVaHandleIQMatrixBufferH264() in mesa */ +static void h264_fill_iq_matrix(const struct virgl_h264_picture_desc *desc, + VAIQMatrixBufferH264 *vaiqm) +{ + ITEM_CPY(vaiqm, &desc->pps, ScalingList4x4); + ITEM_CPY(vaiqm, &desc->pps, ScalingList8x8); +} + +/* + * Refer to vlVaHandleSliceParameterBufferH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_slice_param(const struct virgl_h264_picture_desc *desc, + VASliceParameterBufferH264 *vasp) +{ + //vasp->slice_data_size; + //vasp->slice_data_offset; + //vasp->slice_data_flag; + //vasp->slice_data_bit_offset; + //vasp->first_mb_in_slice; + //vasp->slice_type; + //vasp->direct_spatial_mv_pred_flag; + ITEM_SET(vasp, desc, num_ref_idx_l0_active_minus1); + ITEM_SET(vasp, desc, num_ref_idx_l1_active_minus1); + //vasp->cabac_init_idc; + //vasp->slice_qp_delta; + //vasp->disable_deblocking_filter_idc; + //vasp->slice_alpha_c0_offset_div2; + //vasp->slice_beta_offset_div2; + //vasp->RefPicList0[32]; + //vasp->RefPicList1[32]; + + /* see pred_weight_table */ + //vasp->luma_log2_weight_denom; + //vasp->chroma_log2_weight_denom; + //vasp->luma_weight_l0_flag; + //vasp->luma_weight_l0[32]; + //vasp->luma_offset_l0[32]; + //vasp->chroma_weight_l0_flag; + //vasp->chroma_weight_l0[32][2]; + //vasp->chroma_offset_l0[32][2]; + //vasp->luma_weight_l1_flag; + //vasp->luma_weight_l1[32]; + //vasp->luma_offset_l1[32]; + //vasp->chroma_weight_l1_flag; + //vasp->chroma_weight_l1[32][2]; + //vasp->chroma_offset_l1[32][2]; +} + +/* + * Refer to vlVaHandleVAEncPictureParameterBufferTypeH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_enc_picture_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc, + VAEncPictureParameterBufferH264 *param) +{ + unsigned i; + + (void)codec; + (void)source; + + /* CurrPic */ + param->CurrPic.picture_id = get_enc_ref_pic(codec, desc->frame_num); + //CurrPic.frame_idx; + //CurrPic.flags; + param->CurrPic.TopFieldOrderCnt = desc->pic_order_cnt; + //CurrPic.BottomFieldOrderCnt; + + /* ReferenceFrames */ + for (i = 0; i < ARRAY_SIZE(param->ReferenceFrames); i++) + h264_init_picture(¶m->ReferenceFrames[i]); + + /* coded_buf */ + param->coded_buf = codec->va_coded_buf; + + //pic_parameter_set_id; + //seq_parameter_set_id; + //last_picture; + //frame_num + param->pic_init_qp = desc->quant_i_frames; + param->num_ref_idx_l0_active_minus1 = desc->num_ref_idx_l0_active_minus1; + param->num_ref_idx_l1_active_minus1 = desc->num_ref_idx_l1_active_minus1; + //chroma_qp_index_offset; + //second_chroma_qp_index_offset; + + /* pic_fields */ + param->pic_fields.bits.idr_pic_flag = + (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR); + param->pic_fields.bits.reference_pic_flag = !desc->not_referenced; + param->pic_fields.bits.entropy_coding_mode_flag = desc->pic_ctrl.enc_cabac_enable; + //pic_fields.bits.weighted_pred_flag + //pic_fields.bits.weighted_bipred_idc + //pic_fields.bits.constrained_intra_pred_flag + //pic_fields.bits.transform_8x8_mode_flag + //pic_fields.bits.deblocking_filter_control_present_flag + //pic_fields.bits.redundant_pic_cnt_present_flag + //pic_fields.bits.pic_order_present_flag + //pic_fields.bits.pic_scaling_matrix_present_flag + +} + +/* + * Refer to vlVaHandleVAEncSliceParameterBufferTypeH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_enc_slice_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc, + VAEncSliceParameterBufferH264 *param) +{ + unsigned i; + const struct virgl_h264_slice_descriptor *sd; + + (void)codec; + (void)source; + + /* Get the lastest slice descriptor */ + if (desc->num_slice_descriptors && + desc->num_slice_descriptors <= ARRAY_SIZE(desc->slices_descriptors)) { + sd = &desc->slices_descriptors[desc->num_slice_descriptors - 1]; + param->macroblock_address = sd->macroblock_address; + param->num_macroblocks = sd->num_macroblocks; + //macroblock_info; + } + + switch (desc->picture_type) { + case PIPE_H2645_ENC_PICTURE_TYPE_P: + param->slice_type = 0; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_B: + param->slice_type = 1; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_I: + case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fall through */ + param->slice_type = 2; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_SKIP: + default: + break; + } + + //pic_parameter_set_id; + //idr_pic_id; + //pic_order_cnt_lsb; + //delta_pic_order_cnt_bottom; + //delta_pic_order_cnt[2]; + //direct_spatial_mv_pred_flag; + + /* + * Sine num_ref_idx_l0_active_minus1 and num_ref_idx_l1_active_minus1 + * have been passed by VAEncPictureParameterBufferH264, + * num_ref_idx_active_override_flag is always set to 0. + */ + param->num_ref_idx_active_override_flag = 0; + //num_ref_idx_l0_active_minus1 + //num_ref_idx_l1_active_minus1 + + /* Reference List */ + for (i = 0; i < 32; i++) { + h264_init_picture(¶m->RefPicList0[i]); + h264_init_picture(¶m->RefPicList1[i]); + + param->RefPicList0[i].picture_id = + get_enc_ref_pic(codec, desc->ref_idx_l0_list[i]); + param->RefPicList1[i].picture_id = + get_enc_ref_pic(codec, desc->ref_idx_l1_list[i]); + + if (param->RefPicList0[i].picture_id != VA_INVALID_ID) + param->RefPicList0[i].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; + + if (param->RefPicList1[i].picture_id != VA_INVALID_ID) + param->RefPicList1[i].flags = VA_PICTURE_H264_SHORT_TERM_REFERENCE; + } + + //luma_log2_weight_denom; + //chroma_log2_weight_denom; + //luma_weight_l0_flag; + //luma_weight_l0[32]; + //luma_offset_l0[32]; + //chroma_weight_l0_flag; + //chroma_weight_l0[32][2]; + //chroma_offset_l0[32][2]; + //luma_weight_l1_flag; + //luma_weight_l1[32]; + //luma_offset_l1[32]; + //chroma_weight_l1_flag; + //chroma_weight_l1[32][2]; + //chroma_offset_l1[32][2]; + param->cabac_init_idc = desc->pic_ctrl.enc_cabac_init_idc; + //slice_qp_delta; + //disable_deblocking_filter_idc; + //slice_alpha_c0_offset_div2; + //slice_beta_offset_div2; + +} + +/* + * Refer to vlVaHandleVAEncSequenceParameterBufferTypeH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_enc_seq_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc, + VAEncSequenceParameterBufferH264 *param) +{ + (void)codec; + (void)source; + + //seq_parameter_set_id; + param->level_idc = codec->level; + //intra_period; + param->intra_idr_period = desc->intra_idr_period; + //ip_period; + //bits_per_second; + param->max_num_ref_frames = codec->max_references; + //picture_width_in_mbs; + //picture_height_in_mbs; + + /* seq_fields.bits */ + //seq_fields.bits.chroma_format_idc + //seq_fields.bits.frame_mbs_only_flag + //seq_fields.bits.mb_adaptive_frame_field_flag + //seq_fields.bits.seq_scaling_matrix_present_flag + //seq_fields.bits.direct_8x8_inference_flag + //seq_fields.bits.log2_max_frame_num_minus4 + ITEM_SET(¶m->seq_fields.bits, &desc->seq, pic_order_cnt_type); + //seq_fields.bit.log2_max_pic_order_cnt_lsb_minus4 + //seq_fields.bit.delta_pic_order_always_zero_flag + + //bit_depth_luma_minus8; + //bit_depth_chroma_minus8; + + //num_ref_frames_in_pic_order_cnt_cycle; + //offset_for_non_ref_pic; + //offset_for_top_to_bottom_field; + //offset_for_ref_frame[256]; + if (desc->seq.enc_frame_cropping_flag) { + param->frame_cropping_flag = desc->seq.enc_frame_cropping_flag; + param->frame_crop_left_offset = desc->seq.enc_frame_crop_left_offset; + param->frame_crop_right_offset = desc->seq.enc_frame_crop_right_offset; + param->frame_crop_top_offset = desc->seq.enc_frame_crop_top_offset; + param->frame_crop_bottom_offset = desc->seq.enc_frame_crop_bottom_offset; + } + + ITEM_SET(param, &desc->seq, vui_parameters_present_flag); + + // vui_fields.bits + if (desc->seq.vui_parameters_present_flag) { + ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags, + aspect_ratio_info_present_flag); + ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags, + timing_info_present_flag); + } + //vui_fields.bits.bitstream_restriction_flag + //vui_fields.bits.log2_max_mv_length_horizontal + //vui_fields.bits.log2_max_mv_length_vertical + //vui_fields.bits.fixed_frame_rate_flag + //vui_fields.bits.low_delay_hrd_flag + //vui_fields.bits.motion_vectors_over_pic_boundaries_flag + + if (desc->seq.vui_parameters_present_flag) { + ITEM_SET(param, &desc->seq, aspect_ratio_idc); + ITEM_SET(param, &desc->seq, sar_width); + ITEM_SET(param, &desc->seq, sar_height); + } + ITEM_SET(param, &desc->seq, num_units_in_tick); + ITEM_SET(param, &desc->seq, time_scale); +} + +/* + * Refer to vlVaHandleVAEncMiscParameterTypeRateControlH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_enc_misc_param_rate_ctrl( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc, + VAEncMiscParameterRateControl *param) +{ + unsigned temporal_id = 0; /* always 0 now */ + const struct virgl_h264_enc_rate_control *rc = &desc->rate_ctrl[temporal_id]; + + (void)codec; + (void)source; + + param->bits_per_second = rc->peak_bitrate; + if (desc->rate_ctrl[0].rate_ctrl_method != + PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT) { + param->target_percentage = rc->target_bitrate * + param->bits_per_second / 100.0; + } + //window_size; + //initial_qp; + param->min_qp = rc->min_qp; + //basic_unit_size; + + /* rc_flags */ + //rc_flags.bits.reset + param->rc_flags.bits.disable_frame_skip = !rc->skip_frame_enable; + param->rc_flags.bits.disable_bit_stuffing = !rc->fill_data_enable; + //rc_flags.bits.mb_rate_control + param->rc_flags.bits.temporal_id = temporal_id; + //rc_flags.bits.cfs_I_frames + //rc_flags.bits.enable_parallel_brc + //rc_flags.bits.enable_dynamic_scaling + //rc_flags.bits.frame_tolerance_mode + + //ICQ_quality_factor; + param->max_qp = rc->max_qp; + //quality_factor; + //target_frame_size; +} + +/* + * Refer to vlVaHandleVAEncMiscParameterTypeFrameRateH264() in mesa, + * and comment out some unused parameters. + */ +static void h264_fill_enc_misc_param_frame_rate( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc, + VAEncMiscParameterFrameRate *param) +{ + unsigned temporal_id = 0; /* always 0 now */ + const struct virgl_h264_enc_rate_control *rc = &desc->rate_ctrl[temporal_id]; + + (void)codec; + (void)source; + + param->framerate = rc->frame_rate_num | (rc->frame_rate_den << 16); + param->framerate_flags.bits.temporal_id = temporal_id; +} + +static int h264_decode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const struct virgl_h264_picture_desc *desc, + unsigned num_buffers, + const void * const *buffers, + const unsigned *sizes) +{ + unsigned i; + int err = 0; + VAStatus va_stat; + VABufferID *slice_data_buf, pic_param_buf, iq_matrix_buf, slice_param_buf; + VAPictureParameterBufferH264 pic_param; + VAIQMatrixBufferH264 iq_matrix; + VASliceParameterBufferH264 slice_param; + + slice_data_buf = calloc(num_buffers, sizeof(VABufferID)); + if (!slice_data_buf) { + virgl_log("alloc slice data buffer id failed\n"); + return -1; + } + + h264_fill_picture_param(codec, target, desc, &pic_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAPictureParameterBufferType, + sizeof(pic_param), 1, &pic_param, &pic_param_buf); + + h264_fill_iq_matrix(desc, &iq_matrix); + vaCreateBuffer(va_dpy, codec->va_ctx, VAIQMatrixBufferType, + sizeof(iq_matrix), 1, &iq_matrix, &iq_matrix_buf); + + h264_fill_slice_param(desc, &slice_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VASliceParameterBufferType, + sizeof(slice_param), 1, &slice_param, &slice_param_buf); + + for (i = 0; i < num_buffers; i++) { + vaCreateBuffer(va_dpy, codec->va_ctx, VASliceDataBufferType, + sizes[i], 1, (void *)(buffers[i]), &slice_data_buf[i]); + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render picture param failed, err = 0x%x\n", va_stat); + err = -1; + goto err; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &iq_matrix_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render iq matrix failed, err = 0x%x\n", va_stat); + err = -1; + goto err; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render slice param failed, err = 0x%x\n", va_stat); + err = -1; + goto err; + } + + for (i = 0; i < num_buffers; i++) { + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_data_buf[i], 1); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render slice data failed, err = 0x%x\n", va_stat); + err = -1; + } + } + +err: + vaDestroyBuffer(va_dpy, pic_param_buf); + vaDestroyBuffer(va_dpy, iq_matrix_buf); + vaDestroyBuffer(va_dpy, slice_param_buf); + for (i = 0; i < num_buffers; i++) + vaDestroyBuffer(va_dpy, slice_data_buf[i]); + free(slice_data_buf); + + return err; +} + +static int h264_encode_render_sequence( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc) +{ + int err = 0; + VAStatus va_stat; + VAEncSequenceParameterBufferH264 seq_param; + VAEncMiscParameterBuffer *misc_param; + VABufferID seq_param_buf, rc_param_buf, fr_param_buf; + + memset(&seq_param, 0, sizeof(seq_param)); + h264_fill_enc_seq_param(codec, source, desc, &seq_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSequenceParameterBufferType, + sizeof(seq_param), 1, &seq_param, &seq_param_buf); + + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType, + sizeof(VAEncMiscParameterBuffer) + + sizeof(VAEncMiscParameterRateControl), 1, NULL, &rc_param_buf); + vaMapBuffer(va_dpy, rc_param_buf, (void **)&misc_param); + misc_param->type = VAEncMiscParameterTypeRateControl; + h264_fill_enc_misc_param_rate_ctrl(codec, source, desc, + (VAEncMiscParameterRateControl *)misc_param->data); + vaUnmapBuffer(va_dpy, rc_param_buf); + + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType, + sizeof(VAEncMiscParameterBuffer) + + sizeof(VAEncMiscParameterFrameRate), 1, NULL, &fr_param_buf); + vaMapBuffer(va_dpy, fr_param_buf, (void **)&misc_param); + misc_param->type = VAEncMiscParameterTypeFrameRate; + h264_fill_enc_misc_param_frame_rate(codec, source, desc, + (VAEncMiscParameterFrameRate *)misc_param->data); + vaUnmapBuffer(va_dpy, fr_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &seq_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h264 sequence param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &rc_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h264 rate control param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &fr_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h264 frame rate param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + +error: + vaDestroyBuffer(va_dpy, seq_param_buf); + vaDestroyBuffer(va_dpy, rc_param_buf); + vaDestroyBuffer(va_dpy, fr_param_buf); + + return err; +} + +static int h264_encode_render_picture( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc) +{ + VAStatus va_stat; + VABufferID pic_param_buf; + VAEncPictureParameterBufferH264 pic_param; + + memset(&pic_param, 0, sizeof(pic_param)); + h264_fill_enc_picture_param(codec, source, desc, &pic_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncPictureParameterBufferType, + sizeof(pic_param), 1, &pic_param, &pic_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1); + vaDestroyBuffer(va_dpy, pic_param_buf); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h264 picture param failed, err = 0x%x\n", va_stat); + return -1; + } + + return 0; +} + +static int h264_encode_render_slice( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc) +{ + VAStatus va_stat; + VABufferID slice_param_buf; + VAEncSliceParameterBufferH264 slice_param; + + memset(&slice_param, 0, sizeof(slice_param)); + h264_fill_enc_slice_param(codec, source, desc, &slice_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSliceParameterBufferType, + sizeof(slice_param), 1, &slice_param, &slice_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1); + vaDestroyBuffer(va_dpy, slice_param_buf); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h264 slice param failed, err = 0x%x\n", va_stat); + return -1; + } + + return 0; +} + +static int h264_encode_bitstream( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h264_enc_picture_desc *desc) +{ + if (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) { + h264_encode_render_sequence(codec, source, desc); + } + + h264_encode_render_picture(codec, source, desc); + h264_encode_render_slice(codec, source, desc); + + return 0; +} + +static void h265_init_picture(VAPictureHEVC *pic) +{ + pic->picture_id = VA_INVALID_SURFACE; + pic->pic_order_cnt = 0; + pic->flags = VA_PICTURE_HEVC_INVALID; +} + +/* + * Refer to vlVaHandlePictureParameterBufferHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_picture_param(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const struct virgl_h265_picture_desc *desc, + VAPictureParameterBufferHEVC *vapp) +{ + unsigned i; + + (void)codec; + (void)target; + + //vapp->CurrPic.picture_id + vapp->CurrPic.pic_order_cnt = desc->CurrPicOrderCntVal; + //vapp->CurrPic.flags + + for (i = 0; i < 15; i++) { + vapp->ReferenceFrames[i].pic_order_cnt = desc->PicOrderCntVal[i]; + vapp->ReferenceFrames[i].picture_id = desc->ref[i]; + vapp->ReferenceFrames[i].flags = VA_INVALID_SURFACE == desc->ref[i] + ? VA_PICTURE_HEVC_INVALID : 0; + } + for (i = 0; i < desc->NumPocStCurrBefore; i++) + vapp->ReferenceFrames[desc->RefPicSetStCurrBefore[i]].flags |= \ + VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE; + for (i = 0; i < desc->NumPocStCurrAfter; i++) + vapp->ReferenceFrames[desc->RefPicSetStCurrAfter[i]].flags |= \ + VA_PICTURE_HEVC_RPS_ST_CURR_AFTER; + for (i = 0; i < desc->NumPocLtCurr; i++) + vapp->ReferenceFrames[desc->RefPicSetLtCurr[i]].flags |= \ + VA_PICTURE_HEVC_RPS_LT_CURR; + + ITEM_SET(vapp, &desc->pps.sps, pic_width_in_luma_samples); + ITEM_SET(vapp, &desc->pps.sps, pic_height_in_luma_samples); + + ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, chroma_format_idc); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps.sps, separate_colour_plane_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, pcm_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps.sps, scaling_list_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, transform_skip_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps.sps, amp_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps.sps, strong_intra_smoothing_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, sign_data_hiding_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, constrained_intra_pred_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, cu_qp_delta_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_pred_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, weighted_bipred_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, transquant_bypass_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, tiles_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, entropy_coding_sync_enabled_flag); + ITEM_SET(&vapp->pic_fields.bits, &desc->pps, + pps_loop_filter_across_slices_enabled_flag); + if (desc->pps.tiles_enabled_flag) + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps, loop_filter_across_tiles_enabled_flag); + if (desc->pps.sps.pcm_enabled_flag) + ITEM_SET(&vapp->pic_fields.bits, + &desc->pps.sps, pcm_loop_filter_disabled_flag); + //ITEM_SET(vapp->pic_fields.bits, desc->pps.sps, NoPicReorderingFlag); + //ITEM_SET(vapp->pic_fields.bits, desc->pps.sps, NoBiPredFlag); + + ITEM_SET(vapp, &desc->pps.sps, sps_max_dec_pic_buffering_minus1); + ITEM_SET(vapp, &desc->pps.sps, bit_depth_luma_minus8); + ITEM_SET(vapp, &desc->pps.sps, bit_depth_chroma_minus8); + if (desc->pps.sps.pcm_enabled_flag) { + ITEM_SET(vapp, &desc->pps.sps, pcm_sample_bit_depth_luma_minus1); + ITEM_SET(vapp, &desc->pps.sps, pcm_sample_bit_depth_chroma_minus1); + } + ITEM_SET(vapp, &desc->pps.sps, log2_min_luma_coding_block_size_minus3); + ITEM_SET(vapp, &desc->pps.sps, log2_diff_max_min_luma_coding_block_size); + ITEM_SET(vapp, &desc->pps.sps, log2_min_transform_block_size_minus2); + ITEM_SET(vapp, &desc->pps.sps, log2_diff_max_min_transform_block_size); + if (desc->pps.sps.pcm_enabled_flag) { + ITEM_SET(vapp, &desc->pps.sps, + log2_min_pcm_luma_coding_block_size_minus3); + ITEM_SET(vapp, &desc->pps.sps, + log2_diff_max_min_pcm_luma_coding_block_size); + } + ITEM_SET(vapp, &desc->pps.sps, max_transform_hierarchy_depth_intra); + ITEM_SET(vapp, &desc->pps.sps, max_transform_hierarchy_depth_inter); + ITEM_SET(vapp, &desc->pps, init_qp_minus26); + ITEM_SET(vapp, &desc->pps, diff_cu_qp_delta_depth); + ITEM_SET(vapp, &desc->pps, pps_cb_qp_offset); + ITEM_SET(vapp, &desc->pps, pps_cr_qp_offset); + ITEM_SET(vapp, &desc->pps, log2_parallel_merge_level_minus2); + if (desc->pps.tiles_enabled_flag) { + ITEM_SET(vapp, &desc->pps, num_tile_columns_minus1); + ITEM_SET(vapp, &desc->pps, num_tile_rows_minus1); + ITEM_CPY(vapp, &desc->pps, column_width_minus1); + ITEM_CPY(vapp, &desc->pps, row_height_minus1); + } + + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, lists_modification_present_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps.sps, long_term_ref_pics_present_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps.sps, sps_temporal_mvp_enabled_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, cabac_init_present_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, output_flag_present_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, dependent_slice_segments_enabled_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, pps_slice_chroma_qp_offsets_present_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps.sps, sample_adaptive_offset_enabled_flag); + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, deblocking_filter_override_enabled_flag); + vapp->slice_parsing_fields.bits.pps_disable_deblocking_filter_flag = \ + desc->pps.pps_deblocking_filter_disabled_flag; + ITEM_SET(&vapp->slice_parsing_fields.bits, + &desc->pps, slice_segment_header_extension_present_flag); + vapp->slice_parsing_fields.bits.RapPicFlag = desc->RAPPicFlag; + vapp->slice_parsing_fields.bits.IdrPicFlag = desc->IDRPicFlag; + //vapp->slice_parsing_fields.bits.IntraPicFlag + + ITEM_SET(vapp, &desc->pps.sps, log2_max_pic_order_cnt_lsb_minus4); + ITEM_SET(vapp, &desc->pps.sps, num_short_term_ref_pic_sets); + vapp->num_long_term_ref_pic_sps = desc->pps.sps.num_long_term_ref_pics_sps; + ITEM_SET(vapp, &desc->pps, num_ref_idx_l0_default_active_minus1); + ITEM_SET(vapp, &desc->pps, num_ref_idx_l1_default_active_minus1); + ITEM_SET(vapp, &desc->pps, pps_beta_offset_div2); + ITEM_SET(vapp, &desc->pps, pps_tc_offset_div2); + ITEM_SET(vapp, &desc->pps, num_extra_slice_header_bits); + + ITEM_SET(vapp, &desc->pps, st_rps_bits); +} + +/* + * Refer to vlVaHandleSliceParameterBufferHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_slice_param(const struct virgl_h265_picture_desc *desc, + VASliceParameterBufferHEVC *vapp) +{ + unsigned i, j; + + //slice_data_size; + //slice_data_offset; + //slice_data_flag; + //slice_data_byte_offset; + //slice_segment_address; + for (i = 0; i < 2; i++) { + for (j = 0; j < 15; j++) + vapp->RefPicList[i][j] = desc->RefPicList[i][j]; + } + //LongSliceFlags; + //collocated_ref_idx; + //num_ref_idx_l0_active_minus1; + //num_ref_idx_l1_active_minus1; + //slice_qp_delta; + //slice_cb_qp_offset; + //slice_cr_qp_offset; + //slice_beta_offset_div2; + //slice_tc_offset_div2; + //luma_log2_weight_denom; + //delta_chroma_log2_weight_denom; + //delta_luma_weight_l0[15]; + //luma_offset_l0[15]; + //delta_chroma_weight_l0[15][2]; + //ChromaOffsetL0[15][2]; + //delta_luma_weight_l1[15]; + //luma_offset_l1[15]; + //delta_chroma_weight_l1[15][2]; + //ChromaOffsetL1[15][2]; + //five_minus_max_num_merge_cand; + //num_entry_point_offsets; + //entry_offset_to_subset_array; + //slice_data_num_emu_prevn_bytes; + //va_reserved[VA_PADDING_LOW - 2]; +} + +/* + * Refer to vlVaHandleVAEncSequenceParameterBufferTypeHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_enc_seq_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc, + VAEncSequenceParameterBufferHEVC *param) +{ + (void)codec; + (void)source; + + ITEM_SET(param, &desc->seq, general_profile_idc); + ITEM_SET(param, &desc->seq, general_level_idc); + ITEM_SET(param, &desc->seq, general_tier_flag); + ITEM_SET(param, &desc->seq, intra_period); + //intra_idr_period + ITEM_SET(param, &desc->seq, ip_period); + //bits_per_second + ITEM_SET(param, &desc->seq, pic_width_in_luma_samples); + ITEM_SET(param, &desc->seq, pic_height_in_luma_samples); + + /* seq_fields.bits */ + ITEM_SET(¶m->seq_fields.bits, &desc->seq, chroma_format_idc); + //seq_fields.bits.separate_colour_plane_flag + ITEM_SET(¶m->seq_fields.bits, &desc->seq, bit_depth_luma_minus8); + ITEM_SET(¶m->seq_fields.bits, &desc->seq, bit_depth_chroma_minus8); + //seq_fields.bits.scaling_list_enabled_flag + ITEM_SET(¶m->seq_fields.bits, &desc->seq, strong_intra_smoothing_enabled_flag); + ITEM_SET(¶m->seq_fields.bits, &desc->seq, amp_enabled_flag); + ITEM_SET(¶m->seq_fields.bits, &desc->seq, sample_adaptive_offset_enabled_flag); + ITEM_SET(¶m->seq_fields.bits, &desc->seq, pcm_enabled_flag); + //seq_fields.bits.pcm_loop_filter_disabled_flag + ITEM_SET(¶m->seq_fields.bits, &desc->seq, sps_temporal_mvp_enabled_flag); + //seq_fields.bits.low_delay_seq + //seq_fields.bits.hierachical_flag + //seq_fields.bits.reserved_bits + + ITEM_SET(param, &desc->seq, log2_min_luma_coding_block_size_minus3); + ITEM_SET(param, &desc->seq, log2_diff_max_min_luma_coding_block_size); + ITEM_SET(param, &desc->seq, log2_min_transform_block_size_minus2); + ITEM_SET(param, &desc->seq, log2_diff_max_min_transform_block_size); + ITEM_SET(param, &desc->seq, max_transform_hierarchy_depth_inter); + ITEM_SET(param, &desc->seq, max_transform_hierarchy_depth_intra); + //pcm_sample_bit_depth_luma_minus1 + //pcm_sample_bit_depth_chroma_minus1 + //log2_min_pcm_luma_coding_block_size_minus3 + //log2_max_pcm_luma_coding_block_size_minus3 + ITEM_SET(param, &desc->seq, vui_parameters_present_flag); + + /* vui_fields.bits */ + if (desc->seq.vui_parameters_present_flag) { + ITEM_SET(¶m->vui_fields.bits, &desc->seq.vui_flags, + aspect_ratio_info_present_flag); + } + //vui_fields.bits.neutral_chroma_indication_flag + //vui_fields.bits.field_seq_flag + if (desc->seq.vui_parameters_present_flag) { + param->vui_fields.bits.vui_timing_info_present_flag = + desc->seq.vui_flags.timing_info_present_flag; + } + //vui_fields.bits.bitstream_restriction_flag + //vui_fields.bits.tiles_fixed_structure_flag + //vui_fields.bits.motion_vectors_over_pic_boundaries_flag + //vui_fields.bits.restricted_ref_pic_lists_flag + //vui_fields.bits.log2_max_mv_length_horizontal + //vui_fields.bits.log2_max_mv_length_vertical + + if (desc->seq.vui_parameters_present_flag) { + ITEM_SET(param, &desc->seq, aspect_ratio_idc); + ITEM_SET(param, &desc->seq, sar_width); + ITEM_SET(param, &desc->seq, sar_height); + } + param->vui_num_units_in_tick = desc->seq.num_units_in_tick; + param->vui_time_scale = desc->seq.time_scale; + //min_spatial_segmentation_idc + //max_bytes_per_pic_denom + //max_bits_per_min_cu_denom + + //scc_fields.bits.palette_mode_enabled_flag +} + +/* + * Refer to vlVaHandleVAEncPictureParameterBufferTypeHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_enc_picture_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc, + VAEncPictureParameterBufferHEVC *param) +{ + unsigned i; + + (void)source; + + param->decoded_curr_pic.picture_id = get_enc_ref_pic(codec, desc->frame_num); + param->decoded_curr_pic.pic_order_cnt = desc->pic_order_cnt; + + for (i = 0; i < 15; i++) { + h265_init_picture(¶m->reference_frames[i]); + } + + param->coded_buf = codec->va_coded_buf; + //collocated_ref_pic_index + //last_picture + param->pic_init_qp = desc->rc.quant_i_frames; + //diff_cu_qp_delta_depth + //pps_cb_qp_offset + //pps_cr_qp_offset + //num_tile_columns_minus1 + //num_tile_rows_minus1 + //column_width_minus1[19] + //row_height_minus1[21] + ITEM_SET(param, &desc->pic, log2_parallel_merge_level_minus2); + //ctu_max_bitsize_allowed + param->num_ref_idx_l0_default_active_minus1 = desc->num_ref_idx_l0_active_minus1; + param->num_ref_idx_l1_default_active_minus1 = desc->num_ref_idx_l1_active_minus1; + //slice_pic_parameter_set_id + ITEM_SET(param, &desc->pic, nal_unit_type); + + param->pic_fields.bits.idr_pic_flag = + (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR); + switch (desc->picture_type) { + case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fallthrough */ + case PIPE_H2645_ENC_PICTURE_TYPE_I: + param->pic_fields.bits.coding_type = 1; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_P: + param->pic_fields.bits.coding_type = 2; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_B: + param->pic_fields.bits.coding_type = 3; + break; + default: + break; + } + + param->pic_fields.bits.reference_pic_flag = !desc->not_referenced; + //pic_fields.bits.dependent_slice_segments_enabled_flag + //pic_fields.bits.sign_data_hiding_enabled_flag + ITEM_SET(¶m->pic_fields.bits, &desc->pic, constrained_intra_pred_flag); + ITEM_SET(¶m->pic_fields.bits, &desc->pic, transform_skip_enabled_flag); + //pic_fields.bits.cu_qp_delta_enabled_flag + //pic_fields.bits.weighted_pred_flag + //pic_fields.bits.weighted_bipred_flag + //pic_fields.bits.transquant_bypass_enabled_flag + //pic_fields.bits.tiles_enabled_flag + //pic_fields.bits.entropy_coding_sync_enabled_flag + //pic_fields.bits.loop_filter_across_tiles_enabled_flag + ITEM_SET(¶m->pic_fields.bits, &desc->pic, + pps_loop_filter_across_slices_enabled_flag); + //pic_fields.bits.scaling_list_data_present_flag + //pic_fields.bits.screen_content_flag + //pic_fields.bits.enable_gpu_weighted_prediction + //pic_fields.bits.no_output_of_prior_pics_flag + + //hierarchical_level_plus1 + //scc_fields.bits.pps_curr_pic_ref_enabled_flag +} + +/* + * Refer to vlVaHandleVAEncSliceParameterBufferTypeHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_enc_slice_param( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc, + VAEncSliceParameterBufferHEVC *param) +{ + unsigned i; + const struct virgl_h265_slice_descriptor *sd; + + (void)source; + + /* Get the lastest slice descriptor */ + if (desc->num_slice_descriptors && + desc->num_slice_descriptors <= ARRAY_SIZE(desc->slices_descriptors)) { + sd = &desc->slices_descriptors[desc->num_slice_descriptors - 1]; + ITEM_SET(param, sd, slice_segment_address); + ITEM_SET(param, sd, num_ctu_in_slice); + } + + switch (desc->picture_type) { + case PIPE_H2645_ENC_PICTURE_TYPE_P: + param->slice_type = 0; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_B: + param->slice_type = 1; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_I: + case PIPE_H2645_ENC_PICTURE_TYPE_IDR: /* fall through */ + param->slice_type = 2; + break; + case PIPE_H2645_ENC_PICTURE_TYPE_SKIP: + default: + break; + } + + //slice_pic_parameter_set_id + + //num_ref_idx_l0_active_minus1 + //num_ref_idx_l1_active_minus1 + + for (i = 0; i < 15; i++) { + h265_init_picture(¶m->ref_pic_list0[i]); + h265_init_picture(¶m->ref_pic_list1[i]); + + param->ref_pic_list0[i].picture_id = + get_enc_ref_pic(codec, desc->ref_idx_l0_list[i]); + param->ref_pic_list1[i].picture_id = + get_enc_ref_pic(codec, desc->ref_idx_l1_list[i]); + + if (param->ref_pic_list0[i].picture_id != VA_INVALID_ID) + param->ref_pic_list0[i].flags = VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE; + + if (param->ref_pic_list1[i].picture_id != VA_INVALID_ID) + param->ref_pic_list1[i].flags = VA_PICTURE_HEVC_RPS_ST_CURR_BEFORE; + } + + //luma_log2_weight_denom + //delta_chroma_log2_weight_denom + //delta_luma_weight_l0[15] + //luma_offset_l0[15] + //delta_chroma_weight_l0[15][2] + //chroma_offset_l0[15][2] + //delta_luma_weight_l1[15] + //luma_offset_l1[15] + //delta_chroma_weight_l1[15][2] + //chroma_offset_l1[15][2] + ITEM_SET(param, &desc->slice, max_num_merge_cand); + //slice_qp_delta + ITEM_SET(param, &desc->slice, slice_cb_qp_offset); + ITEM_SET(param, &desc->slice, slice_cr_qp_offset); + ITEM_SET(param, &desc->slice, slice_beta_offset_div2); + ITEM_SET(param, &desc->slice, slice_tc_offset_div2); + + //slice_fields.bits.last_slice_of_pic_flag + //slice_fields.bits.dependent_slice_segment_flag + //slice_fields.bits.colour_plane_id + //slice_fields.bits.slice_temporal_mvp_enabled_flag + //slice_fields.bits.slice_sao_luma_flag + //slice_fields.bits.slice_sao_chroma_flag + /* + * Sine num_ref_idx_l0_active_minus1 and num_ref_idx_l1_active_minus1 + * have been passed by VAEncPictureParameterBufferHEVC, + * num_ref_idx_active_override_flag is always set to 0. + */ + param->slice_fields.bits.num_ref_idx_active_override_flag = 0; + //slice_fields.bits.mvd_l1_zero_flag + ITEM_SET(¶m->slice_fields.bits, &desc->slice, cabac_init_flag); + ITEM_SET(¶m->slice_fields.bits, &desc->slice, + slice_deblocking_filter_disabled_flag); + ITEM_SET(¶m->slice_fields.bits, + &desc->slice, slice_loop_filter_across_slices_enabled_flag); + //slice_fields.bits.collocated_from_l0_flag + + //pred_weight_table_bit_offset + //pred_weight_table_bit_length; +} + +/* + * Refer to vlVaHandleVAEncMiscParameterTypeRateControlHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_enc_misc_param_rate_ctrl( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc, + VAEncMiscParameterRateControl *param) +{ + (void)codec; + (void)source; + + param->bits_per_second = desc->rc.peak_bitrate; + if (desc->rc.rate_ctrl_method != + PIPE_H2645_ENC_RATE_CONTROL_METHOD_CONSTANT) { + param->target_percentage = desc->rc.target_bitrate * + param->bits_per_second / 100.0; + } + //window_size; + //initial_qp; + param->min_qp = desc->rc.min_qp; + //basic_unit_size; + + /* rc_flags */ + //rc_flags.bits.reset + param->rc_flags.bits.disable_frame_skip = !desc->rc.skip_frame_enable; + param->rc_flags.bits.disable_bit_stuffing = !desc->rc.fill_data_enable; + //rc_flags.bits.mb_rate_control + //rc_flags.bits.temporal_id + //rc_flags.bits.cfs_I_frames + //rc_flags.bits.enable_parallel_brc + //rc_flags.bits.enable_dynamic_scaling + //rc_flags.bits.frame_tolerance_mode + + //ICQ_quality_factor; + param->max_qp = desc->rc.max_qp; + //quality_factor; + //target_frame_size; +} + +/* + * Refer to vlVaHandleVAEncMiscParameterTypeFrameRateHEVC() in mesa, + * and comment out some unused parameters. + */ +static void h265_fill_enc_misc_param_frame_rate( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc, + VAEncMiscParameterFrameRate *param) +{ + (void)codec; + (void)source; + + param->framerate = desc->rc.frame_rate_num | (desc->rc.frame_rate_den << 16); + //framerate_flags +} + +static int h265_decode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const struct virgl_h265_picture_desc *desc, + unsigned num_buffers, + const void * const *buffers, + const unsigned *sizes) +{ + unsigned i; + int err = 0; + VAStatus va_stat; + VABufferID *slice_data_buf, pic_param_buf, slice_param_buf; + VAPictureParameterBufferHEVC pic_param = {0}; + VASliceParameterBufferHEVC slice_param = {0}; + + slice_data_buf = calloc(num_buffers, sizeof(VABufferID)); + if (!slice_data_buf) { + virgl_log("alloc slice data buffer id failed\n"); + return -1; + } + + h265_fill_picture_param(codec, target, desc, &pic_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAPictureParameterBufferType, + sizeof(pic_param), 1, &pic_param, &pic_param_buf); + + h265_fill_slice_param(desc, &slice_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VASliceParameterBufferType, + sizeof(slice_param), 1, &slice_param, &slice_param_buf); + + for (i = 0; i < num_buffers; i++) { + vaCreateBuffer(va_dpy, codec->va_ctx, VASliceDataBufferType, + sizes[i], 1, (void *)(buffers[i]), &slice_data_buf[i]); + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render picture param failed, err = 0x%x\n", va_stat); + err = -1; + goto err; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render slice param failed, err = 0x%x\n", va_stat); + err = -1; + goto err; + } + + for (i = 0; i < num_buffers; i++) { + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_data_buf[i], 1); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render slice data failed, err = 0x%x\n", va_stat); + err = -1; + } + } + +err: + vaDestroyBuffer(va_dpy, pic_param_buf); + vaDestroyBuffer(va_dpy, slice_param_buf); + for (i = 0; i < num_buffers; i++) + vaDestroyBuffer(va_dpy, slice_data_buf[i]); + free(slice_data_buf); + + return err; +} + +static int h265_encode_render_sequence( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc) +{ + int err = 0; + VAStatus va_stat; + VAEncSequenceParameterBufferHEVC seq_param; + VAEncMiscParameterBuffer *misc_param; + VABufferID seq_param_buf, rc_param_buf, fr_param_buf; + + memset(&seq_param, 0, sizeof(seq_param)); + h265_fill_enc_seq_param(codec, source, desc, &seq_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSequenceParameterBufferType, + sizeof(seq_param), 1, &seq_param, &seq_param_buf); + + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType, + sizeof(VAEncMiscParameterBuffer) + + sizeof(VAEncMiscParameterRateControl), 1, NULL, &rc_param_buf); + vaMapBuffer(va_dpy, rc_param_buf, (void **)&misc_param); + misc_param->type = VAEncMiscParameterTypeRateControl; + h265_fill_enc_misc_param_rate_ctrl(codec, source, desc, + (VAEncMiscParameterRateControl *)misc_param->data); + vaUnmapBuffer(va_dpy, rc_param_buf); + + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncMiscParameterBufferType, + sizeof(VAEncMiscParameterBuffer) + + sizeof(VAEncMiscParameterFrameRate), 1, NULL, &fr_param_buf); + vaMapBuffer(va_dpy, fr_param_buf, (void **)&misc_param); + misc_param->type = VAEncMiscParameterTypeFrameRate; + h265_fill_enc_misc_param_frame_rate(codec, source, desc, + (VAEncMiscParameterFrameRate *)misc_param->data); + vaUnmapBuffer(va_dpy, fr_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &seq_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h265 sequence param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &rc_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h265 rate control param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &fr_param_buf, 1); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h265 frame rate param failed, err = 0x%x\n", va_stat); + err = -1; + goto error; + } + +error: + vaDestroyBuffer(va_dpy, seq_param_buf); + vaDestroyBuffer(va_dpy, rc_param_buf); + vaDestroyBuffer(va_dpy, fr_param_buf); + + return err; +} + +static int h265_encode_render_picture( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc) +{ + VAStatus va_stat; + VABufferID pic_param_buf; + VAEncPictureParameterBufferHEVC pic_param; + + memset(&pic_param, 0, sizeof(pic_param)); + h265_fill_enc_picture_param(codec, source, desc, &pic_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncPictureParameterBufferType, + sizeof(pic_param), 1, &pic_param, &pic_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &pic_param_buf, 1); + vaDestroyBuffer(va_dpy, pic_param_buf); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h265 picture param failed, err = 0x%x\n", va_stat); + return -1; + } + + return 0; +} + +static int h265_encode_render_slice( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc) +{ + VAStatus va_stat; + VABufferID slice_param_buf; + VAEncSliceParameterBufferHEVC slice_param; + + memset(&slice_param, 0, sizeof(slice_param)); + h265_fill_enc_slice_param(codec, source, desc, &slice_param); + vaCreateBuffer(va_dpy, codec->va_ctx, VAEncSliceParameterBufferType, + sizeof(slice_param), 1, &slice_param, &slice_param_buf); + + va_stat = vaRenderPicture(va_dpy, codec->va_ctx, &slice_param_buf, 1); + vaDestroyBuffer(va_dpy, slice_param_buf); + + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("render h265 slice param failed, err = 0x%x\n", va_stat); + return -1; + } + + return 0; +} + +static int h265_encode_bitstream( + struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const struct virgl_h265_enc_picture_desc *desc) +{ + if (desc->picture_type == PIPE_H2645_ENC_PICTURE_TYPE_IDR) { + h265_encode_render_sequence(codec, source, desc); + } + + h265_encode_render_picture(codec, source, desc); + h265_encode_render_slice(codec, source, desc); + + return 0; +} + +int virgl_video_decode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const union virgl_picture_desc *desc, + unsigned num_buffers, + const void * const *buffers, + const unsigned *sizes) +{ + + if (!va_dpy || !codec || !target || !desc + || !num_buffers || !buffers || !sizes) + return -1; + + if (desc->base.profile != codec->profile) { + virgl_log("profiles not matched, picture: %d, codec: %d\n", + desc->base.profile, codec->profile); + return -1; + } + + switch (codec->profile) { + case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444: + return h264_decode_bitstream(codec, target, &desc->h264, + num_buffers, buffers, sizes); + case PIPE_VIDEO_PROFILE_HEVC_MAIN: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_12: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_444: + return h265_decode_bitstream(codec, target, &desc->h265, + num_buffers, buffers, sizes); + default: + break; + } + + return -1; +} + +int virgl_video_encode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const union virgl_picture_desc *desc) +{ + if (!va_dpy || !codec || !source || !desc) + return -1; + + if (desc->base.profile != codec->profile) { + virgl_log("profiles not matched, picture: %d, codec: %d\n", + desc->base.profile, codec->profile); + return -1; + } + + switch (codec->profile) { + case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444: + return h264_encode_bitstream(codec, source, &desc->h264_enc); + case PIPE_VIDEO_PROFILE_HEVC_MAIN: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_12: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_444: + return h265_encode_bitstream(codec, source, &desc->h265_enc); + default: + break; + } + + return -1; +} + +int virgl_video_end_frame(struct virgl_video_codec *codec, + struct virgl_video_buffer *target) +{ + VAStatus va_stat; + + if (!va_dpy || !codec || !target) + return -1; + + va_stat = vaEndPicture(va_dpy, codec->va_ctx); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("end picture failed, err = 0x%x\n", va_stat); + return -1; + } + + va_stat = vaSyncSurface(va_dpy, target->va_sfc); + if (VA_STATUS_SUCCESS != va_stat) { + virgl_log("sync surface failed, err = 0x%x\n", va_stat); + return -1; + } + + if (codec->entrypoint != PIPE_VIDEO_ENTRYPOINT_ENCODE) { + decode_completed(codec, target); + } else { + encode_completed(codec, target); + } + + return 0; +} + diff --git a/src/virgl_video.h b/src/virgl_video.h new file mode 100644 index 00000000..68e38894 --- /dev/null +++ b/src/virgl_video.h @@ -0,0 +1,161 @@ +/************************************************************************** + * + * Copyright (C) 2022 Kylin Software Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * General video encoding and decoding interface. + * + * This file provides a general video interface, which mainly contains + * two objects: + * + * virgl_video_buffer: + * Buffer for storing raw YUV formatted data. In VA-API based + * implementations, it is usually associated with a surface. + * + * virgl_video_codec: + * Represents an encoder or decoder. In VA-API based implementations, it + * usually corresponds to a context. + * + * @author Feng Jiang <jiangfeng@kylinos.cn> + */ + +#ifndef VIRGL_VIDEO_H +#define VIRGL_VIDEO_H + +#include <stdint.h> +#include <stdbool.h> + +#include "pipe/p_format.h" +#include "pipe/p_video_enums.h" + +struct virgl_video_codec; +struct virgl_video_buffer; +union virgl_caps; +union virgl_picture_desc; + +struct virgl_video_create_codec_args { + enum pipe_video_profile profile; + enum pipe_video_entrypoint entrypoint; + enum pipe_video_chroma_format chroma_format; + uint32_t level; + uint32_t width; + uint32_t height; + uint32_t max_references; + uint32_t flags; + void *opaque; +}; + +struct virgl_video_create_buffer_args { + enum pipe_format format; + uint32_t width; + uint32_t height; + bool interlaced; + void *opaque; +}; + +/* flags for virgl_video_dma_buffers */ +#define VIRGL_VIDEO_DMABUF_READ_ONLY 0x0001 +#define VIRGL_VIDEO_DMABUF_WRITE_ONLY 0x0002 +#define VIRGL_VIDEO_DMABUF_READ_WRITE 0x0003 + +struct virgl_video_dma_buf { + struct virgl_video_buffer *buf; + + uint32_t drm_format; + uint32_t width; + uint32_t height; + uint32_t flags; + + uint32_t num_planes; + struct virgl_video_dma_buf_plane { + uint32_t drm_format; + int fd; + uint32_t size; + int modifier; + uint32_t offset; + uint32_t pitch; + } planes[4]; +}; + +/* + * Use callback functions instead of directly exporting the video buffer + * through an interface like virgl_video_export_buffer() is because the + * underlying implementation may not be VA-API. The callback function can + * better shield the underlying logic differences. + */ +struct virgl_video_callbacks { + /* Callback when decoding is complete, used to download the decoded picture + * from the video buffer */ + void (*decode_completed)(struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *dmabuf); + + /* Upload the picture data to be encoded to the video buffer */ + void (*encode_upload_picture)(struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *dmabuf); + + /* Callback when encoding is complete, used to download the encoded data + * and reference picture */ + void (*encode_completed)(struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *src_buf, + const struct virgl_video_dma_buf *ref_buf, + unsigned num_coded_bufs, + const void * const *coded_bufs, + const unsigned *coded_sizes); +}; + +int virgl_video_init(int drm_fd, + struct virgl_video_callbacks *cbs, + unsigned int flags); +void virgl_video_destroy(void); + +int virgl_video_fill_caps(union virgl_caps *caps); + +struct virgl_video_codec *virgl_video_create_codec( + const struct virgl_video_create_codec_args *args); +void virgl_video_destroy_codec(struct virgl_video_codec *codec); +uint32_t virgl_video_codec_profile(const struct virgl_video_codec *codec); +void *virgl_video_codec_opaque_data(struct virgl_video_codec *codec); + +struct virgl_video_buffer *virgl_video_create_buffer( + const struct virgl_video_create_buffer_args *args); +void virgl_video_destroy_buffer(struct virgl_video_buffer *buffer); +uint32_t virgl_video_buffer_id(const struct virgl_video_buffer *buffer); +void *virgl_video_buffer_opaque_data(struct virgl_video_buffer *buffer); + +int virgl_video_begin_frame(struct virgl_video_codec *codec, + struct virgl_video_buffer *target); +int virgl_video_decode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *target, + const union virgl_picture_desc *desc, + unsigned num_buffers, + const void * const *buffers, + const unsigned *sizes); +int virgl_video_encode_bitstream(struct virgl_video_codec *codec, + struct virgl_video_buffer *source, + const union virgl_picture_desc *desc); +int virgl_video_end_frame(struct virgl_video_codec *codec, + struct virgl_video_buffer *target); + +#endif /* VIRGL_VIDEO_H */ + diff --git a/src/virgl_video_hw.h b/src/virgl_video_hw.h new file mode 100644 index 00000000..2f50f969 --- /dev/null +++ b/src/virgl_video_hw.h @@ -0,0 +1,585 @@ +/************************************************************************** + * + * Copyright (C) 2022 Kylin Software Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * Data structure definition of video hardware layer. + * + * These structures are used for communication between host and guest, and + * they are 4-byte aligned. + * + * 'virgl_picture_desc' and other related structures mainly describe sequence + * parameters, picture parameters, slice parameters, etc., as well as some + * context information for encoding and decoding. The video backend needs them + * to reconstruct VA-API calls. + * + * @author Feng Jiang <jiangfeng@kylinos.cn> + */ + +#ifndef VIRGL_VIDEO_HW_H +#define VIRGL_VIDEO_HW_H + +#include <stdint.h> + +struct virgl_base_picture_desc { + uint16_t profile; /* enum pipe_video_profile */ + uint8_t entry_point; /* enum pipe_video_entrypoint */ + uint8_t protected_playback; + uint8_t decrypt_key[256]; + uint32_t key_size; + +}; + +struct virgl_enc_quality_modes { + uint32_t level; + uint32_t preset_mode; + uint32_t pre_encode_mode; + uint32_t vbaq_mode; +}; + +/* H.264 sequence parameter set */ +struct virgl_h264_sps { + uint8_t level_idc; + uint8_t chroma_format_idc; + uint8_t separate_colour_plane_flag; + uint8_t bit_depth_luma_minus8; + + uint8_t bit_depth_chroma_minus8; + uint8_t seq_scaling_matrix_present_flag; + uint8_t ScalingList4x4[6][16]; + uint8_t ScalingList8x8[6][64]; + + uint8_t log2_max_frame_num_minus4; + uint8_t pic_order_cnt_type; + uint8_t log2_max_pic_order_cnt_lsb_minus4; + uint8_t delta_pic_order_always_zero_flag; + + int32_t offset_for_non_ref_pic; + int32_t offset_for_top_to_bottom_field; + int32_t offset_for_ref_frame[256]; + + uint8_t num_ref_frames_in_pic_order_cnt_cycle; + uint8_t max_num_ref_frames; + uint8_t frame_mbs_only_flag; + uint8_t mb_adaptive_frame_field_flag; + + uint8_t direct_8x8_inference_flag; + uint8_t MinLumaBiPredSize8x8; + uint8_t reserved[2]; +}; + +/* H.264 picture parameter set */ +struct virgl_h264_pps { + struct virgl_h264_sps sps; /* Seq Param Set */ + + uint8_t entropy_coding_mode_flag; + uint8_t bottom_field_pic_order_in_frame_present_flag; + uint8_t num_slice_groups_minus1; + uint8_t slice_group_map_type; + + uint8_t slice_group_change_rate_minus1; + uint8_t num_ref_idx_l0_default_active_minus1; + uint8_t num_ref_idx_l1_default_active_minus1; + uint8_t weighted_pred_flag; + + uint8_t weighted_bipred_idc; + int8_t pic_init_qp_minus26; + int8_t pic_init_qs_minus26; + int8_t chroma_qp_index_offset; + + uint8_t deblocking_filter_control_present_flag; + uint8_t constrained_intra_pred_flag; + uint8_t redundant_pic_cnt_present_flag; + uint8_t transform_8x8_mode_flag; + + uint8_t ScalingList4x4[6][16]; + uint8_t ScalingList8x8[6][64]; + + int8_t second_chroma_qp_index_offset; + uint8_t reserved[3]; +}; + +struct virgl_h264_picture_desc { + struct virgl_base_picture_desc base; + + struct virgl_h264_pps pps; /* Picture Param Set */ + + uint32_t frame_num; + + uint8_t field_pic_flag; + uint8_t bottom_field_flag; + uint8_t num_ref_idx_l0_active_minus1; + uint8_t num_ref_idx_l1_active_minus1; + + uint32_t slice_count; + int32_t field_order_cnt[2]; + + uint8_t is_long_term[16]; + uint8_t top_is_reference[16]; + uint8_t bottom_is_reference[16]; + uint32_t field_order_cnt_list[16][2]; + uint32_t frame_num_list[16]; + uint32_t buffer_id[16]; + + uint8_t is_reference; + uint8_t num_ref_frames; + uint8_t reserved[2]; +}; + +struct virgl_h264_enc_seq_param +{ + uint32_t enc_constraint_set_flags; + uint32_t enc_frame_cropping_flag; + uint32_t enc_frame_crop_left_offset; + uint32_t enc_frame_crop_right_offset; + uint32_t enc_frame_crop_top_offset; + uint32_t enc_frame_crop_bottom_offset; + uint32_t pic_order_cnt_type; + uint32_t num_temporal_layers; + uint32_t vui_parameters_present_flag; + struct { + uint32_t aspect_ratio_info_present_flag: 1; + uint32_t timing_info_present_flag: 1; + uint32_t reserved:30; + } vui_flags; + uint32_t aspect_ratio_idc; + uint32_t sar_width; + uint32_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; +}; + +struct virgl_h264_enc_rate_control +{ + uint32_t target_bitrate; + uint32_t peak_bitrate; + uint32_t frame_rate_num; + uint32_t frame_rate_den; + uint32_t vbv_buffer_size; + uint32_t vbv_buf_lv; + uint32_t target_bits_picture; + uint32_t peak_bits_picture_integer; + uint32_t peak_bits_picture_fraction; + uint32_t fill_data_enable; + uint32_t skip_frame_enable; + uint32_t enforce_hrd; + uint32_t max_au_size; + uint32_t max_qp; + uint32_t min_qp; + + uint8_t rate_ctrl_method; /* see enum pipe_h2645_enc_rate_control_method */ + uint8_t reserved[3]; +}; + +struct virgl_h264_enc_motion_estimation +{ + uint32_t motion_est_quarter_pixel; + uint32_t enc_disable_sub_mode; + uint32_t lsmvert; + uint32_t enc_en_ime_overw_dis_subm; + uint32_t enc_ime_overw_dis_subm_no; + uint32_t enc_ime2_search_range_x; + uint32_t enc_ime2_search_range_y; +}; + +struct virgl_h264_enc_pic_control +{ + uint32_t enc_cabac_enable; + uint32_t enc_cabac_init_idc; +}; + +struct virgl_h264_slice_descriptor +{ + uint32_t macroblock_address; + uint32_t num_macroblocks; + + uint8_t slice_type; /* see enum pipe_h264_slice_type */ + uint8_t reserved[3]; +}; + +struct virgl_h264_enc_picture_desc +{ + struct virgl_base_picture_desc base; + + struct virgl_h264_enc_seq_param seq; + struct virgl_h264_enc_rate_control rate_ctrl[4]; + struct virgl_h264_enc_motion_estimation motion_est; + struct virgl_h264_enc_pic_control pic_ctrl; + + uint32_t intra_idr_period; + + uint32_t quant_i_frames; + uint32_t quant_p_frames; + uint32_t quant_b_frames; + + uint32_t frame_num; + uint32_t frame_num_cnt; + uint32_t p_remain; + uint32_t i_remain; + uint32_t idr_pic_id; + uint32_t gop_cnt; + uint32_t pic_order_cnt; + uint32_t num_ref_idx_l0_active_minus1; + uint32_t num_ref_idx_l1_active_minus1; + uint32_t ref_idx_l0_list[32]; + uint8_t l0_is_long_term[32]; + uint32_t ref_idx_l1_list[32]; + uint8_t l1_is_long_term[32]; + uint32_t gop_size; + struct virgl_enc_quality_modes quality_modes; + + uint32_t num_slice_descriptors; + struct virgl_h264_slice_descriptor slices_descriptors[128]; + + uint8_t picture_type; /* see enum pipe_h2645_enc_picture_type */ + uint8_t not_referenced; + uint8_t is_ltr; + uint8_t enable_vui; + + uint32_t ltr_index; +}; + + +struct virgl_h265_sps +{ + uint32_t pic_width_in_luma_samples; + uint32_t pic_height_in_luma_samples; + + uint8_t chroma_format_idc; + uint8_t separate_colour_plane_flag; + uint8_t bit_depth_luma_minus8; + uint8_t bit_depth_chroma_minus8; + + uint8_t log2_max_pic_order_cnt_lsb_minus4; + uint8_t sps_max_dec_pic_buffering_minus1; + uint8_t log2_min_luma_coding_block_size_minus3; + uint8_t log2_diff_max_min_luma_coding_block_size; + + uint8_t log2_min_transform_block_size_minus2; + uint8_t log2_diff_max_min_transform_block_size; + uint8_t max_transform_hierarchy_depth_inter; + uint8_t max_transform_hierarchy_depth_intra; + + uint8_t ScalingList4x4[6][16]; + uint8_t ScalingList8x8[6][64]; + uint8_t ScalingList16x16[6][64]; + uint8_t ScalingList32x32[2][64]; + + uint8_t ScalingListDCCoeff16x16[6]; + uint8_t ScalingListDCCoeff32x32[2]; + + uint8_t scaling_list_enabled_flag; + uint8_t amp_enabled_flag; + uint8_t sample_adaptive_offset_enabled_flag; + uint8_t pcm_enabled_flag; + + uint8_t pcm_sample_bit_depth_luma_minus1; + uint8_t pcm_sample_bit_depth_chroma_minus1; + uint8_t log2_min_pcm_luma_coding_block_size_minus3; + uint8_t log2_diff_max_min_pcm_luma_coding_block_size; + + uint8_t pcm_loop_filter_disabled_flag; + uint8_t num_short_term_ref_pic_sets; + uint8_t long_term_ref_pics_present_flag; + uint8_t num_long_term_ref_pics_sps; + + uint8_t sps_temporal_mvp_enabled_flag; + uint8_t strong_intra_smoothing_enabled_flag; + uint8_t reserved[2]; +}; + +struct virgl_h265_pps +{ + struct virgl_h265_sps sps; + + uint8_t dependent_slice_segments_enabled_flag; + uint8_t output_flag_present_flag; + uint8_t num_extra_slice_header_bits; + uint8_t sign_data_hiding_enabled_flag; + + uint8_t cabac_init_present_flag; + uint8_t num_ref_idx_l0_default_active_minus1; + uint8_t num_ref_idx_l1_default_active_minus1; + int8_t init_qp_minus26; + + uint8_t constrained_intra_pred_flag; + uint8_t transform_skip_enabled_flag; + uint8_t cu_qp_delta_enabled_flag; + uint8_t diff_cu_qp_delta_depth; + + int8_t pps_cb_qp_offset; + int8_t pps_cr_qp_offset; + uint8_t pps_slice_chroma_qp_offsets_present_flag; + uint8_t weighted_pred_flag; + + uint8_t weighted_bipred_flag; + uint8_t transquant_bypass_enabled_flag; + uint8_t tiles_enabled_flag; + uint8_t entropy_coding_sync_enabled_flag; + + uint16_t column_width_minus1[20]; + uint16_t row_height_minus1[22]; + + uint8_t num_tile_columns_minus1; + uint8_t num_tile_rows_minus1; + uint8_t uniform_spacing_flag; + uint8_t loop_filter_across_tiles_enabled_flag; + + uint8_t pps_loop_filter_across_slices_enabled_flag; + uint8_t deblocking_filter_control_present_flag; + uint8_t deblocking_filter_override_enabled_flag; + uint8_t pps_deblocking_filter_disabled_flag; + + int8_t pps_beta_offset_div2; + int8_t pps_tc_offset_div2; + uint8_t lists_modification_present_flag; + uint8_t log2_parallel_merge_level_minus2; + + uint16_t st_rps_bits; + uint8_t slice_segment_header_extension_present_flag; + uint8_t reserved; +}; + +struct virgl_h265_picture_desc +{ + struct virgl_base_picture_desc base; + + struct virgl_h265_pps pps; + + int32_t CurrPicOrderCntVal; + uint32_t ref[16]; + int32_t PicOrderCntVal[16]; + + uint32_t NumPocTotalCurr; + uint32_t NumDeltaPocsOfRefRpsIdx; + uint32_t NumShortTermPictureSliceHeaderBits; + uint32_t NumLongTermPictureSliceHeaderBits; + + uint8_t IsLongTerm[16]; + + uint8_t IDRPicFlag; + uint8_t RAPPicFlag; + uint8_t CurrRpsIdx; + uint8_t NumPocStCurrBefore; + + uint8_t NumPocStCurrAfter; + uint8_t NumPocLtCurr; + uint8_t UseRefPicList; + uint8_t UseStRpsBits; + + uint8_t RefPicSetStCurrBefore[8]; + uint8_t RefPicSetStCurrAfter[8]; + uint8_t RefPicSetLtCurr[8]; + + uint8_t RefPicList[2][15]; + uint8_t reserved[2]; +}; + +struct virgl_h265_enc_seq_param +{ + uint8_t general_profile_idc; + uint8_t general_level_idc; + uint8_t general_tier_flag; + uint8_t strong_intra_smoothing_enabled_flag; + + uint32_t intra_period; + uint32_t ip_period; + + uint16_t pic_width_in_luma_samples; + uint16_t pic_height_in_luma_samples; + + uint32_t chroma_format_idc; + uint32_t bit_depth_luma_minus8; + uint32_t bit_depth_chroma_minus8; + + uint8_t amp_enabled_flag; + uint8_t sample_adaptive_offset_enabled_flag; + uint8_t pcm_enabled_flag; + uint8_t sps_temporal_mvp_enabled_flag; + + uint8_t log2_min_luma_coding_block_size_minus3; + uint8_t log2_diff_max_min_luma_coding_block_size; + uint8_t log2_min_transform_block_size_minus2; + uint8_t log2_diff_max_min_transform_block_size; + + uint16_t conf_win_left_offset; + uint16_t conf_win_right_offset; + uint16_t conf_win_top_offset; + uint16_t conf_win_bottom_offset; + + uint32_t vui_parameters_present_flag; + struct { + uint32_t aspect_ratio_info_present_flag: 1; + uint32_t timing_info_present_flag: 1; + uint32_t reserved:30; + } vui_flags; + uint32_t aspect_ratio_idc; + uint32_t sar_width; + uint32_t sar_height; + uint32_t num_units_in_tick; + uint32_t time_scale; + + uint8_t max_transform_hierarchy_depth_inter; + uint8_t max_transform_hierarchy_depth_intra; + uint8_t conformance_window_flag; + uint8_t reserved; +}; + +struct virgl_h265_enc_pic_param +{ + uint8_t log2_parallel_merge_level_minus2; + uint8_t nal_unit_type; + uint8_t constrained_intra_pred_flag; + uint8_t pps_loop_filter_across_slices_enabled_flag; + + uint8_t transform_skip_enabled_flag; + uint8_t reserved[3]; +}; + +struct virgl_h265_enc_slice_param +{ + uint8_t max_num_merge_cand; + int8_t slice_cb_qp_offset; + int8_t slice_cr_qp_offset; + int8_t slice_beta_offset_div2; + + uint32_t slice_deblocking_filter_disabled_flag; + + int8_t slice_tc_offset_div2; + uint8_t cabac_init_flag; + uint8_t slice_loop_filter_across_slices_enabled_flag; + uint8_t reserved; +}; + +struct virgl_h265_enc_rate_control +{ + uint32_t target_bitrate; + uint32_t peak_bitrate; + uint32_t frame_rate_num; + uint32_t frame_rate_den; + uint32_t quant_i_frames; + uint32_t quant_p_frames; + uint32_t quant_b_frames; + uint32_t vbv_buffer_size; + uint32_t vbv_buf_lv; + uint32_t target_bits_picture; + uint32_t peak_bits_picture_integer; + uint32_t peak_bits_picture_fraction; + uint32_t fill_data_enable; + uint32_t skip_frame_enable; + uint32_t enforce_hrd; + uint32_t max_au_size; + uint32_t max_qp; + uint32_t min_qp; + + uint8_t rate_ctrl_method; /* see enum pipe_h2645_enc_rate_control_method */ + uint8_t reserved[3]; +}; + +struct virgl_h265_slice_descriptor +{ + uint32_t slice_segment_address; + uint32_t num_ctu_in_slice; + + uint8_t slice_type; /* see enum pipe_h265_slice_type */ + uint8_t reserved[3]; +}; + +struct virgl_h265_enc_picture_desc +{ + struct virgl_base_picture_desc base; + + struct virgl_h265_enc_seq_param seq; + struct virgl_h265_enc_pic_param pic; + struct virgl_h265_enc_slice_param slice; + struct virgl_h265_enc_rate_control rc; + + uint32_t decoded_curr_pic; + uint32_t reference_frames[16]; + uint32_t frame_num; + uint32_t pic_order_cnt; + uint32_t pic_order_cnt_type; + uint32_t num_ref_idx_l0_active_minus1; + uint32_t num_ref_idx_l1_active_minus1; + uint32_t ref_idx_l0_list[15]; + uint32_t ref_idx_l1_list[15]; + uint32_t num_slice_descriptors; + struct virgl_h265_slice_descriptor slices_descriptors[128]; + struct virgl_enc_quality_modes quality_modes; + + uint8_t picture_type; /* see enum pipe_h2645_enc_picture_type */ + uint8_t not_referenced; + uint8_t reserved[2]; +}; + +struct virgl_mpeg4_picture_desc +{ + struct virgl_base_picture_desc base; + + int32_t trd[2]; + int32_t trb[2]; + uint16_t vop_time_increment_resolution; + uint8_t vop_coding_type; + uint8_t vop_fcode_forward; + uint8_t vop_fcode_backward; + uint8_t resync_marker_disable; + uint8_t interlaced; + uint8_t quant_type; + uint8_t quarter_sample; + uint8_t short_video_header; + uint8_t rounding_control; + uint8_t alternate_vertical_scan_flag; + uint8_t top_field_first; + + uint8_t intra_matrix[64]; + uint8_t non_intra_matrix[64]; + + uint32_t ref[2]; +}; + +union virgl_picture_desc { + struct virgl_base_picture_desc base; + struct virgl_h264_picture_desc h264; + struct virgl_h265_picture_desc h265; + struct virgl_mpeg4_picture_desc mpeg4; + struct virgl_h264_enc_picture_desc h264_enc; + struct virgl_h265_enc_picture_desc h265_enc; +}; + +enum virgl_video_encode_stat { + VIRGL_VIDEO_ENCODE_STAT_NOT_STARTED = 0, + VIRGL_VIDEO_ENCODE_STAT_IN_PROGRESS, + VIRGL_VIDEO_ENCODE_STAT_SUCCESS, + VIRGL_VIDEO_ENCODE_STAT_FAILURE, +}; + +struct virgl_video_encode_feedback { + uint8_t stat; /* see enum virgl_video_encode_stat */ + uint8_t reserved[3]; + + uint32_t coded_size; /* size of encoded data in bytes */ +}; + +#endif /* VIRGL_VIDEO_HW_H */ + diff --git a/src/virglrenderer.c b/src/virglrenderer.c index b70aa616..c0294f6d 100644 --- a/src/virglrenderer.c +++ b/src/virglrenderer.c @@ -185,12 +185,12 @@ void virgl_renderer_fill_caps(uint32_t set, uint32_t version, } static void per_context_fence_retire(struct virgl_context *ctx, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { state.cbs->write_context_fence(state.cookie, ctx->ctx_id, - queue_id, + ring_idx, fence_id); } @@ -405,15 +405,16 @@ int virgl_renderer_create_fence(int client_fence_id, UNUSED uint32_t ctx_id) int virgl_renderer_context_create_fence(uint32_t ctx_id, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { + TRACE_FUNC(); struct virgl_context *ctx = virgl_context_lookup(ctx_id); if (!ctx) return -EINVAL; assert(state.cbs->version >= 3 && state.cbs->write_context_fence); - return ctx->submit_fence(ctx, flags, queue_id, fence_id); + return ctx->submit_fence(ctx, flags, ring_idx, fence_id); } void virgl_renderer_context_poll(uint32_t ctx_id) @@ -436,7 +437,6 @@ int virgl_renderer_context_get_poll_fd(uint32_t ctx_id) void virgl_renderer_force_ctx_0(void) { - TRACE_FUNC(); if (state.vrend_initialized) vrend_renderer_force_ctx_0(); } @@ -564,11 +564,20 @@ static int make_current(virgl_renderer_gl_context ctx) return state.cbs->make_current(state.cookie, 0, ctx); } +static int get_drm_fd(void) +{ + if (state.cbs->get_drm_fd) + return state.cbs->get_drm_fd(state.cookie); + + return -1; +} + static const struct vrend_if_cbs vrend_cbs = { ctx0_fence_retire, create_gl_context, destroy_gl_context, make_current, + get_drm_fd, }; static int @@ -596,11 +605,29 @@ void *virgl_renderer_get_cursor_data(uint32_t resource_id, uint32_t *width, uint height); } +static bool +virgl_context_foreach_retire_fences(struct virgl_context *ctx, + UNUSED void* data) +{ + /* vrend contexts are polled explicitly by the caller */ + if (ctx->capset_id != VIRGL_RENDERER_CAPSET_VIRGL && + ctx->capset_id != VIRGL_RENDERER_CAPSET_VIRGL2) + { + assert(ctx->retire_fences); + ctx->retire_fences(ctx); + } + return true; +} + void virgl_renderer_poll(void) { TRACE_FUNC(); if (state.vrend_initialized) vrend_renderer_poll(); + + struct virgl_context_foreach_args args; + args.callback = virgl_context_foreach_retire_fences; + virgl_context_foreach(&args); } void virgl_renderer_cleanup(UNUSED void *cookie) @@ -652,8 +679,9 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks return -EBUSY; if (!state.client_initialized) { - if (cbs && (cbs->version < 1 || - cbs->version > VIRGL_RENDERER_CALLBACKS_VERSION)) + if (!cbs || + cbs->version < 1 || + cbs->version > VIRGL_RENDERER_CALLBACKS_VERSION) return -1; state.cookie = cookie; @@ -703,18 +731,23 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks void *egl_display = NULL; if (!cbs->create_gl_context || !cbs->destroy_gl_context || - !cbs->make_current) + !cbs->make_current) { + ret = EINVAL; goto fail; + } egl_display = state.cbs->get_egl_display(cookie); - if (!egl_display) + if (!egl_display) { + ret = -1; goto fail; - + } ret = vrend_winsys_init_external(egl_display); - if (ret) + if (ret) { + ret = -1; goto fail; + } state.external_winsys_initialized = true; } @@ -733,6 +766,8 @@ int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks renderer_flags |= VREND_USE_ASYNC_FENCE_CB; if (flags & VIRGL_RENDERER_USE_EXTERNAL_BLOB) renderer_flags |= VREND_USE_EXTERNAL_BLOB; + if (flags & VIRGL_RENDERER_USE_VIDEO) + renderer_flags |= VREND_USE_VIDEO; ret = vrend_renderer_init(&vrend_cbs, renderer_flags); if (ret) @@ -1088,6 +1123,7 @@ int virgl_renderer_resource_get_map_info(uint32_t res_handle, uint32_t *map_info int virgl_renderer_resource_export_blob(uint32_t res_id, uint32_t *fd_type, int *fd) { + TRACE_FUNC(); struct virgl_resource *res = virgl_resource_lookup(res_id); if (!res) return EINVAL; diff --git a/src/virglrenderer.h b/src/virglrenderer.h index 21fca958..40991d19 100644 --- a/src/virglrenderer.h +++ b/src/virglrenderer.h @@ -78,7 +78,7 @@ struct virgl_renderer_callbacks { int (*get_drm_fd)(void *cookie); #ifdef VIRGL_RENDERER_UNSTABLE_APIS - void (*write_context_fence)(void *cookie, uint32_t ctx_id, uint64_t queue_id, uint64_t fence_id); + void (*write_context_fence)(void *cookie, uint32_t ctx_id, uint32_t ring_idx, uint64_t fence_id); /* version 0: a connected socket of type SOCK_SEQPACKET */ int (*get_server_fd)(void *cookie, uint32_t version); @@ -140,6 +140,10 @@ struct virgl_renderer_callbacks { */ #define VIRGL_RENDERER_DRM (1 << 10) +/* Video encode/decode */ +#define VIRGL_RENDERER_USE_VIDEO (1 << 11) + + #endif /* VIRGL_RENDERER_UNSTABLE_APIS */ VIRGL_EXPORT int virgl_renderer_init(void *cookie, int flags, struct virgl_renderer_callbacks *cb); @@ -308,12 +312,6 @@ VIRGL_EXPORT int virgl_renderer_get_poll_fd(void); VIRGL_EXPORT int virgl_renderer_execute(void *execute_args, uint32_t execute_size); -/* - * These are unstable APIs for development only. Use these for development/testing purposes - * only, not in production - */ -#ifdef VIRGL_RENDERER_UNSTABLE_APIS - #define VIRGL_RENDERER_CONTEXT_FLAG_CAPSET_ID_MASK 0xff VIRGL_EXPORT int virgl_renderer_context_create_with_flags(uint32_t ctx_id, @@ -364,6 +362,12 @@ VIRGL_EXPORT int virgl_renderer_resource_get_map_info(uint32_t res_handle, uint3 VIRGL_EXPORT int virgl_renderer_resource_export_blob(uint32_t res_id, uint32_t *fd_type, int *fd); +/* + * These are unstable APIs for development only. Use these for development/testing purposes + * only, not in production + */ +#ifdef VIRGL_RENDERER_UNSTABLE_APIS + struct virgl_renderer_resource_import_blob_args { uint32_t res_handle; @@ -382,7 +386,7 @@ virgl_renderer_export_fence(uint32_t client_fence_id, int *fd); #define VIRGL_RENDERER_FENCE_FLAG_MERGEABLE (1 << 0) VIRGL_EXPORT int virgl_renderer_context_create_fence(uint32_t ctx_id, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id); VIRGL_EXPORT void virgl_renderer_context_poll(uint32_t ctx_id); /* force fences */ VIRGL_EXPORT int virgl_renderer_context_get_poll_fd(uint32_t ctx_id); diff --git a/src/vrend_blitter.c b/src/vrend_blitter.c index c92ea051..aa5e7a8c 100644 --- a/src/vrend_blitter.c +++ b/src/vrend_blitter.c @@ -428,19 +428,24 @@ static GLuint blit_get_frag_tex_col(struct vrend_blitter_ctx *blit_ctx, return prog_id; } -static uint32_t program_hash_func(void *key) +static uint32_t program_hash_func(const void *key) { return XXH32(key, sizeof(struct blit_prog_key), 0); } -static int program_comp_func(void *key1, void *key2) +static bool program_equal_func(const void *key1, const void *key2) { - return memcmp(key1, key2, sizeof(struct blit_prog_key)); + return memcmp(key1, key2, sizeof(struct blit_prog_key)) == 0; } static void program_destroy_func(void *shader_id) { - GLuint id = ((uint64_t)(shader_id)) & 0xffffffff; + GLuint id; +#if __SIZEOF_POINTER__ == 8 + id = ((uint64_t)(shader_id)) & 0xffffffff; +#else + id = (GLuint)(shader_id); +#endif glDeleteProgram(id); } @@ -455,7 +460,7 @@ static void vrend_renderer_init_blit_ctx(struct vrend_blitter_ctx *blit_ctx) } vrend_blit_ctx.blit_programs = util_hash_table_create(program_hash_func, - program_comp_func, + program_equal_func, program_destroy_func); blit_ctx->use_gles = epoxy_is_desktop_gl() == 0; diff --git a/src/vrend_debug.c b/src/vrend_debug.c index 8c1cd932..9143013e 100644 --- a/src/vrend_debug.c +++ b/src/vrend_debug.c @@ -82,6 +82,15 @@ static const char *command_names[VIRGL_MAX_COMMANDS] = { "GET_MEMORY_INFO", "SEND_STRING_MARKER", "LINK_SHADER", + "CREATE_VIDEO_CODEC", + "DESTROY_VIDEO_CODEC", + "CREATE_VIDEO_BUFFER", + "DESTROY_VIDEO_BUFFER", + "BEGIN_FRAME", + "DECODE_MACROBLOCK", + "DECODE_BITSTREAM", + "ENCODE_BITSTREAM", + "END_FRAME", }; static const char *object_type_names[VIRGL_MAX_OBJECTS] = { @@ -156,7 +165,7 @@ int vrend_get_debug_flags(const char *flagstring) return retval; } -void vrend_init_debug_flags() +void vrend_init_debug_flags(void) { if (!vrend_debug_flags_initalized) { vrend_debug_flags_initalized = 1; diff --git a/src/vrend_decode.c b/src/vrend_decode.c index 3bd3f15a..8bf6de73 100644 --- a/src/vrend_decode.c +++ b/src/vrend_decode.c @@ -41,6 +41,10 @@ #include "vrend_tweaks.h" #include "virgl_util.h" +#ifdef ENABLE_VIDEO +#include "vrend_video.h" +#endif + /* decode side */ #define DECODE_MAX_TOKENS 8000 @@ -229,8 +233,7 @@ static int vrend_decode_clear_texture(struct vrend_context *ctx, const uint32_t arr[2] = get_buf_entry(buf, VIRGL_TEXTURE_ARRAY_C); arr[3] = get_buf_entry(buf, VIRGL_TEXTURE_ARRAY_D); - vrend_clear_texture(ctx, handle, level, &box, (void *) &arr); - return 0; + return vrend_clear_texture(ctx, handle, level, &box, (void *) &arr); } static int vrend_decode_set_viewport_state(struct vrend_context *ctx, const uint32_t *buf, uint32_t length) @@ -669,6 +672,7 @@ static int vrend_decode_create_sampler_state(struct vrend_context *ctx, const ui state.compare_func = (tmp >> 16) & 0x7; state.seamless_cube_map = (tmp >> 19) & 0x1; state.max_anisotropy = (float)((tmp >> 20) & 0x3f); + state.normalized_coords = 0; state.lod_bias = uif(get_buf_entry(buf, VIRGL_OBJ_SAMPLER_STATE_LOD_BIAS)); state.min_lod = uif(get_buf_entry(buf, VIRGL_OBJ_SAMPLER_STATE_MIN_LOD)); @@ -1168,7 +1172,7 @@ static int vrend_decode_link_shader(struct vrend_context *ctx, const uint32_t *b handles[PIPE_SHADER_TESS_EVAL] = get_buf_entry(buf, VIRGL_LINK_SHADER_TESS_EVAL_HANDLE); handles[PIPE_SHADER_COMPUTE] = get_buf_entry(buf, VIRGL_LINK_SHADER_COMPUTE_HANDLE); - vrend_link_program(ctx, handles); + vrend_link_program_hook(ctx, handles); return 0; } @@ -1628,6 +1632,187 @@ static int vrend_decode_send_string_marker(struct vrend_context *ctx, const uint return 0; } +#ifdef ENABLE_VIDEO +/* video codec related functions */ + +static int vrend_decode_create_video_codec(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_CREATE_VIDEO_CODEC_MIN_SIZE) + return EINVAL; + + uint32_t handle = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_HANDLE); + uint32_t profile = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_PROFILE); + uint32_t entrypoint = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_ENTRYPOINT); + uint32_t chroma_fmt = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_CHROMA_FMT); + uint32_t level = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_LEVEL); + uint32_t width = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_WIDTH); + uint32_t height = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_HEIGHT); + uint32_t max_ref = 2; /* The max number of ref frames is 2 by default */ + + if (length >= VIRGL_CREATE_VIDEO_CODEC_MAX_REF) + max_ref = get_buf_entry(buf, VIRGL_CREATE_VIDEO_CODEC_MAX_REF); + + vrend_video_create_codec(vctx, handle, profile, entrypoint, + chroma_fmt, level, width, height, max_ref, 0); + + return 0; +} + +static int vrend_decode_destroy_video_codec(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_DESTROY_VIDEO_CODEC_MIN_SIZE) + return EINVAL; + + uint32_t handle = get_buf_entry(buf, VIRGL_DESTROY_VIDEO_CODEC_HANDLE); + vrend_video_destroy_codec(vctx, handle); + + return 0; +} + +static int vrend_decode_create_video_buffer(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + uint32_t i, num_res; + uint32_t res_handles[VREND_VIDEO_BUFFER_PLANE_NUM]; + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_CREATE_VIDEO_BUFFER_MIN_SIZE) + return EINVAL; + + num_res = length - VIRGL_CREATE_VIDEO_BUFFER_RES_BASE + 1; + if (num_res > VREND_VIDEO_BUFFER_PLANE_NUM) + num_res = VREND_VIDEO_BUFFER_PLANE_NUM; + + uint32_t handle = get_buf_entry(buf, VIRGL_CREATE_VIDEO_BUFFER_HANDLE); + uint32_t format = get_buf_entry(buf, VIRGL_CREATE_VIDEO_BUFFER_FORMAT); + uint32_t width = get_buf_entry(buf, VIRGL_CREATE_VIDEO_BUFFER_WIDTH); + uint32_t height = get_buf_entry(buf, VIRGL_CREATE_VIDEO_BUFFER_HEIGHT); + + memset(res_handles, 0, sizeof(res_handles)); + for (i = 0; i < num_res; i++) + res_handles[i] = get_buf_entry(buf, + VIRGL_CREATE_VIDEO_BUFFER_RES_BASE + i); + + vrend_video_create_buffer(vctx, handle, format, width, height, + res_handles, num_res); + + return 0; +} + +static int vrend_decode_destroy_video_buffer(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_DESTROY_VIDEO_BUFFER_MIN_SIZE) + return EINVAL; + + uint32_t handle = get_buf_entry(buf, VIRGL_DESTROY_VIDEO_BUFFER_HANDLE); + vrend_video_destroy_buffer(vctx, handle); + + return 0; +} + +static int vrend_decode_begin_frame(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_BEGIN_FRAME_MIN_SIZE) + return EINVAL; + + uint32_t cdc_handle = get_buf_entry(buf, VIRGL_BEGIN_FRAME_CDC_HANDLE); + uint32_t tgt_handle = get_buf_entry(buf, VIRGL_BEGIN_FRAME_TGT_HANDLE); + vrend_video_begin_frame(vctx, cdc_handle, tgt_handle); + + return 0; +} + +static int vrend_decode_decode_bitstream(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_DECODE_BS_MIN_SIZE) + return EINVAL; + + uint32_t cdc_handle = get_buf_entry(buf, VIRGL_DECODE_BS_CDC_HANDLE); + uint32_t tgt_handle = get_buf_entry(buf, VIRGL_DECODE_BS_TGT_HANDLE); + uint32_t dsc_handle = get_buf_entry(buf, VIRGL_DECODE_BS_DSC_HANDLE); + uint32_t buf_handle = get_buf_entry(buf, VIRGL_DECODE_BS_BUF_HANDLE); + uint32_t buf_size = get_buf_entry(buf, VIRGL_DECODE_BS_BUF_SIZE); + + vrend_video_decode_bitstream(vctx, cdc_handle, tgt_handle, + dsc_handle, 1, &buf_handle, &buf_size); + + return 0; +} + +static int vrend_decode_encode_bitstream(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_ENCODE_BS_MIN_SIZE) + return EINVAL; + + uint32_t cdc_handle = get_buf_entry(buf, VIRGL_ENCODE_BS_CDC_HANDLE); + uint32_t src_handle = get_buf_entry(buf, VIRGL_ENCODE_BS_SRC_HANDLE); + uint32_t dest_handle = get_buf_entry(buf, VIRGL_ENCODE_BS_DEST_HANDLE); + uint32_t desc_handle = get_buf_entry(buf, VIRGL_ENCODE_BS_DESC_HANDLE); + uint32_t feed_handle = get_buf_entry(buf, VIRGL_ENCODE_BS_FEED_HANDLE); + + vrend_video_encode_bitstream(vctx, cdc_handle, src_handle, dest_handle, + desc_handle, feed_handle); + + return 0; +} + +static int vrend_decode_end_frame(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + struct vrend_video_context *vctx = vrend_context_get_video_ctx(ctx); + + if (length < VIRGL_END_FRAME_MIN_SIZE) + return EINVAL; + + uint32_t cdc_handle = get_buf_entry(buf, VIRGL_END_FRAME_CDC_HANDLE); + uint32_t tgt_handle = get_buf_entry(buf, VIRGL_END_FRAME_TGT_HANDLE); + + vrend_video_end_frame(vctx, cdc_handle, tgt_handle); + + return 0; +} + +#else + +static int vrend_unsupported(struct vrend_context *ctx, + const uint32_t *buf, + uint32_t length) +{ + (void)ctx; + (void)buf; + (void)length; + return EINVAL; +} + +#endif /* ENABLE_VIDEO */ + + typedef int (*vrend_decode_callback)(struct vrend_context *ctx, const uint32_t *buf, uint32_t length); static int vrend_decode_dummy(struct vrend_context *ctx, const uint32_t *buf, uint32_t length) @@ -1692,6 +1877,27 @@ static const vrend_decode_callback decode_table[VIRGL_MAX_COMMANDS] = { [VIRGL_CCMD_GET_MEMORY_INFO] = vrend_decode_get_memory_info, [VIRGL_CCMD_SEND_STRING_MARKER] = vrend_decode_send_string_marker, [VIRGL_CCMD_LINK_SHADER] = vrend_decode_link_shader, +#ifdef ENABLE_VIDEO + [VIRGL_CCMD_CREATE_VIDEO_CODEC] = vrend_decode_create_video_codec, + [VIRGL_CCMD_DESTROY_VIDEO_CODEC] = vrend_decode_destroy_video_codec, + [VIRGL_CCMD_CREATE_VIDEO_BUFFER] = vrend_decode_create_video_buffer, + [VIRGL_CCMD_DESTROY_VIDEO_BUFFER] = vrend_decode_destroy_video_buffer, + [VIRGL_CCMD_BEGIN_FRAME] = vrend_decode_begin_frame, + [VIRGL_CCMD_DECODE_MACROBLOCK] = vrend_decode_dummy, + [VIRGL_CCMD_DECODE_BITSTREAM] = vrend_decode_decode_bitstream, + [VIRGL_CCMD_ENCODE_BITSTREAM] = vrend_decode_encode_bitstream, + [VIRGL_CCMD_END_FRAME] = vrend_decode_end_frame, +#else + [VIRGL_CCMD_CREATE_VIDEO_CODEC] = vrend_unsupported, + [VIRGL_CCMD_DESTROY_VIDEO_CODEC] = vrend_unsupported, + [VIRGL_CCMD_CREATE_VIDEO_BUFFER] = vrend_unsupported, + [VIRGL_CCMD_DESTROY_VIDEO_BUFFER] = vrend_unsupported, + [VIRGL_CCMD_BEGIN_FRAME] = vrend_unsupported, + [VIRGL_CCMD_DECODE_MACROBLOCK] = vrend_unsupported, + [VIRGL_CCMD_DECODE_BITSTREAM] = vrend_unsupported, + [VIRGL_CCMD_ENCODE_BITSTREAM] = vrend_unsupported, + [VIRGL_CCMD_END_FRAME] = vrend_unsupported, +#endif }; static int vrend_decode_ctx_submit_cmd(struct virgl_context *ctx, @@ -1760,12 +1966,12 @@ static void vrend_decode_ctx_retire_fences(UNUSED struct virgl_context *ctx) static int vrend_decode_ctx_submit_fence(struct virgl_context *ctx, uint32_t flags, - uint64_t queue_id, + uint32_t ring_idx, uint64_t fence_id) { struct vrend_decode_ctx *dctx = (struct vrend_decode_ctx *)ctx; - if (queue_id) + if (ring_idx) return -EINVAL; return vrend_renderer_create_fence(dctx->grctx, flags, fence_id); diff --git a/src/vrend_formats.c b/src/vrend_formats.c index 50c393a1..fde607c2 100644 --- a/src/vrend_formats.c +++ b/src/vrend_formats.c @@ -292,6 +292,8 @@ static struct vrend_format_table srgb_formats[] = { { VIRGL_FORMAT_L8_SRGB, GL_SR8_EXT, GL_RED, GL_UNSIGNED_BYTE, RRR1_SWIZZLE }, { VIRGL_FORMAT_R8_SRGB, GL_SR8_EXT, GL_RED, GL_UNSIGNED_BYTE, NO_SWIZZLE }, + + { VIRGL_FORMAT_R8G8_SRGB, GL_SRG8_EXT, GL_RG, GL_UNSIGNED_BYTE, NO_SWIZZLE }, }; static struct vrend_format_table bit10_formats[] = { @@ -424,46 +426,6 @@ static void vrend_add_formats(struct vrend_format_table *table, int num_entries) glBindTexture(GL_TEXTURE_2D, tex_id); glBindFramebuffer(GL_FRAMEBUFFER, fb_id); - /* we can't probe compressed formats, as we'd need valid payloads to - * glCompressedTexImage2D. Let's just check for extensions instead. - */ - if (table[i].format < VIRGL_FORMAT_MAX) { - const struct util_format_description *desc = util_format_description(table[i].format); - switch (desc->layout) { - case UTIL_FORMAT_LAYOUT_S3TC: - if (epoxy_has_gl_extension("GL_S3_s3tc") || - epoxy_has_gl_extension("GL_EXT_texture_compression_s3tc")) - vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); - continue; - - case UTIL_FORMAT_LAYOUT_RGTC: - if (epoxy_has_gl_extension("GL_ARB_texture_compression_rgtc") || - epoxy_has_gl_extension("GL_EXT_texture_compression_rgtc") ) - vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); - continue; - - case UTIL_FORMAT_LAYOUT_ETC: - if ((table[i].format == VIRGL_FORMAT_ETC1_RGB8 && - epoxy_has_gl_extension("GL_OES_compressed_ETC1_RGB8_texture")) || - (table[i].format != VIRGL_FORMAT_ETC1_RGB8 && gles_ver >= 30)) - vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); - continue; - - case UTIL_FORMAT_LAYOUT_BPTC: - if (epoxy_has_gl_extension("GL_ARB_texture_compression_bptc") || - epoxy_has_gl_extension("GL_EXT_texture_compression_bptc")) - vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); - continue; - - case UTIL_FORMAT_LAYOUT_ASTC: - if(epoxy_has_gl_extension("GL_KHR_texture_compression_astc_ldr")) - vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); - continue; - default: - ;/* do logic below */ - } - } - /* The error state should be clear here */ status = glGetError(); assert(status == GL_NO_ERROR); @@ -560,7 +522,17 @@ static void vrend_add_formats(struct vrend_format_table *table, int num_entries) } } +static void vrend_add_compressed_formats(struct vrend_format_table *table, int num_entries) +{ + int flags = epoxy_is_desktop_gl() ? VIRGL_TEXTURE_CAN_READBACK : 0; + for (int i = 0; i < num_entries; i++) { + vrend_insert_format(&table[i], VIRGL_BIND_SAMPLER_VIEW, flags); + } +} + + #define add_formats(x) vrend_add_formats((x), ARRAY_SIZE((x))) +#define add_compressed_formats(x) vrend_add_compressed_formats((x), ARRAY_SIZE((x))) void vrend_build_format_list_common(void) { @@ -590,10 +562,20 @@ void vrend_build_format_list_common(void) add_formats(snorm_la_formats); /* compressed */ - add_formats(etc2_formats); - add_formats(rgtc_formats); - add_formats(dxtn_formats); - add_formats(dxtn_srgb_formats); + if (epoxy_has_gl_extension("GL_S3_s3tc") || + epoxy_has_gl_extension("GL_EXT_texture_compression_s3tc") || + epoxy_has_gl_extension("GL_ANGLE_texture_compression_dxt")) { + add_compressed_formats(dxtn_formats); + add_compressed_formats(dxtn_srgb_formats); + } + + if (epoxy_has_gl_extension("GL_ARB_texture_compression_rgtc") || + epoxy_has_gl_extension("GL_EXT_texture_compression_rgtc") ) + add_compressed_formats(rgtc_formats); + + if (epoxy_has_gl_extension("GL_ARB_texture_compression_bptc") || + epoxy_has_gl_extension("GL_EXT_texture_compression_bptc")) + add_compressed_formats(bptc_formats); add_formats(srgb_formats); @@ -601,8 +583,6 @@ void vrend_build_format_list_common(void) add_formats(packed_float_formats); add_formats(exponent_float_formats); - - add_formats(bptc_formats); } @@ -632,7 +612,14 @@ void vrend_build_format_list_gles(void) */ add_formats(gles_z32_format); add_formats(gles_bit10_formats); - add_formats(astc_formats); + + if (epoxy_has_gl_extension("GL_KHR_texture_compression_astc_ldr")) + add_compressed_formats(astc_formats); + + if (epoxy_gl_version() >= 30) { + add_compressed_formats(etc2_formats); + } + } /* glTexStorage may not support all that is supported by glTexImage, @@ -684,7 +671,7 @@ void vrend_check_texture_multisample(struct vrend_format_table *table, } } -bool vrend_check_framebuffer_mixed_color_attachements() +bool vrend_check_framebuffer_mixed_color_attachements(void) { GLuint tex_id[2]; GLuint fb_id; @@ -881,20 +868,21 @@ static boolean format_compressed_compressed_copy_compatible(enum virgl_formats s (src == VIRGL_FORMAT_ASTC_10x8 && dst == VIRGL_FORMAT_ASTC_10x8_SRGB) || (src == VIRGL_FORMAT_ASTC_10x10 && dst == VIRGL_FORMAT_ASTC_10x10_SRGB) || (src == VIRGL_FORMAT_ASTC_12x10 && dst == VIRGL_FORMAT_ASTC_12x10_SRGB) || - (src == VIRGL_FORMAT_ASTC_12x12 && dst == VIRGL_FORMAT_ASTC_12x12_SRGB)) + (src == VIRGL_FORMAT_ASTC_12x12 && dst == VIRGL_FORMAT_ASTC_12x12_SRGB) || + (src == VIRGL_FORMAT_ETC2_R11_UNORM && dst == VIRGL_FORMAT_ETC2_R11_SNORM) || + (src == VIRGL_FORMAT_ETC2_RG11_UNORM && dst == VIRGL_FORMAT_ETC2_RG11_SNORM) || + (src == VIRGL_FORMAT_ETC2_RGBA8 && dst == VIRGL_FORMAT_ETC2_SRGBA8) || + (src == VIRGL_FORMAT_ETC2_RGB8A1 && dst == VIRGL_FORMAT_ETC2_SRGB8A1) || + (src == VIRGL_FORMAT_ETC2_RGB8 && dst == VIRGL_FORMAT_ETC2_SRGB8)) return true; } if ((src == VIRGL_FORMAT_RGTC1_UNORM && dst == VIRGL_FORMAT_RGTC1_SNORM) || (src == VIRGL_FORMAT_RGTC2_UNORM && dst == VIRGL_FORMAT_RGTC2_SNORM) || (src == VIRGL_FORMAT_BPTC_RGBA_UNORM && dst == VIRGL_FORMAT_BPTC_SRGBA) || - (src == VIRGL_FORMAT_BPTC_RGB_FLOAT && dst == VIRGL_FORMAT_BPTC_RGB_UFLOAT) || - (src == VIRGL_FORMAT_ETC2_R11_UNORM && dst == VIRGL_FORMAT_ETC2_R11_SNORM) || - (src == VIRGL_FORMAT_ETC2_RG11_UNORM && dst == VIRGL_FORMAT_ETC2_RG11_SNORM) || - (src == VIRGL_FORMAT_ETC2_RGBA8 && dst == VIRGL_FORMAT_ETC2_SRGBA8) || - (src == VIRGL_FORMAT_ETC2_RGB8A1 && dst == VIRGL_FORMAT_ETC2_SRGB8A1) || - (src == VIRGL_FORMAT_ETC2_RGB8 && dst == VIRGL_FORMAT_ETC2_SRGB8)) - return true; + (src == VIRGL_FORMAT_BPTC_RGB_FLOAT && dst == VIRGL_FORMAT_BPTC_RGB_UFLOAT)) + return true; + return false; } diff --git a/src/vrend_object.c b/src/vrend_object.c index 7025cd9e..084e4ff5 100644 --- a/src/vrend_object.c +++ b/src/vrend_object.c @@ -61,7 +61,7 @@ static void free_object(void *value) struct util_hash_table *vrend_object_init_ctx_table(void) { struct util_hash_table *ctx_hash; - ctx_hash = util_hash_table_create(hash_func_u32, compare_func, free_object); + ctx_hash = util_hash_table_create(hash_func_u32, equal_func, free_object); return ctx_hash; } @@ -82,7 +82,7 @@ struct util_hash_table * vrend_ctx_resource_init_table(void) { return util_hash_table_create(hash_func_u32, - compare_func, + equal_func, vrend_ctx_resource_destroy_func); } diff --git a/src/vrend_renderer.c b/src/vrend_renderer.c index 5a433b0d..4b7ee369 100644 --- a/src/vrend_renderer.c +++ b/src/vrend_renderer.c @@ -64,6 +64,10 @@ #include <epoxy/glx.h> #endif +#ifdef ENABLE_VIDEO +#include <vrend_video.h> +#endif + /* * VIRGL_RENDERER_CAPSET_VIRGL has version 0 and 1, but they are both * virgl_caps_v1 and are exactly the same. @@ -141,7 +145,7 @@ enum features_id feat_depth_clamp, feat_draw_instance, feat_dual_src_blend, - feat_egl_image_external, + feat_egl_image, feat_egl_image_storage, feat_enhanced_layouts, feat_fb_no_attach, @@ -168,6 +172,7 @@ enum features_id feat_multi_draw_indirect, feat_nv_conditional_render, feat_nv_prim_restart, + feat_shader_noperspective_interpolation, feat_nvx_gpu_memory_info, feat_polygon_offset_clamp, feat_occlusion_query, @@ -192,6 +197,7 @@ enum features_id feat_texture_gather, feat_texture_multisample, feat_texture_query_lod, + feat_texture_shadow_lod, feat_texture_srgb_decode, feat_texture_storage, feat_texture_view, @@ -244,7 +250,7 @@ static const struct { FEAT(dual_src_blend, 33, UNAVAIL, "GL_ARB_blend_func_extended", "GL_EXT_blend_func_extended" ), FEAT(depth_clamp, 32, UNAVAIL, "GL_ARB_depth_clamp", "GL_EXT_depth_clamp", "GL_NV_depth_clamp"), FEAT(enhanced_layouts, 44, UNAVAIL, "GL_ARB_enhanced_layouts"), - FEAT(egl_image_external, UNAVAIL, UNAVAIL, "GL_OES_EGL_image_external"), + FEAT(egl_image, UNAVAIL, UNAVAIL, "GL_OES_EGL_image"), FEAT(egl_image_storage, UNAVAIL, UNAVAIL, "GL_EXT_EGL_image_storage"), FEAT(fb_no_attach, 43, 31, "GL_ARB_framebuffer_no_attachments" ), FEAT(framebuffer_fetch, UNAVAIL, UNAVAIL, "GL_EXT_shader_framebuffer_fetch" ), @@ -270,6 +276,7 @@ static const struct { FEAT(multi_draw_indirect, 43, UNAVAIL, "GL_ARB_multi_draw_indirect", "GL_EXT_multi_draw_indirect" ), FEAT(nv_conditional_render, UNAVAIL, UNAVAIL, "GL_NV_conditional_render" ), FEAT(nv_prim_restart, UNAVAIL, UNAVAIL, "GL_NV_primitive_restart" ), + FEAT(shader_noperspective_interpolation, 31, UNAVAIL, "GL_NV_shader_noperspective_interpolation", "GL_EXT_gpu_shader4"), FEAT(nvx_gpu_memory_info, UNAVAIL, UNAVAIL, "GL_NVX_gpu_memory_info" ), FEAT(polygon_offset_clamp, 46, UNAVAIL, "GL_ARB_polygon_offset_clamp", "GL_EXT_polygon_offset_clamp"), FEAT(occlusion_query, 15, UNAVAIL, "GL_ARB_occlusion_query"), @@ -294,6 +301,7 @@ static const struct { FEAT(texture_gather, 40, 31, "GL_ARB_texture_gather" ), FEAT(texture_multisample, 32, 31, "GL_ARB_texture_multisample" ), FEAT(texture_query_lod, 40, UNAVAIL, "GL_ARB_texture_query_lod", "GL_EXT_texture_query_lod"), + FEAT(texture_shadow_lod, UNAVAIL, UNAVAIL, "GL_EXT_texture_shadow_lod"), FEAT(texture_srgb_decode, UNAVAIL, UNAVAIL, "GL_EXT_texture_sRGB_decode" ), FEAT(texture_storage, 42, 30, "GL_ARB_texture_storage" ), FEAT(texture_view, 43, UNAVAIL, "GL_ARB_texture_view", "GL_OES_texture_view", "GL_EXT_texture_view" ), @@ -342,6 +350,7 @@ struct global_renderer_state { uint32_t max_texture_2d_size; uint32_t max_texture_3d_size; uint32_t max_texture_cube_size; + uint32_t max_shader_patch_varyings; /* inferred GL caching type */ uint32_t inferred_gl_caching_type; @@ -367,6 +376,7 @@ struct global_renderer_state { struct sysval_uniform_block { GLfloat clipp[VIRGL_NUM_CLIP_PLANES][4]; + GLuint stipple_pattern[VREND_POLYGON_STIPPLE_SIZE][4]; GLfloat winsys_adjust_y; GLfloat alpha_ref_val; GLfloat clip_plane_enabled; @@ -404,7 +414,11 @@ static inline void clear_feature(enum features_id feature_id) struct vrend_linked_shader_program { struct list_head head; struct list_head sl[PIPE_SHADER_TYPES]; - GLuint id; + bool is_pipeline; + union { + GLuint program; + GLuint pipeline; + } id; bool dual_src_linked; struct vrend_shader *ss[PIPE_SHADER_TYPES]; @@ -421,11 +435,10 @@ struct vrend_linked_shader_program { GLuint *attrib_locs; uint32_t shadow_samp_mask[PIPE_SHADER_TYPES]; - GLuint virgl_block_id; - GLuint virgl_block_bind; - GLuint ubo_sysval_buffer_id; - - GLint fs_stipple_loc; + GLuint separate_virgl_block_id[PIPE_SHADER_TYPES]; + GLint virgl_block_bind; + uint32_t sysvalue_data_cookie; + GLint ubo_sysval_buffer_id; uint32_t images_used_mask[PIPE_SHADER_TYPES]; GLint *img_locs[PIPE_SHADER_TYPES]; @@ -447,8 +460,11 @@ struct vrend_shader { struct vrend_strarray glsl_strings; GLuint id; + GLuint program_id; /* only used for separable shaders */ + GLuint last_pipeline_id; uint32_t uid; bool is_compiled; + bool is_linked; /* only used for separable shaders */ struct vrend_shader_key key; struct list_head programs; }; @@ -456,7 +472,6 @@ struct vrend_shader { struct vrend_shader_selector { struct pipe_reference reference; - unsigned num_shaders; enum pipe_shader_type type; struct vrend_shader_info sinfo; @@ -681,7 +696,7 @@ struct vrend_sub_context { bool viewport_is_negative; /* this is set if the contents of the FBO look upside down when viewed with 0,0 as the bottom corner */ - bool inverted_fbo_content; + bool fbo_origin_upper_left; GLuint blit_fb_ids[2]; @@ -694,7 +709,6 @@ struct vrend_sub_context { bool stencil_test_enabled; bool framebuffer_srgb_enabled; - GLuint program_id; int last_shader_idx; GLint draw_indirect_buffer; @@ -728,6 +742,10 @@ struct vrend_sub_context { int prim_mode; bool drawing; struct vrend_context *parent; + struct sysval_uniform_block sysvalue_data; + uint32_t sysvalue_data_cookie; + uint32_t current_program_id; + uint32_t current_pipeline_id; }; struct vrend_untyped_resource { @@ -741,6 +759,10 @@ struct vrend_context { struct list_head sub_ctxs; struct list_head vrend_resources; +#ifdef ENABLE_VIDEO + struct vrend_video_context *video; +#endif + struct vrend_sub_context *sub; struct vrend_sub_context *sub0; @@ -748,9 +770,6 @@ struct vrend_context { /* has this ctx gotten an error? */ bool in_error; bool ctx_switch_pending; - bool pstip_inited; - - GLuint pstipple_tex_id; enum virgl_ctx_errors last_error; @@ -786,7 +805,6 @@ struct vrend_context { void *fence_retire_data; }; -static struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, int res_handle); static void vrend_pause_render_condition(struct vrend_context *ctx, bool pause); static void vrend_update_viewport_state(struct vrend_sub_context *sub_ctx); static void vrend_update_scissor_state(struct vrend_sub_context *sub_ctx); @@ -1008,6 +1026,7 @@ static const char *vrend_ctx_error_strings[] = { [VIRGL_ERROR_CTX_TRANSFER_IOV_BOUNDS] = "IOV data size exceeds resource capacity", [VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND]= "Dual source blend not supported", [VIRGL_ERROR_CTX_UNSUPPORTED_FUNCTION] = "Unsupported host function called", + [VIRGL_ERROR_CTX_ILLEGAL_PROGRAM_PIPELINE] = "Illegal shader program pipeline", }; void vrend_report_context_error_internal(const char *fname, struct vrend_context *ctx, @@ -1197,6 +1216,8 @@ static void vrend_shader_destroy(struct vrend_shader *shader) vrend_destroy_program(ent); } + if (shader->sel->sinfo.separable_program) + glDeleteProgram(shader->program_id); glDeleteShader(shader->id); strarray_free(&shader->glsl_strings, true); free(shader); @@ -1258,6 +1279,14 @@ static bool vrend_compile_shader(struct vrend_sub_context *sub_ctx, vrend_shader_dump(shader); return false; } + + if (shader->sel->sinfo.separable_program) { + shader->program_id = glCreateProgram(); + shader->last_pipeline_id = 0xffffffff; + glProgramParameteri(shader->program_id, GL_PROGRAM_SEPARABLE, GL_TRUE); + glAttachShader(shader->program_id, shader->id); + } + shader->is_compiled = true; return true; } @@ -1304,25 +1333,36 @@ static bool vrend_is_timer_query(GLenum gltype) gltype == GL_TIME_ELAPSED; } -static void vrend_use_program(struct vrend_sub_context *sub_ctx, GLuint program_id) +static inline void use_program(struct vrend_sub_context *sub_ctx, uint32_t id) { - if (sub_ctx->program_id != program_id) { - glUseProgram(program_id); - sub_ctx->program_id = program_id; - } + if (sub_ctx->current_program_id != id) { + sub_ctx->current_program_id = id; + glUseProgram(id); + } } -static void vrend_init_pstipple_texture(struct vrend_context *ctx) +static inline void bind_pipeline(struct vrend_sub_context *sub_ctx, uint32_t id) { - glGenTextures(1, &ctx->pstipple_tex_id); - glBindTexture(GL_TEXTURE_2D, ctx->pstipple_tex_id); - glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, 32, 32, 0, GL_RED, GL_UNSIGNED_BYTE, NULL); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + if (sub_ctx->current_pipeline_id != id) { + sub_ctx->current_pipeline_id = id; + glBindProgramPipeline(id); + } +} - ctx->pstip_inited = true; +static void vrend_use_program(struct vrend_sub_context *sub_ctx, + struct vrend_linked_shader_program *program) +{ + GLuint id = !program ? 0 : + program->is_pipeline ? program->id.pipeline : + program->id.program; + if (program && program->is_pipeline) { + use_program(sub_ctx, 0); + bind_pipeline(sub_ctx, id); + } else { + if (has_feature(feat_separate_shader_objects)) + bind_pipeline(sub_ctx, 0); + use_program(sub_ctx, id); + } } static void vrend_depth_test_enable(struct vrend_context *ctx, bool depth_test_enable) @@ -1470,6 +1510,26 @@ static void set_stream_out_varyings(ASSERTED struct vrend_sub_context *sub_ctx, free(varyings[i]); } +static inline int +vrend_get_uniform_location(struct vrend_linked_shader_program *sprog, + char *name, int shader_type) +{ + assert(!sprog->is_pipeline || sprog->ss[shader_type]->sel->sinfo.separable_program); + + GLint id = sprog->is_pipeline ? + sprog->ss[shader_type]->program_id : + sprog->id.program; + + return glGetUniformLocation(id, name); +} + +static inline void +vrend_set_active_pipeline_stage(struct vrend_linked_shader_program *sprog, int shader_type) +{ + if (sprog->is_pipeline && sprog->ss[shader_type]) + glActiveShaderProgram(sprog->id.pipeline, sprog->ss[shader_type]->program_id); +} + static int bind_sampler_locs(struct vrend_linked_shader_program *sprog, enum pipe_shader_type shader_type, int next_sampler_id) { @@ -1496,13 +1556,17 @@ static int bind_sampler_locs(struct vrend_linked_shader_program *sprog, } else snprintf(name, 32, "%ssamp%d", prefix, i); - glUniform1i(glGetUniformLocation(sprog->id, name), next_sampler_id++); + vrend_set_active_pipeline_stage(sprog, shader_type); + glUniform1i(vrend_get_uniform_location(sprog, name, shader_type), + next_sampler_id++); if (sinfo->shadow_samp_mask & (1 << i)) { snprintf(name, 32, "%sshadmask%d", prefix, i); - sprog->shadow_samp_mask_locs[shader_type][sampler_index] = glGetUniformLocation(sprog->id, name); + sprog->shadow_samp_mask_locs[shader_type][sampler_index] = + vrend_get_uniform_location(sprog, name, shader_type); snprintf(name, 32, "%sshadadd%d", prefix, i); - sprog->shadow_samp_add_locs[shader_type][sampler_index] = glGetUniformLocation(sprog->id, name); + sprog->shadow_samp_add_locs[shader_type][sampler_index] = + vrend_get_uniform_location(sprog, name, shader_type); } sampler_index++; } @@ -1522,9 +1586,36 @@ static void bind_const_locs(struct vrend_linked_shader_program *sprog, if (sprog->ss[shader_type]->sel->sinfo.num_consts) { char name[32]; snprintf(name, 32, "%sconst0", pipe_shader_to_prefix(shader_type)); - sprog->const_location[shader_type] = glGetUniformLocation(sprog->id, name); + sprog->const_location[shader_type] = vrend_get_uniform_location(sprog, name, + shader_type); } else - sprog->const_location[shader_type] = -1; + sprog->const_location[shader_type] = -1; +} + +static inline GLuint +vrend_get_uniform_block_index(struct vrend_linked_shader_program *sprog, + char *name, int shader_type) +{ + assert(!sprog->is_pipeline || sprog->ss[shader_type]->sel->sinfo.separable_program); + + GLuint id = sprog->is_pipeline ? + sprog->ss[shader_type]->program_id : + sprog->id.program; + + return glGetUniformBlockIndex(id, name); +} + +static inline void +vrend_uniform_block_binding(struct vrend_linked_shader_program *sprog, + int shader_type, int loc, int value) +{ + assert(!sprog->is_pipeline || sprog->ss[shader_type]->sel->sinfo.separable_program); + + GLint id = sprog->is_pipeline ? + sprog->ss[shader_type]->program_id : + sprog->id.program; + + glUniformBlockBinding(id, loc, value); } static int bind_ubo_locs(struct vrend_linked_shader_program *sprog, @@ -1543,8 +1634,8 @@ static int bind_ubo_locs(struct vrend_linked_shader_program *sprog, else snprintf(name, 32, "%subo%d", prefix, ubo_idx); - GLuint loc = glGetUniformBlockIndex(sprog->id, name); - glUniformBlockBinding(sprog->id, loc, next_ubo_id++); + GLuint loc = vrend_get_uniform_block_index(sprog, name, shader_type); + vrend_uniform_block_binding(sprog, shader_type, loc, next_ubo_id++); } } @@ -1553,6 +1644,75 @@ static int bind_ubo_locs(struct vrend_linked_shader_program *sprog, return next_ubo_id; } +static void bind_virgl_block_loc(struct vrend_linked_shader_program *sprog, + enum pipe_shader_type shader_type, + int virgl_block_ubo_id) +{ + sprog->separate_virgl_block_id[shader_type] = + vrend_get_uniform_block_index(sprog, "VirglBlock", shader_type); + + if (sprog->separate_virgl_block_id[shader_type] != GL_INVALID_INDEX) { + bool created_virgl_block_buffer = false; + + if (sprog->virgl_block_bind == -1) { + sprog->virgl_block_bind = virgl_block_ubo_id; + if (sprog->ubo_sysval_buffer_id == -1) { + glGenBuffers(1, (GLuint *) &sprog->ubo_sysval_buffer_id); + created_virgl_block_buffer = true; + } + } + + vrend_set_active_pipeline_stage(sprog, shader_type); + vrend_uniform_block_binding(sprog, shader_type, + sprog->separate_virgl_block_id[shader_type], + sprog->virgl_block_bind); + + GLint virgl_block_size; + int prog_id = sprog->is_pipeline ? sprog->ss[shader_type]->program_id : + sprog->id.program; + glGetActiveUniformBlockiv(prog_id, sprog->separate_virgl_block_id[shader_type], + GL_UNIFORM_BLOCK_DATA_SIZE, &virgl_block_size); + assert((size_t) virgl_block_size >= sizeof(struct sysval_uniform_block)); + + if (created_virgl_block_buffer) { + glBindBuffer(GL_UNIFORM_BUFFER, sprog->ubo_sysval_buffer_id); + glBufferData(GL_UNIFORM_BUFFER, virgl_block_size, NULL, GL_DYNAMIC_DRAW); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + } + } +} + +static void rebind_ubo_and_sampler_locs(struct vrend_linked_shader_program *sprog, + enum pipe_shader_type last_shader) +{ + int next_sampler_id = 0; + int next_ubo_id = 0; + + for (enum pipe_shader_type shader_type = PIPE_SHADER_VERTEX; + shader_type <= last_shader; + shader_type++) { + if (!sprog->ss[shader_type]) + continue; + + next_sampler_id = bind_sampler_locs(sprog, shader_type, next_sampler_id); + next_ubo_id = bind_ubo_locs(sprog, shader_type, next_ubo_id); + + if (sprog->is_pipeline) + sprog->ss[shader_type]->last_pipeline_id = sprog->id.pipeline; + } + + /* Now `next_ubo_id` is the last ubo id, which is used for the VirglBlock. */ + sprog->virgl_block_bind = -1; + for (enum pipe_shader_type shader_type = PIPE_SHADER_VERTEX; + shader_type <= last_shader; + shader_type++) { + if (!sprog->ss[shader_type]) + continue; + + bind_virgl_block_loc(sprog, shader_type, next_ubo_id); + } +} + static void bind_ssbo_locs(struct vrend_linked_shader_program *sprog, enum pipe_shader_type shader_type) { @@ -1589,7 +1749,8 @@ static void bind_image_locs(struct vrend_linked_shader_program *sprog, struct vrend_array *img_array = &sinfo->image_arrays[i]; for (int j = 0; j < img_array->array_size; j++) { snprintf(name, 32, "%simg%d[%d]", prefix, img_array->first, j); - sprog->img_locs[shader_type][img_array->first + j] = glGetUniformLocation(sprog->id, name); + sprog->img_locs[shader_type][img_array->first + j] = + vrend_get_uniform_location(sprog, name, shader_type); if (sprog->img_locs[shader_type][img_array->first + j] == -1) vrend_printf( "failed to get uniform loc for image %s\n", name); } @@ -1598,7 +1759,8 @@ static void bind_image_locs(struct vrend_linked_shader_program *sprog, for (i = 0; i < nsamp; i++) { if (mask & (1 << i)) { snprintf(name, 32, "%simg%d", prefix, i); - sprog->img_locs[shader_type][i] = glGetUniformLocation(sprog->id, name); + sprog->img_locs[shader_type][i] = + vrend_get_uniform_location(sprog, name, shader_type); if (sprog->img_locs[shader_type][i] == -1) vrend_printf( "failed to get uniform loc for image %s\n", name); } else { @@ -1609,22 +1771,90 @@ static void bind_image_locs(struct vrend_linked_shader_program *sprog, sprog->images_used_mask[shader_type] = mask; } +static bool vrend_link(GLuint id) +{ + GLint lret; + glLinkProgram(id); + glGetProgramiv(id, GL_LINK_STATUS, &lret); + if (lret == GL_FALSE) { + char infolog[65536]; + int len; + glGetProgramInfoLog(id, 65536, &len, infolog); + vrend_printf("Error linking program:\n%s\n", infolog); + return false; + } + return true; +} + +static bool vrend_link_separable_shader(struct vrend_sub_context *sub_ctx, + struct vrend_shader *shader, int type) +{ + int i; + char name[64]; + + if (type == PIPE_SHADER_VERTEX || type == PIPE_SHADER_GEOMETRY || + type == PIPE_SHADER_TESS_EVAL) + set_stream_out_varyings(sub_ctx, shader->program_id, &shader->sel->sinfo); + + if (type == PIPE_SHADER_FRAGMENT && shader->sel->sinfo.num_outputs > 1) { + bool dual_src_linked = util_blend_state_is_dual(&sub_ctx->blend_state, 0); + if (dual_src_linked) { + if (has_feature(feat_dual_src_blend)) { + if (!vrend_state.use_gles) { + glBindFragDataLocationIndexed(shader->program_id, 0, 0, "fsout_c0"); + glBindFragDataLocationIndexed(shader->program_id, 0, 1, "fsout_c1"); + } else { + glBindFragDataLocationIndexedEXT(shader->program_id, 0, 0, "fsout_c0"); + glBindFragDataLocationIndexedEXT(shader->program_id, 0, 1, "fsout_c1"); + } + } else { + vrend_report_context_error(sub_ctx->parent, VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND, 0); + } + } else if (!vrend_state.use_gles && has_feature(feat_dual_src_blend)) { + /* On GLES without dual source blending we emit the layout directly in the shader + * so there is no need to define the binding here */ + for (int i = 0; i < shader->sel->sinfo.num_outputs; ++i) { + if (shader->sel->sinfo.fs_output_layout[i] >= 0) { + char buf[64]; + snprintf(buf, sizeof(buf), "fsout_c%d", + shader->sel->sinfo.fs_output_layout[i]); + glBindFragDataLocationIndexed(shader->program_id, + shader->sel->sinfo.fs_output_layout[i], + 0, buf); + } + } + } + } + + if (type == PIPE_SHADER_VERTEX && has_feature(feat_gles31_vertex_attrib_binding)) { + uint32_t mask = shader->sel->sinfo.attrib_input_mask; + while (mask) { + i = u_bit_scan(&mask); + snprintf(name, 32, "in_%d", i); + glBindAttribLocation(shader->program_id, i, name); + } + } + + shader->is_linked = vrend_link(shader->program_id); + + if (!shader->is_linked) { + /* dump shaders */ + vrend_report_context_error(sub_ctx->parent, VIRGL_ERROR_CTX_ILLEGAL_SHADER, 0); + vrend_shader_dump(shader); + } + + return shader->is_linked; +} + static struct vrend_linked_shader_program *add_cs_shader_program(struct vrend_context *ctx, struct vrend_shader *cs) { struct vrend_linked_shader_program *sprog = CALLOC_STRUCT(vrend_linked_shader_program); GLuint prog_id; - GLint lret; prog_id = glCreateProgram(); glAttachShader(prog_id, cs->id); - glLinkProgram(prog_id); - glGetProgramiv(prog_id, GL_LINK_STATUS, &lret); - if (lret == GL_FALSE) { - char infolog[65536]; - int len; - glGetProgramInfoLog(prog_id, 65536, &len, infolog); - vrend_printf("got error linking\n%s\n", infolog); + if (!vrend_link(prog_id)) { /* dump shaders */ vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_SHADER, 0); vrend_shader_dump(cs); @@ -1635,10 +1865,10 @@ static struct vrend_linked_shader_program *add_cs_shader_program(struct vrend_co sprog->ss[PIPE_SHADER_COMPUTE] = cs; list_add(&sprog->sl[PIPE_SHADER_COMPUTE], &cs->programs); - sprog->id = prog_id; + sprog->id.program = prog_id; list_addtail(&sprog->head, &ctx->sub->cs_programs); - vrend_use_program(ctx->sub, prog_id); + vrend_use_program(ctx->sub, sprog); bind_sampler_locs(sprog, PIPE_SHADER_COMPUTE, 0); bind_ubo_locs(sprog, PIPE_SHADER_COMPUTE, 0); @@ -1648,49 +1878,78 @@ static struct vrend_linked_shader_program *add_cs_shader_program(struct vrend_co return sprog; } +static inline bool +vrend_link_stage(struct vrend_shader *stage) { + if (!stage->is_linked) + stage->is_linked = vrend_link(stage->program_id); + return stage->is_linked; +} + static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_context *sub_ctx, struct vrend_shader *vs, struct vrend_shader *fs, struct vrend_shader *gs, struct vrend_shader *tcs, - struct vrend_shader *tes) + struct vrend_shader *tes, + bool separable) { struct vrend_linked_shader_program *sprog = CALLOC_STRUCT(vrend_linked_shader_program); char name[64]; int i; - GLuint prog_id; - GLint lret; + GLuint prog_id = 0; + GLuint pipeline_id = 0; + GLuint vs_id, fs_id, gs_id, tes_id = 0; enum pipe_shader_type last_shader; if (!sprog) return NULL; - prog_id = glCreateProgram(); - glAttachShader(prog_id, vs->id); - if (tcs && tcs->id > 0) - glAttachShader(prog_id, tcs->id); - if (tes && tes->id > 0) - glAttachShader(prog_id, tes->id); + if (separable) { + glGenProgramPipelines(1, &pipeline_id); + + vs_id = vs->program_id; + fs_id = fs->program_id; + if (gs) + gs_id = gs->program_id; + if (tes) + tes_id = tes->program_id; + } else { /* inseparable programs */ + prog_id = glCreateProgram(); + glAttachShader(prog_id, vs->id); + if (tcs && tcs->id > 0) + glAttachShader(prog_id, tcs->id); + if (tes && tes->id > 0) + glAttachShader(prog_id, tes->id); + if (gs && gs->id > 0) + glAttachShader(prog_id, gs->id); + glAttachShader(prog_id, fs->id); + + /* For the non-separable codepath (the usual path), all these shader stages are + * contained inside a single program. */ + vs_id = prog_id; + fs_id = prog_id; + if (gs) + gs_id = prog_id; + if (tes) + tes_id = prog_id; + } if (gs) { - if (gs->id > 0) - glAttachShader(prog_id, gs->id); - set_stream_out_varyings(sub_ctx, prog_id, &gs->sel->sinfo); + set_stream_out_varyings(sub_ctx, gs_id, &gs->sel->sinfo); } else if (tes) - set_stream_out_varyings(sub_ctx, prog_id, &tes->sel->sinfo); + set_stream_out_varyings(sub_ctx, tes_id, &tes->sel->sinfo); else - set_stream_out_varyings(sub_ctx, prog_id, &vs->sel->sinfo); - glAttachShader(prog_id, fs->id); + set_stream_out_varyings(sub_ctx, vs_id, &vs->sel->sinfo); if (fs->sel->sinfo.num_outputs > 1) { sprog->dual_src_linked = util_blend_state_is_dual(&sub_ctx->blend_state, 0); if (sprog->dual_src_linked) { if (has_feature(feat_dual_src_blend)) { if (!vrend_state.use_gles) { - glBindFragDataLocationIndexed(prog_id, 0, 0, "fsout_c0"); - glBindFragDataLocationIndexed(prog_id, 0, 1, "fsout_c1"); + glBindFragDataLocationIndexed(fs_id, 0, 0, "fsout_c0"); + glBindFragDataLocationIndexed(fs_id, 0, 1, "fsout_c1"); } else { - glBindFragDataLocationIndexedEXT(prog_id, 0, 0, "fsout_c0"); - glBindFragDataLocationIndexedEXT(prog_id, 0, 1, "fsout_c1"); + glBindFragDataLocationIndexedEXT(fs_id, 0, 0, "fsout_c0"); + glBindFragDataLocationIndexedEXT(fs_id, 0, 1, "fsout_c1"); } } else { vrend_report_context_error(sub_ctx->parent, VIRGL_ERROR_CTX_ILLEGAL_DUAL_SRC_BLEND, 0); @@ -1702,7 +1961,7 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_c if (fs->sel->sinfo.fs_output_layout[i] >= 0) { char buf[64]; snprintf(buf, sizeof(buf), "fsout_c%d", fs->sel->sinfo.fs_output_layout[i]); - glBindFragDataLocationIndexed(prog_id, fs->sel->sinfo.fs_output_layout[i], 0, buf); + glBindFragDataLocationIndexed(fs_id, fs->sel->sinfo.fs_output_layout[i], 0, buf); } } } @@ -1714,18 +1973,30 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_c while (mask) { i = u_bit_scan(&mask); snprintf(name, 32, "in_%d", i); - glBindAttribLocation(prog_id, i, name); + glBindAttribLocation(vs_id, i, name); } } - glLinkProgram(prog_id); + bool link_success; + if (separable) { /* separable programs */ + link_success = vrend_link_stage(vs); + link_success &= vrend_link_stage(fs); + if (gs) link_success &= vrend_link_stage(gs); + if (tcs) link_success &= vrend_link_stage(tcs); + if (tes) link_success &= vrend_link_stage(tes); + } else { /* non-separable programs */ + link_success = vrend_link(prog_id); + } + + if (!link_success) { + if (separable) { + glDeleteProgramPipelines(1, &pipeline_id); + } else { + glDeleteProgram(prog_id); + } + + free(sprog); - glGetProgramiv(prog_id, GL_LINK_STATUS, &lret); - if (lret == GL_FALSE) { - char infolog[65536]; - int len; - glGetProgramInfoLog(prog_id, 65536, &len, infolog); - vrend_printf("got error linking\n%s\n", infolog); /* dump shaders */ vrend_report_context_error(sub_ctx->parent, VIRGL_ERROR_CTX_ILLEGAL_SHADER, 0); vrend_shader_dump(vs); @@ -1736,11 +2007,24 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_c if (gs) vrend_shader_dump(gs); vrend_shader_dump(fs); - glDeleteProgram(prog_id); - free(sprog); return NULL; } + if (separable) { + glUseProgramStages(pipeline_id, GL_VERTEX_SHADER_BIT, vs->program_id); + if (tcs) glUseProgramStages(pipeline_id, GL_TESS_CONTROL_SHADER_BIT, tcs->program_id); + if (tes) glUseProgramStages(pipeline_id, GL_TESS_EVALUATION_SHADER_BIT, tes->program_id); + if (gs) glUseProgramStages(pipeline_id, GL_GEOMETRY_SHADER_BIT, gs->program_id); + glUseProgramStages(pipeline_id, GL_FRAGMENT_SHADER_BIT, fs->program_id); + + glValidateProgramPipeline(pipeline_id); + GLint validation_status; + glGetProgramPipelineiv(pipeline_id, GL_VALIDATE_STATUS, &validation_status); + if (!validation_status) { + vrend_report_context_error(sub_ctx->parent, VIRGL_ERROR_CTX_ILLEGAL_PROGRAM_PIPELINE, 0); + } + } + sprog->ss[PIPE_SHADER_VERTEX] = vs; sprog->ss[PIPE_SHADER_FRAGMENT] = fs; sprog->vs_fs_key = (((uint64_t)fs->id) << 32) | (vs->id & ~VREND_PROGRAM_NQUEUE_MASK) | @@ -1760,46 +2044,31 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_c list_add(&sprog->sl[PIPE_SHADER_TESS_EVAL], &tes->programs); last_shader = tes ? PIPE_SHADER_TESS_EVAL : (gs ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); - sprog->id = prog_id; + + sprog->is_pipeline = separable; + if (sprog->is_pipeline) + sprog->id.pipeline = pipeline_id; + else + sprog->id.program = prog_id; list_addtail(&sprog->head, &sub_ctx->gl_programs[vs->id & VREND_PROGRAM_NQUEUE_MASK]); - if (fs->key.pstipple_tex) - sprog->fs_stipple_loc = glGetUniformLocation(prog_id, "pstipple_sampler"); - else - sprog->fs_stipple_loc = -1; + sprog->virgl_block_bind = -1; + sprog->ubo_sysval_buffer_id = -1; - vrend_use_program(sub_ctx, prog_id); + vrend_use_program(sub_ctx, sprog); - int next_ubo_id = 0, next_sampler_id = 0; for (enum pipe_shader_type shader_type = PIPE_SHADER_VERTEX; shader_type <= last_shader; shader_type++) { if (!sprog->ss[shader_type]) continue; - next_sampler_id = bind_sampler_locs(sprog, shader_type, next_sampler_id); bind_const_locs(sprog, shader_type); - next_ubo_id = bind_ubo_locs(sprog, shader_type, next_ubo_id); bind_image_locs(sprog, shader_type); bind_ssbo_locs(sprog, shader_type); } - - sprog->virgl_block_id = glGetUniformBlockIndex(prog_id, "VirglBlock"); - if (sprog->virgl_block_id != GL_INVALID_INDEX) { - sprog->virgl_block_bind = next_ubo_id++; - glUniformBlockBinding(prog_id, sprog->virgl_block_id, sprog->virgl_block_bind); - - GLint virgl_block_size; - glGetActiveUniformBlockiv(prog_id, sprog->virgl_block_id, - GL_UNIFORM_BLOCK_DATA_SIZE, &virgl_block_size); - assert((size_t) virgl_block_size >= sizeof(struct sysval_uniform_block)); - - glGenBuffers(1, &sprog->ubo_sysval_buffer_id); - glBindBuffer(GL_UNIFORM_BUFFER, sprog->ubo_sysval_buffer_id); - glBufferData(GL_UNIFORM_BUFFER, virgl_block_size, NULL, GL_DYNAMIC_DRAW); - glBindBuffer(GL_UNIFORM_BUFFER, 0); - } + rebind_ubo_and_sampler_locs(sprog, last_shader); if (!has_feature(feat_gles31_vertex_attrib_binding)) { if (vs->sel->sinfo.num_inputs) { @@ -1807,7 +2076,7 @@ static struct vrend_linked_shader_program *add_shader_program(struct vrend_sub_c if (sprog->attrib_locs) { for (i = 0; i < vs->sel->sinfo.num_inputs; i++) { snprintf(name, 32, "in_%d", i); - sprog->attrib_locs[i] = glGetAttribLocation(prog_id, name); + sprog->attrib_locs[i] = glGetAttribLocation(vs_id, name); } } } else @@ -1874,11 +2143,15 @@ static void vrend_destroy_program(struct vrend_linked_shader_program *ent) if (ent->ref_context && ent->ref_context->prog == ent) ent->ref_context->prog = NULL; - if (ent->virgl_block_id != GL_INVALID_INDEX) { - glDeleteBuffers(1, &ent->ubo_sysval_buffer_id); + if (ent->ubo_sysval_buffer_id != -1) { + glDeleteBuffers(1, (GLuint *) &ent->ubo_sysval_buffer_id); } - glDeleteProgram(ent->id); + if (ent->is_pipeline) + glDeleteProgramPipelines(1, &ent->id.pipeline); + else + glDeleteProgram(ent->id.program); + list_del(&ent->head); for (i = PIPE_SHADER_VERTEX; i <= PIPE_SHADER_COMPUTE; i++) { @@ -2706,7 +2979,7 @@ void vrend_set_framebuffer_state(struct vrend_context *ctx, int old_num; GLenum status; GLint new_height = -1; - bool new_ibf = false; + bool new_fbo_origin_upper_left = false; struct vrend_sub_context *sub_ctx = ctx->sub; @@ -2755,10 +3028,10 @@ void vrend_set_framebuffer_state(struct vrend_context *ctx, /* find a buffer to set fb_height from */ if (sub_ctx->nr_cbufs == 0 && !sub_ctx->zsurf) { new_height = 0; - new_ibf = false; + new_fbo_origin_upper_left = false; } else if (sub_ctx->nr_cbufs == 0) { new_height = u_minify(sub_ctx->zsurf->texture->base.height0, sub_ctx->zsurf->val0); - new_ibf = sub_ctx->zsurf->texture->y_0_top ? true : false; + new_fbo_origin_upper_left = sub_ctx->zsurf->texture->y_0_top ? true : false; } else { surf = NULL; @@ -2773,13 +3046,14 @@ void vrend_set_framebuffer_state(struct vrend_context *ctx, return; } new_height = u_minify(surf->texture->base.height0, surf->val0); - new_ibf = surf->texture->y_0_top ? true : false; + new_fbo_origin_upper_left = surf->texture->y_0_top ? true : false; } if (new_height != -1) { - if (sub_ctx->fb_height != (uint32_t)new_height || sub_ctx->inverted_fbo_content != new_ibf) { + if (sub_ctx->fb_height != (uint32_t)new_height || + sub_ctx->fbo_origin_upper_left != new_fbo_origin_upper_left) { sub_ctx->fb_height = new_height; - sub_ctx->inverted_fbo_content = new_ibf; + sub_ctx->fbo_origin_upper_left = new_fbo_origin_upper_left; sub_ctx->viewport_state_dirty = (1 << 0); } } @@ -2871,8 +3145,12 @@ void vrend_set_viewport_states(struct vrend_context *ctx, } if (idx == 0) { - if (ctx->sub->viewport_is_negative != viewport_is_negative) + if (ctx->sub->viewport_is_negative != viewport_is_negative) { ctx->sub->viewport_is_negative = viewport_is_negative; + ctx->sub->sysvalue_data.winsys_adjust_y = + viewport_is_negative ? -1.f : 1.f; + ctx->sub->sysvalue_data_cookie++; + } } } } @@ -3165,6 +3443,48 @@ void vrend_set_num_vbo(struct vrend_context *ctx, vrend_set_num_vbo_sub(ctx->sub, num_vbo); } +static GLenum vrend_get_arb_format(enum virgl_formats format) +{ + switch (format) { + case VIRGL_FORMAT_A8_UNORM: return GL_R8; + case VIRGL_FORMAT_A8_SINT: return GL_R8I; + case VIRGL_FORMAT_A8_UINT: return GL_R8UI; + case VIRGL_FORMAT_L8_UNORM: return GL_R8; + case VIRGL_FORMAT_L8_SINT: return GL_R8I; + case VIRGL_FORMAT_L8_UINT: return GL_R8UI; + case VIRGL_FORMAT_L16_UNORM: return GL_R16F; + case VIRGL_FORMAT_L16_SINT: return GL_R16I; + case VIRGL_FORMAT_L16_UINT: return GL_R16UI; + case VIRGL_FORMAT_L16_FLOAT: return GL_R16F; + case VIRGL_FORMAT_L32_SINT: return GL_R32F; + case VIRGL_FORMAT_L32_UINT: return GL_R32I; + case VIRGL_FORMAT_L32_FLOAT: return GL_R32UI; + case VIRGL_FORMAT_L8A8_UNORM: return GL_RG8; + case VIRGL_FORMAT_L8A8_SINT: return GL_RG8I; + case VIRGL_FORMAT_L8A8_UINT: return GL_RG8UI; + case VIRGL_FORMAT_L16A16_UNORM: return GL_RG16; + case VIRGL_FORMAT_L16A16_SINT: return GL_RG16I; + case VIRGL_FORMAT_L16A16_UINT: return GL_RG16UI; + case VIRGL_FORMAT_L16A16_FLOAT: return GL_RG16F; + case VIRGL_FORMAT_L32A32_FLOAT: return GL_RG32F; + case VIRGL_FORMAT_L32A32_SINT: return GL_RG32I; + case VIRGL_FORMAT_L32A32_UINT: return GL_RG32UI; + case VIRGL_FORMAT_I8_UNORM: return GL_R8; + case VIRGL_FORMAT_I8_SINT: return GL_R8I; + case VIRGL_FORMAT_I8_UINT: return GL_R8UI; + case VIRGL_FORMAT_I16_UNORM: return GL_R16; + case VIRGL_FORMAT_I16_SINT: return GL_R16I; + case VIRGL_FORMAT_I16_UINT: return GL_R16UI; + case VIRGL_FORMAT_I16_FLOAT: return GL_R16F; + case VIRGL_FORMAT_I32_FLOAT: return GL_R32F; + case VIRGL_FORMAT_I32_SINT: return GL_R32I; + case VIRGL_FORMAT_I32_UINT: return GL_R32UI; + default: + vrend_printf("Texture format %s unsupported for texture buffers\n", util_format_name(format)); + return GL_R8; + } +} + void vrend_set_single_sampler_view(struct vrend_context *ctx, uint32_t shader_type, uint32_t index, @@ -3252,6 +3572,12 @@ void vrend_set_single_sampler_view(struct vrend_context *ctx, glBindTexture(GL_TEXTURE_BUFFER, view->texture->tbo_tex_id); internalformat = tex_conv_table[view->format].internalformat; + + if (internalformat == GL_NONE || + (vrend_state.use_gles && internalformat == GL_ALPHA8)) { + internalformat = vrend_get_arb_format(view->format); + } + if (has_feature(feat_texture_buffer_range)) { unsigned offset = view->val0; unsigned size = view->val1 - view->val0 + 1; @@ -3486,12 +3812,17 @@ static inline void vrend_sync_shader_io(struct vrend_sub_context *sub_ctx, struct vrend_shader_selector *prev = prev_type != PIPE_SHADER_INVALID ? sub_ctx->shaders[prev_type] : NULL; + if (prev) { - key->input = prev->sinfo.out; - memcpy(key->force_invariant_inputs, prev->sinfo.invariant_outputs, 4 * sizeof(uint32_t)); - memcpy(key->prev_stage_generic_and_patch_outputs_layout, - prev->sinfo.generic_outputs_layout, - prev->sinfo.out.num_generic_and_patch * sizeof (struct vrend_layout_info)); + if (!prev->sinfo.separable_program || !sel->sinfo.separable_program) { + key->require_input_arrays = prev->sinfo.has_output_arrays; + key->in_generic_expected_mask = prev->sinfo.out_generic_emitted_mask; + key->in_texcoord_expected_mask = prev->sinfo.out_texcoord_emitted_mask; + key->in_patch_expected_mask = prev->sinfo.out_patch_emitted_mask; + key->in_arrays = prev->sinfo.output_arrays; + + memcpy(key->force_invariant_inputs, prev->sinfo.invariant_outputs, 4 * sizeof(uint32_t)); + } key->num_in_clip = sub_ctx->shaders[prev_type]->current->var_sinfo.num_out_clip; key->num_in_cull = sub_ctx->shaders[prev_type]->current->var_sinfo.num_out_cull; @@ -3503,7 +3834,7 @@ static inline void vrend_sync_shader_io(struct vrend_sub_context *sub_ctx, enum pipe_shader_type next_type = PIPE_SHADER_INVALID; if (type == PIPE_SHADER_FRAGMENT) { - key->fs.invert_origin = !sub_ctx->inverted_fbo_content; + key->fs.lower_left_origin = !sub_ctx->fbo_origin_upper_left; key->fs.swizzle_output_rgb_to_bgr = sub_ctx->swizzle_output_rgb_to_bgr; key->fs.needs_manual_srgb_encode_bitmask = sub_ctx->needs_manual_srgb_encode_bitmask; if (vrend_state.use_gles && can_emulate_logicop(sub_ctx->blend_state.logicop_func)) { @@ -3562,22 +3893,28 @@ static inline void vrend_sync_shader_io(struct vrend_sub_context *sub_ctx, } if (next_type != PIPE_SHADER_INVALID && sub_ctx->shaders[next_type]) { - key->output = sub_ctx->shaders[next_type]->sinfo.in; - - /* FS gets the clip/cull info in the key from this shader, so - * we can avoid re-translating this shader by not updating the - * info in the key */ - if (next_type != PIPE_SHADER_FRAGMENT) { - key->num_out_clip = sub_ctx->shaders[next_type]->current->var_sinfo.num_in_clip; - key->num_out_cull = sub_ctx->shaders[next_type]->current->var_sinfo.num_in_cull; - } - - if (next_type == PIPE_SHADER_FRAGMENT) { - struct vrend_shader *fs = - sub_ctx->shaders[PIPE_SHADER_FRAGMENT]->current; - key->fs_info = fs->var_sinfo.fs_info; - if (type == PIPE_SHADER_VERTEX) { - if (sub_ctx->shaders[type]) { + if (!sub_ctx->shaders[next_type]->sinfo.separable_program || + !sel->sinfo.separable_program) { + struct vrend_shader_selector *next = sub_ctx->shaders[next_type]; + + key->use_pervertex_in = next->sinfo.use_pervertex_in; + key->require_output_arrays = next->sinfo.has_input_arrays; + key->out_generic_expected_mask = next->sinfo.in_generic_emitted_mask; + key->out_texcoord_expected_mask = next->sinfo.in_texcoord_emitted_mask; + + /* FS gets the clip/cull info in the key from this shader, so + * we can avoid re-translating this shader by not updating the + * info in the key */ + if (next_type != PIPE_SHADER_FRAGMENT) { + key->num_out_clip = sub_ctx->shaders[next_type]->current->var_sinfo.num_in_clip; + key->num_out_cull = sub_ctx->shaders[next_type]->current->var_sinfo.num_in_cull; + } + + if (next_type == PIPE_SHADER_FRAGMENT) { + struct vrend_shader *fs = + sub_ctx->shaders[PIPE_SHADER_FRAGMENT]->current; + key->fs_info = fs->var_sinfo.fs_info; + if (type == PIPE_SHADER_VERTEX && sub_ctx->shaders[type]) { uint32_t fog_input = sub_ctx->shaders[next_type]->sinfo.fog_input_mask; uint32_t fog_output = sub_ctx->shaders[type]->sinfo.fog_output_mask; @@ -3590,6 +3927,77 @@ static inline void vrend_sync_shader_io(struct vrend_sub_context *sub_ctx, } } +static bool vrend_get_swizzle(struct vrend_sampler_view *view, + GLint swizzle[4]) +{ + static const GLint OOOR[] = {GL_ZERO, GL_ZERO, GL_ZERO, GL_RED}; + static const GLint RRR1[] = {GL_RED, GL_RED, GL_RED, GL_ONE}; + static const GLint RRRG[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; + static const GLint RRRR[] = {GL_RED, GL_RED, GL_RED, GL_RED}; + + switch (view->format) { + case VIRGL_FORMAT_A8_UNORM: + case VIRGL_FORMAT_A8_SINT: + case VIRGL_FORMAT_A8_UINT: + case VIRGL_FORMAT_A16_UNORM: + case VIRGL_FORMAT_A16_SINT: + case VIRGL_FORMAT_A16_UINT: + case VIRGL_FORMAT_A16_FLOAT: + case VIRGL_FORMAT_A32_SINT: + case VIRGL_FORMAT_A32_UINT: + case VIRGL_FORMAT_A32_FLOAT: + memcpy(swizzle, OOOR, 4 * sizeof(GLuint)); + return true; + case VIRGL_FORMAT_L8_UNORM: + case VIRGL_FORMAT_L8_SINT: + case VIRGL_FORMAT_L8_UINT: + case VIRGL_FORMAT_L16_UNORM: + case VIRGL_FORMAT_L16_SINT: + case VIRGL_FORMAT_L16_UINT: + case VIRGL_FORMAT_L16_FLOAT: + case VIRGL_FORMAT_L32_SINT: + case VIRGL_FORMAT_L32_UINT: + case VIRGL_FORMAT_L32_FLOAT: + memcpy(swizzle, RRR1, 4 * sizeof(GLuint)); + return true; + case VIRGL_FORMAT_L8A8_UNORM: + case VIRGL_FORMAT_L8A8_SINT: + case VIRGL_FORMAT_L8A8_UINT: + case VIRGL_FORMAT_L16A16_UNORM: + case VIRGL_FORMAT_L16A16_SINT: + case VIRGL_FORMAT_L16A16_UINT: + case VIRGL_FORMAT_L16A16_FLOAT: + case VIRGL_FORMAT_L32A32_FLOAT: + case VIRGL_FORMAT_L32A32_SINT: + case VIRGL_FORMAT_L32A32_UINT: + memcpy(swizzle, RRRG, 4 * sizeof(GLuint)); + return true; + case VIRGL_FORMAT_I8_UNORM: + case VIRGL_FORMAT_I8_SINT: + case VIRGL_FORMAT_I8_UINT: + case VIRGL_FORMAT_I16_UNORM: + case VIRGL_FORMAT_I16_SINT: + case VIRGL_FORMAT_I16_UINT: + case VIRGL_FORMAT_I16_FLOAT: + case VIRGL_FORMAT_I32_FLOAT: + case VIRGL_FORMAT_I32_SINT: + case VIRGL_FORMAT_I32_UINT: + memcpy(swizzle, RRRR, 4 * sizeof(GLuint)); + return true; + default: + if (tex_conv_table[view->format].flags & VIRGL_TEXTURE_NEED_SWIZZLE) { + swizzle[0] = tex_conv_table[view->format].swizzle[0]; + swizzle[1] = tex_conv_table[view->format].swizzle[1]; + swizzle[2] = tex_conv_table[view->format].swizzle[2]; + swizzle[3] = tex_conv_table[view->format].swizzle[3]; + return true; + } else { + return false; + } + } +} + + static inline void vrend_fill_shader_key(struct vrend_sub_context *sub_ctx, struct vrend_shader_selector *sel, struct vrend_shader_key *key) @@ -3631,7 +4039,7 @@ static inline void vrend_fill_shader_key(struct vrend_sub_context *sub_ctx, } } - key->pstipple_tex = sub_ctx->rs_state.poly_stipple_enable; + key->pstipple_enabled = sub_ctx->rs_state.poly_stipple_enable; key->color_two_side = sub_ctx->rs_state.light_twoside; key->flatshade = sub_ctx->rs_state.flatshade ? true : false; @@ -3660,14 +4068,15 @@ static inline void vrend_fill_shader_key(struct vrend_sub_context *sub_ctx, vrend_shader_sampler_views_mask_set(key->sampler_views_emulated_rect_mask, i); } - if (view->texture->target == GL_TEXTURE_BUFFER && - tex_conv_table[view->format].flags & VIRGL_TEXTURE_NEED_SWIZZLE) { - - vrend_shader_sampler_views_mask_set(key->sampler_views_lower_swizzle_mask, i); - key->tex_swizzle[i] = to_pipe_swizzle(view->gl_swizzle[0]) | - to_pipe_swizzle(view->gl_swizzle[1]) << 3 | - to_pipe_swizzle(view->gl_swizzle[2]) << 6 | - to_pipe_swizzle(view->gl_swizzle[3]) << 9; + if (view->texture->target == GL_TEXTURE_BUFFER) { + GLint swizzle[4]; + if (vrend_get_swizzle(view, swizzle)) { + vrend_shader_sampler_views_mask_set(key->sampler_views_lower_swizzle_mask, i); + key->tex_swizzle[i] = to_pipe_swizzle(swizzle[0]) | + to_pipe_swizzle(swizzle[1]) << 3 | + to_pipe_swizzle(swizzle[2]) << 6 | + to_pipe_swizzle(swizzle[3]) << 9; + } } } } @@ -3711,12 +4120,13 @@ static int vrend_shader_select(struct vrend_sub_context *sub_ctx, memset(&key, 0, sizeof(key)); vrend_fill_shader_key(sub_ctx, sel, &key); - if (sel->current && !memcmp(&sel->current->key, &key, sizeof(key))) - return 0; + if (sel->current) { + if (!memcmp(&sel->current->key, &key, sizeof(key))) + return 0; - if (sel->num_shaders > 1) { struct vrend_shader *p = sel->current; struct vrend_shader *c = p->next_variant; + while (c && memcmp(&c->key, &key, sizeof(key)) != 0) { p = c; c = c->next_variant; @@ -3740,7 +4150,6 @@ static int vrend_shader_select(struct vrend_sub_context *sub_ctx, FREE(shader); return r; } - sel->num_shaders++; } if (dirty) *dirty = true; @@ -3771,15 +4180,13 @@ static int vrend_finish_shader(struct vrend_context *ctx, struct vrend_shader_selector *sel, const struct tgsi_token *tokens) { - int r; - sel->tokens = tgsi_dup_tokens(tokens); - r = vrend_shader_select(ctx->sub, sel, NULL); - if (r) { - return EINVAL; - } - return 0; + if (!ctx->shader_cfg.use_gles && sel->type != PIPE_SHADER_COMPUTE) + sel->sinfo.separable_program = + vrend_shader_query_separable_program(sel->tokens, &ctx->shader_cfg); + + return vrend_shader_select(ctx->sub, sel, NULL) ? EINVAL : 0; } int vrend_create_shader(struct vrend_context *ctx, @@ -3791,7 +4198,6 @@ int vrend_create_shader(struct vrend_context *ctx, { struct vrend_shader_selector *sel = NULL; int ret_handle; - bool new_shader = true, long_shader = false; bool finished = false; int ret; @@ -3811,11 +4217,13 @@ int vrend_create_shader(struct vrend_context *ctx, !has_feature(feat_compute_shader)) return EINVAL; - if (offlen & VIRGL_OBJ_SHADER_OFFSET_CONT) - new_shader = false; - else if (((offlen + 3) / 4) > pkt_length) - long_shader = true; - + /* offlen & VIRGL_OBJ_SHADER_OFFSET_CONT declares whether we have a new shader or + * a shader continuation + * + * offlen & ~VIRGL_OBJ_SHADER_OFFSET_CONT + * is the total shader length for a new shader (new_shader == true) + * the continuation offset for a shader continuation (new_shader == false) */ + bool new_shader = !(offlen & VIRGL_OBJ_SHADER_OFFSET_CONT); struct vrend_sub_context *sub_ctx = ctx->sub; /* if we have an in progress one - don't allow a new shader @@ -3827,24 +4235,30 @@ int vrend_create_shader(struct vrend_context *ctx, return EINVAL; } + const uint32_t pkt_length_bytes = pkt_length * 4; + if (new_shader) { + const uint32_t expected_token_count = (offlen + 3) / 4; /* round up count */ + if (expected_token_count < pkt_length) + return EINVAL; + sel = vrend_create_shader_state(so_info, req_local_mem, type); - if (sel == NULL) - return ENOMEM; - - sel->buf_len = ((offlen + 3) / 4) * 4; /* round up buffer size */ - sel->tmp_buf = malloc(sel->buf_len); - if (!sel->tmp_buf) { - ret = ENOMEM; - goto error; - } + if (sel == NULL) + return ENOMEM; - memcpy(sel->tmp_buf, shd_text, pkt_length * 4); - if (long_shader) { - sel->buf_offset = pkt_length * 4; - sub_ctx->long_shader_in_progress_handle[type] = handle; - } else - finished = true; + sel->buf_len = expected_token_count * 4; + sel->tmp_buf = malloc(sel->buf_len); + if (!sel->tmp_buf) { + ret = ENOMEM; + goto error; + } + + memcpy(sel->tmp_buf, shd_text, pkt_length_bytes); + if (expected_token_count > pkt_length) { + sel->buf_offset = pkt_length_bytes; + sub_ctx->long_shader_in_progress_handle[type] = handle; + } else + finished = true; } else { sel = vrend_object_lookup(sub_ctx->object_hash, handle, VIRGL_OBJECT_SHADER); if (!sel) { @@ -3862,23 +4276,23 @@ int vrend_create_shader(struct vrend_context *ctx, } /*make sure no overflow */ - if (pkt_length * 4 < pkt_length || - pkt_length * 4 + sel->buf_offset < pkt_length * 4 || - pkt_length * 4 + sel->buf_offset < sel->buf_offset) { + if (pkt_length_bytes < pkt_length || + pkt_length_bytes + sel->buf_offset < pkt_length_bytes || + pkt_length_bytes + sel->buf_offset < sel->buf_offset) { ret = EINVAL; goto error; } - if ((pkt_length * 4 + sel->buf_offset) > sel->buf_len) { - vrend_printf( "Got too large shader continuation %d vs %d\n", - pkt_length * 4 + sel->buf_offset, sel->buf_len); + if ((pkt_length_bytes + sel->buf_offset) > sel->buf_len) { + vrend_printf("Got too large shader continuation %d vs %d\n", + pkt_length_bytes + sel->buf_offset, sel->buf_len); ret = EINVAL; goto error; } - memcpy(sel->tmp_buf + sel->buf_offset, shd_text, pkt_length * 4); + memcpy(sel->tmp_buf + sel->buf_offset, shd_text, pkt_length_bytes); - sel->buf_offset += pkt_length * 4; + sel->buf_offset += pkt_length_bytes; if (sel->buf_offset >= sel->buf_len) { finished = true; shd_text = sel->tmp_buf; @@ -3889,7 +4303,7 @@ int vrend_create_shader(struct vrend_context *ctx, struct tgsi_token *tokens; /* check for null termination */ - uint32_t last_chunk_offset = sel->buf_offset ? sel->buf_offset : pkt_length * 4; + uint32_t last_chunk_offset = sel->buf_offset ? sel->buf_offset : pkt_length_bytes; if (last_chunk_offset < 4 || !memchr(shd_text + last_chunk_offset - 4, '\0', 4)) { ret = EINVAL; goto error; @@ -4004,7 +4418,7 @@ void vrend_clear(struct vrend_context *ctx, if (sub_ctx->viewport_state_dirty) vrend_update_viewport_state(sub_ctx); - vrend_use_program(sub_ctx, 0); + vrend_use_program(ctx->sub, NULL); glDisable(GL_SCISSOR_TEST); @@ -4147,7 +4561,7 @@ void vrend_clear(struct vrend_context *ctx, glDisable(GL_SCISSOR_TEST); } -void vrend_clear_texture(struct vrend_context* ctx, +int vrend_clear_texture(struct vrend_context* ctx, uint32_t handle, uint32_t level, const struct pipe_box *box, const void * data) @@ -4155,11 +4569,10 @@ void vrend_clear_texture(struct vrend_context* ctx, GLenum format, type; struct vrend_resource *res; - if (handle) - res = vrend_renderer_ctx_res_lookup(ctx, handle); - else { - vrend_printf( "cannot find resource for handle %d\n", handle); - return; + res = vrend_renderer_ctx_res_lookup(ctx, handle); + if (!res) { + vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_RESOURCE, handle); + return EINVAL; } enum virgl_formats fmt = res->base.format; @@ -4188,6 +4601,7 @@ void vrend_clear_texture(struct vrend_context* ctx, box->width, box->height, box->depth, format, type, data); } + return 0; } static void vrend_update_scissor_state(struct vrend_sub_context *sub_ctx) @@ -4472,6 +4886,24 @@ static int vrend_draw_bind_samplers_shader(struct vrend_sub_context *sub_ctx, struct vrend_sampler_view *tview = sviews->views[i]; if ((dirty & (1 << i)) && tview) { if (sub_ctx->prog->shadow_samp_mask[shader_type] & (1 << i)) { + struct vrend_texture *tex = (struct vrend_texture *)tview->texture; + + /* The modes LUMINANCE, INTENSITY, and ALPHA only apply when a depth texture + * is used by a sampler that returns an RGBA value, i.e. by sampler*D, if + * the texture is queries by using sampler*Shadow then these swizzles must + * not be applied, therefore, reset the swizzled to the default */ + static const GLint swizzle[] = {GL_RED,GL_GREEN,GL_BLUE,GL_ALPHA}; + if (memcmp(tex->cur_swizzle, swizzle, 4 * sizeof(GLint))) { + if (vrend_state.use_gles) { + for (unsigned int i = 0; i < 4; ++i) { + glTexParameteri(tview->texture->target, GL_TEXTURE_SWIZZLE_R + i, swizzle[i]); + } + } else { + glTexParameteriv(tview->texture->target, GL_TEXTURE_SWIZZLE_RGBA, swizzle); + } + memcpy(tex->cur_swizzle, swizzle, 4 * sizeof(GLint)); + } + glUniform4f(sub_ctx->prog->shadow_samp_mask_locs[shader_type][sampler_index], (tview->gl_swizzle[0] == GL_ZERO || tview->gl_swizzle[0] == GL_ONE) ? 0.0 : 1.0, (tview->gl_swizzle[1] == GL_ZERO || tview->gl_swizzle[1] == GL_ONE) ? 0.0 : 1.0, @@ -4652,6 +5084,11 @@ static void vrend_draw_bind_images_shader(struct vrend_sub_context *sub_ctx, int /* glTexBuffer doesn't accept GL_RGBA8_SNORM, find an appropriate replacement. */ uint32_t format = (iview->format == GL_RGBA8_SNORM) ? GL_RGBA8UI : iview->format; + if (format == GL_NONE || + (vrend_state.use_gles && format == GL_ALPHA8)) { + format = vrend_get_arb_format(iview->vformat); + } + glBindBufferARB(GL_TEXTURE_BUFFER, iview->texture->id); glBindTexture(GL_TEXTURE_BUFFER, iview->texture->tbo_tex_id); @@ -4708,49 +5145,34 @@ static void vrend_draw_bind_images_shader(struct vrend_sub_context *sub_ctx, int static void vrend_fill_sysval_uniform_block (struct vrend_sub_context *sub_ctx) { - if (sub_ctx->prog->virgl_block_id == GL_INVALID_INDEX) + if (sub_ctx->prog->virgl_block_bind == -1) return; - struct sysval_uniform_block virgl_uniform_block; - memset(&virgl_uniform_block, 0, sizeof(struct sysval_uniform_block)); - - if (vrend_state.use_core_profile) - virgl_uniform_block.alpha_ref_val = sub_ctx->dsa_state.alpha.ref_value; - - virgl_uniform_block.winsys_adjust_y = sub_ctx->viewport_is_negative ? -1.f : 1.f; - - if (has_feature(feat_cull_distance)) { - if (sub_ctx->rs_state.clip_plane_enable) { - virgl_uniform_block.clip_plane_enabled = 1.f; - for (int i = 0 ; i < VIRGL_NUM_CLIP_PLANES; i++) { - memcpy(&virgl_uniform_block.clipp[i], - (const GLfloat *) &sub_ctx->ucp_state.ucp[i], sizeof(GLfloat) * 4); - } - } else { - virgl_uniform_block.clip_plane_enabled = 0.f; - } + if (sub_ctx->sysvalue_data_cookie != sub_ctx->prog->sysvalue_data_cookie) { + glBindBuffer(GL_UNIFORM_BUFFER, sub_ctx->prog->ubo_sysval_buffer_id); + glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(struct sysval_uniform_block), + &sub_ctx->sysvalue_data); + glBindBuffer(GL_UNIFORM_BUFFER, 0); + sub_ctx->prog->sysvalue_data_cookie = sub_ctx->sysvalue_data_cookie; } - - glBindBuffer(GL_UNIFORM_BUFFER, sub_ctx->prog->ubo_sysval_buffer_id); - glBufferSubData(GL_UNIFORM_BUFFER, 0, sizeof(struct sysval_uniform_block), - &virgl_uniform_block); - glBindBuffer(GL_UNIFORM_BUFFER, 0); } static void vrend_draw_bind_objects(struct vrend_sub_context *sub_ctx, bool new_program) { int next_ubo_id = 0, next_sampler_id = 0; for (int shader_type = PIPE_SHADER_VERTEX; shader_type <= sub_ctx->last_shader_idx; shader_type++) { + vrend_set_active_pipeline_stage(sub_ctx->prog, shader_type); + next_ubo_id = vrend_draw_bind_ubo_shader(sub_ctx, shader_type, next_ubo_id); vrend_draw_bind_const_shader(sub_ctx, shader_type, new_program); - next_sampler_id = vrend_draw_bind_samplers_shader(sub_ctx, shader_type, - next_sampler_id); + next_sampler_id = vrend_draw_bind_samplers_shader(sub_ctx, shader_type, next_sampler_id); vrend_draw_bind_images_shader(sub_ctx, shader_type); vrend_draw_bind_ssbo_shader(sub_ctx, shader_type); if (vrend_state.use_gles) { if (sub_ctx->prog->tex_levels_uniform_id[shader_type] != -1) { + vrend_set_active_pipeline_stage(sub_ctx->prog, shader_type); glUniform1iv(sub_ctx->prog->tex_levels_uniform_id[shader_type], sub_ctx->n_samplers[shader_type], sub_ctx->texture_levels[shader_type]); @@ -4758,18 +5180,14 @@ static void vrend_draw_bind_objects(struct vrend_sub_context *sub_ctx, bool new_ } } - if (sub_ctx->prog->virgl_block_id != GL_INVALID_INDEX) + if (sub_ctx->prog->virgl_block_bind != -1) glBindBufferRange(GL_UNIFORM_BUFFER, sub_ctx->prog->virgl_block_bind, sub_ctx->prog->ubo_sysval_buffer_id, 0, sizeof(struct sysval_uniform_block)); vrend_draw_bind_abo_shader(sub_ctx); - if (vrend_state.use_core_profile && sub_ctx->prog->fs_stipple_loc != -1) { - glActiveTexture(GL_TEXTURE0 + next_sampler_id); - glBindTexture(GL_TEXTURE_2D, sub_ctx->parent->pstipple_tex_id); - glUniform1i(sub_ctx->prog->fs_stipple_loc, next_sampler_id); - } + vrend_set_active_pipeline_stage(sub_ctx->prog, PIPE_SHADER_FRAGMENT); } static @@ -4803,7 +5221,6 @@ void vrend_inject_tcs(struct vrend_sub_context *sub_ctx, int vertices_per_patch) sel->tokens = NULL; sel->current = shader; sub_ctx->shaders[PIPE_SHADER_TESS_CTRL] = sel; - sub_ctx->shaders[PIPE_SHADER_TESS_CTRL]->num_shaders = 1; vrend_compile_shader(sub_ctx, shader); } @@ -4890,11 +5307,17 @@ vrend_select_program(struct vrend_sub_context *sub_ctx, ubyte vertices_per_patch (shaders[PIPE_SHADER_TESS_EVAL] && !shaders[PIPE_SHADER_TESS_EVAL]->current)) goto fail; - GLuint vs_id = shaders[PIPE_SHADER_VERTEX]->current->id; - GLuint fs_id = shaders[PIPE_SHADER_FRAGMENT]->current->id; - GLuint gs_id = shaders[PIPE_SHADER_GEOMETRY] ? shaders[PIPE_SHADER_GEOMETRY]->current->id : 0; - GLuint tcs_id = shaders[PIPE_SHADER_TESS_CTRL] ? shaders[PIPE_SHADER_TESS_CTRL]->current->id : 0; - GLuint tes_id = shaders[PIPE_SHADER_TESS_EVAL] ? shaders[PIPE_SHADER_TESS_EVAL]->current->id : 0; + struct vrend_shader *vs = shaders[PIPE_SHADER_VERTEX]->current; + struct vrend_shader *fs = shaders[PIPE_SHADER_FRAGMENT]->current; + struct vrend_shader *gs = shaders[PIPE_SHADER_GEOMETRY] ? shaders[PIPE_SHADER_GEOMETRY]->current : NULL; + struct vrend_shader *tcs = shaders[PIPE_SHADER_TESS_CTRL] ? shaders[PIPE_SHADER_TESS_CTRL]->current : NULL; + struct vrend_shader *tes = shaders[PIPE_SHADER_TESS_EVAL] ? shaders[PIPE_SHADER_TESS_EVAL]->current : NULL; + + GLuint vs_id = vs->id; + GLuint fs_id = fs->id; + GLuint gs_id = !gs ? 0 : gs->id; + GLuint tcs_id = !tcs ? 0 : tcs->id; + GLuint tes_id = !tes ? 0 : tes->id; if (shaders[PIPE_SHADER_FRAGMENT]->current->sel->sinfo.num_outputs <= 1) dual_src = false; @@ -4907,6 +5330,12 @@ vrend_select_program(struct vrend_sub_context *sub_ctx, ubyte vertices_per_patch tes_id == sub_ctx->prog_ids[PIPE_SHADER_TESS_EVAL] && sub_ctx->prog->dual_src_linked == dual_src; + bool separable = vs->sel->sinfo.separable_program && + fs->sel->sinfo.separable_program && + (!gs || gs->sel->sinfo.separable_program) && + (!tcs || tcs->sel->sinfo.separable_program) && + (!tes || tes->sel->sinfo.separable_program); + if (!same_prog) { prog = lookup_shader_program(sub_ctx, vs_id, fs_id, gs_id, tcs_id, tes_id, dual_src); if (!prog) { @@ -4915,10 +5344,34 @@ vrend_select_program(struct vrend_sub_context *sub_ctx, ubyte vertices_per_patch sub_ctx->shaders[PIPE_SHADER_FRAGMENT]->current, gs_id ? sub_ctx->shaders[PIPE_SHADER_GEOMETRY]->current : NULL, tcs_id ? sub_ctx->shaders[PIPE_SHADER_TESS_CTRL]->current : NULL, - tes_id ? sub_ctx->shaders[PIPE_SHADER_TESS_EVAL]->current : NULL); + tes_id ? sub_ctx->shaders[PIPE_SHADER_TESS_EVAL]->current : NULL, + separable); if (!prog) return false; prog->gles_use_query_texturelevel_mask = gles_emulate_query_texture_levels_mask; + } else if (separable) { + /* UBO block bindings are reset to zero if the programs are + * re-linked. With separable shaders, the program can be relinked + * because it's shared across multiple pipelines and some things like + * transform feedback require relinking, so we have to make sure the + * blocks are bound. */ + enum pipe_shader_type last_shader = tes_id ? PIPE_SHADER_TESS_EVAL : + (gs_id ? PIPE_SHADER_GEOMETRY : + PIPE_SHADER_FRAGMENT); + bool need_rebind = false; + + for (enum pipe_shader_type shader_type = PIPE_SHADER_VERTEX; + shader_type <= last_shader && !need_rebind; + shader_type++) { + if (!prog->ss[shader_type]) + continue; + need_rebind |= prog->ss[shader_type]->last_pipeline_id != prog->id.pipeline; + } + + if (need_rebind) { + vrend_use_program(sub_ctx, prog); + rebind_ubo_and_sampler_locs(prog, last_shader); + } } sub_ctx->last_shader_idx = sub_ctx->shaders[PIPE_SHADER_TESS_EVAL] ? PIPE_SHADER_TESS_EVAL : (sub_ctx->shaders[PIPE_SHADER_GEOMETRY] ? PIPE_SHADER_GEOMETRY : PIPE_SHADER_FRAGMENT); @@ -4950,14 +5403,22 @@ fail: return false; } -void vrend_link_program(struct vrend_context *ctx, uint32_t *handles) +void vrend_link_program_hook(struct vrend_context *ctx, uint32_t *handles) { /* Pre-compiling compute shaders needs some additional work */ if (handles[PIPE_SHADER_COMPUTE]) return; + struct vrend_shader_selector *vs = vrend_object_lookup(ctx->sub->object_hash, + handles[PIPE_SHADER_VERTEX], + VIRGL_OBJECT_SHADER); + struct vrend_shader_selector *fs = vrend_object_lookup(ctx->sub->object_hash, + handles[PIPE_SHADER_FRAGMENT], + VIRGL_OBJECT_SHADER); + /* If we can't force linking, exit early */ - if (!handles[PIPE_SHADER_VERTEX] || !handles[PIPE_SHADER_FRAGMENT]) + if ((!handles[PIPE_SHADER_VERTEX] || !handles[PIPE_SHADER_FRAGMENT]) && + (!vs || !vs->sinfo.separable_program) && (!fs || !fs->sinfo.separable_program)) return; /* We can't link a pre-link a TCS without a TES, exit early */ @@ -4975,6 +5436,17 @@ void vrend_link_program(struct vrend_context *ctx, uint32_t *handles) vrend_bind_shader(ctx, handles[type], type); } + /* Force early-linking for separable shaders, since they don't depend on other stages */ + for (uint32_t type = 0; type < PIPE_SHADER_TYPES; ++type) { + if (ctx->sub->shaders[type] && ctx->sub->shaders[type]->sinfo.separable_program) { + if (!ctx->sub->shaders[type]->current->is_compiled) + vrend_compile_shader(ctx->sub, ctx->sub->shaders[type]->current); + if (!ctx->sub->shaders[type]->current->is_linked) + vrend_link_separable_shader(ctx->sub, ctx->sub->shaders[type]->current, type); + } + } + + /* Force early-link of the whole shader program. */ vrend_select_program(ctx->sub, 1); ctx->sub->shader_dirty = true; @@ -5072,7 +5544,7 @@ int vrend_draw_vbo(struct vrend_context *ctx, return 0; } - vrend_use_program(sub_ctx, sub_ctx->prog->id); + vrend_use_program(sub_ctx, sub_ctx->prog); if (vrend_state.use_gles) { /* PIPE_SHADER and TGSI_SHADER have different ordering, so use two @@ -5081,7 +5553,8 @@ int vrend_draw_vbo(struct vrend_context *ctx, if (sub_ctx->prog->gles_use_query_texturelevel_mask & (1 << i)) { char loc_name[32]; snprintf(loc_name, 32, "%s_texlod", pipe_shader_to_prefix(i)); - sub_ctx->prog->tex_levels_uniform_id[i] = glGetUniformLocation(sub_ctx->prog->id, loc_name); + sub_ctx->prog->tex_levels_uniform_id[i] = + vrend_get_uniform_location(sub_ctx->prog, loc_name, i); } else { sub_ctx->prog->tex_levels_uniform_id[i] = -1; } @@ -5326,8 +5799,9 @@ void vrend_launch_grid(struct vrend_context *ctx, return; } - vrend_use_program(sub_ctx, sub_ctx->prog->id); + vrend_use_program(sub_ctx, sub_ctx->prog); + vrend_set_active_pipeline_stage(sub_ctx->prog, PIPE_SHADER_COMPUTE); vrend_draw_bind_ubo_shader(sub_ctx, PIPE_SHADER_COMPUTE, 0); vrend_draw_bind_const_shader(sub_ctx, PIPE_SHADER_COMPUTE, new_program); vrend_draw_bind_samplers_shader(sub_ctx, PIPE_SHADER_COMPUTE, 0); @@ -5556,13 +6030,12 @@ static void vrend_hw_emit_blend(struct vrend_sub_context *sub_ctx, struct pipe_b if (state->rt[0].colormask != sub_ctx->hw_blend_state.rt[0].colormask || (sub_ctx->hw_blend_state.independent_blend_enable && !state->independent_blend_enable)) { - int i; - for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) - sub_ctx->hw_blend_state.rt[i].colormask = state->rt[i].colormask; glColorMask(state->rt[0].colormask & PIPE_MASK_R ? GL_TRUE : GL_FALSE, state->rt[0].colormask & PIPE_MASK_G ? GL_TRUE : GL_FALSE, state->rt[0].colormask & PIPE_MASK_B ? GL_TRUE : GL_FALSE, state->rt[0].colormask & PIPE_MASK_A ? GL_TRUE : GL_FALSE); + for (int i = 0; i < PIPE_MAX_COLOR_BUFS; i++) + sub_ctx->hw_blend_state.rt[i].colormask = state->rt[0].colormask; } } sub_ctx->hw_blend_state.independent_blend_enable = state->independent_blend_enable; @@ -5724,6 +6197,11 @@ void vrend_object_bind_dsa(struct vrend_context *ctx, ctx->sub->dsa_state = *state; ctx->sub->dsa = state; + if (ctx->sub->sysvalue_data.alpha_ref_val != state->alpha.ref_value) { + ctx->sub->sysvalue_data.alpha_ref_val = state->alpha.ref_value; + ctx->sub->sysvalue_data_cookie++; + } + vrend_hw_emit_dsa(ctx); } @@ -5732,7 +6210,7 @@ static void vrend_update_frontface_state(struct vrend_sub_context *sub_ctx) struct pipe_rasterizer_state *state = &sub_ctx->rs_state; int front_ccw = state->front_ccw; - front_ccw ^= (sub_ctx->inverted_fbo_content ? 0 : 1); + front_ccw ^= (sub_ctx->fbo_origin_upper_left ? 0 : 1); if (front_ccw) glFrontFace(GL_CCW); else @@ -5920,9 +6398,6 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx) glEnable(GL_POLYGON_STIPPLE); else glDisable(GL_POLYGON_STIPPLE); - } else if (state->poly_stipple_enable) { - if (!ctx->pstip_inited) - vrend_init_pstipple_texture(ctx); } if (state->point_quad_rasterization) { @@ -5975,6 +6450,13 @@ static void vrend_hw_emit_rs(struct vrend_context *ctx) else glDisable(GL_CLIP_PLANE0 + i); } + + ctx->sub->sysvalue_data_cookie++; + if (ctx->sub->rs_state.clip_plane_enable) { + ctx->sub->sysvalue_data.clip_plane_enabled = 1.f; + } else { + ctx->sub->sysvalue_data.clip_plane_enabled = 0.f; + } } if (vrend_state.use_core_profile == false) { glLineStipple(state->line_stipple_factor, state->line_stipple_pattern); @@ -6330,18 +6812,13 @@ static void vrend_free_fences_for_context(struct vrend_context *ctx) static bool do_wait(struct vrend_fence *fence, bool can_block) { - bool done = false; - int timeout = can_block ? 1000000000 : 0; - #ifdef HAVE_EPOXY_EGL_H - if (vrend_state.use_egl_fence) { - do { - done = virgl_egl_client_wait_fence(egl, fence->eglsyncobj, timeout); - } while (!done && can_block); - return done; - } + if (vrend_state.use_egl_fence) + return virgl_egl_client_wait_fence(egl, fence->eglsyncobj, can_block); #endif + bool done = false; + int timeout = can_block ? 1000000000 : 0; do { GLenum glret = glClientWaitSync(fence->glsyncobj, 0, timeout); if (glret == GL_WAIT_FAILED) { @@ -6621,7 +7098,7 @@ vrend_renderer_get_pipe_callbacks(void) return &callbacks; } -static bool use_integer() { +static bool use_integer(void) { if (getenv("VIRGL_USE_INTEGER")) return true; @@ -6773,6 +7250,15 @@ int vrend_renderer_init(const struct vrend_if_cbs *cbs, uint32_t flags) return EINVAL; } +#ifdef ENABLE_VIDEO + if (flags & VREND_USE_VIDEO) { + if (vrend_clicbs->get_drm_fd) + vrend_video_init(vrend_clicbs->get_drm_fd()); + else + vrend_printf("video disabled due to missing get_drm_fd\n"); + } +#endif + return 0; } @@ -6789,6 +7275,10 @@ vrend_renderer_fini(void) vrend_free_fences(); vrend_blitter_fini(); +#ifdef ENABLE_VIDEO + vrend_video_fini(); +#endif + vrend_destroy_context(vrend_state.ctx0); vrend_state.current_ctx = NULL; @@ -6880,11 +7370,6 @@ void vrend_destroy_context(struct vrend_context *ctx) vrend_state.current_hw_ctx = NULL; } - if (vrend_state.use_core_profile) { - if (ctx->pstip_inited) - glDeleteTextures(1, &ctx->pstipple_tex_id); - ctx->pstip_inited = false; - } vrend_clicbs->make_current(ctx->sub->gl_context); /* reset references on framebuffers */ vrend_set_framebuffer_state(ctx, 0, NULL, 0); @@ -6907,6 +7392,10 @@ void vrend_destroy_context(struct vrend_context *ctx) vrend_free_fences_for_context(ctx); +#ifdef ENABLE_VIDEO + vrend_video_destroy_context(ctx->video); +#endif + LIST_FOR_EACH_ENTRY_SAFE(untyped_res, untyped_res_tmp, &ctx->untyped_resources, head) free(untyped_res); vrend_ctx_resource_fini_table(ctx->res_hash); @@ -6938,9 +7427,14 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de list_inithead(&grctx->sub_ctxs); list_inithead(&grctx->vrend_resources); +#ifdef ENABLE_VIDEO + grctx->video = vrend_video_create_context(grctx); +#endif + grctx->res_hash = vrend_ctx_resource_init_table(); list_inithead(&grctx->untyped_resources); + grctx->shader_cfg.max_shader_patch_varyings = vrend_state.max_shader_patch_varyings; grctx->shader_cfg.use_gles = vrend_state.use_gles; grctx->shader_cfg.use_core_profile = vrend_state.use_core_profile; grctx->shader_cfg.use_explicit_locations = vrend_state.use_explicit_locations; @@ -6953,6 +7447,8 @@ struct vrend_context *vrend_create_context(int id, uint32_t nlen, const char *de grctx->shader_cfg.has_dual_src_blend = has_feature(feat_dual_src_blend); grctx->shader_cfg.has_fbfetch_coherent = has_feature(feat_framebuffer_fetch); grctx->shader_cfg.has_cull_distance = has_feature(feat_cull_distance); + grctx->shader_cfg.has_nopersective = has_feature(feat_shader_noperspective_interpolation); + grctx->shader_cfg.has_texture_shadow_lod = has_feature(feat_texture_shadow_lod); vrend_renderer_create_sub_ctx(grctx, 0); vrend_renderer_set_sub_ctx(grctx, 0); @@ -7462,8 +7958,9 @@ static int vrend_resource_alloc_texture(struct vrend_resource *gr, if (has_bit(gr->storage_bits, VREND_STORAGE_GL_IMMUTABLE) && has_feature(feat_egl_image_storage)) { glEGLImageTargetTexStorageEXT(gr->target, (GLeglImageOES) image_oes, NULL); - } else if (has_feature(feat_egl_image_external)) { + } else if (has_feature(feat_egl_image)) { gr->storage_bits &= ~VREND_STORAGE_GL_IMMUTABLE; + assert(gr->target == GL_TEXTURE_2D); glEGLImageTargetTexture2DOES(gr->target, (GLeglImageOES) image_oes); if ((format == VIRGL_FORMAT_NV12 || format == VIRGL_FORMAT_NV21 || @@ -7472,7 +7969,7 @@ static int vrend_resource_alloc_texture(struct vrend_resource *gr, vrend_printf("glEGLImageTargetTexture2DOES maybe fail\n"); } } else { - vrend_printf( "missing GL_OES_EGL_image_external extensions\n"); + vrend_printf( "missing GL_OES_EGL_image extensions\n"); glBindTexture(gr->target, 0); return EINVAL; } @@ -7866,9 +8363,9 @@ static uint64_t vrend_transfer_size(struct vrend_resource *vres, */ int w = box->width > 0 ? box->width : 1; int h = box->height > 0 ? box->height : 1; - int d = box->depth > 0 ? box->depth : 1; - int nblocksx = util_format_get_nblocksx(pres->format, w); - int nblocksy = util_format_get_nblocksy(pres->format, h); + uint64_t d = box->depth > 0 ? box->depth : 1; + uint64_t nblocksx = util_format_get_nblocksx(pres->format, w); + uint64_t nblocksy = util_format_get_nblocksy(pres->format, h); /* Calculate the box size, not including the last layer. The last layer * is the only one which may be incomplete, and is the only layer for @@ -8006,10 +8503,7 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx, uint32_t stride = info->stride; uint32_t layer_stride = info->layer_stride; - if (ctx) - vrend_use_program(ctx->sub, 0); - else - glUseProgram(0); + vrend_use_program(ctx->sub, 0); if (!stride) stride = util_format_get_nblocksx(res->base.format, u_minify(res->base.width0, info->level)) * elsize; @@ -8094,15 +8588,11 @@ static int vrend_renderer_transfer_write_iov(struct vrend_context *ctx, buffers = GL_COLOR_ATTACHMENT0; glDrawBuffers(1, &buffers); glDisable(GL_BLEND); - if (ctx) { - vrend_depth_test_enable(ctx, false); - vrend_alpha_test_enable(ctx, false); - vrend_stencil_test_enable(ctx->sub, false); - } else { - glDisable(GL_DEPTH_TEST); - glDisable(GL_ALPHA_TEST); - glDisable(GL_STENCIL_TEST); - } + + vrend_depth_test_enable(ctx, false); + vrend_alpha_test_enable(ctx, false); + vrend_stencil_test_enable(ctx->sub, false); + glPixelZoom(1.0f, res->y_0_top ? -1.0f : 1.0f); glWindowPos2i(info->box->x, res->y_0_top ? (int)res->base.height0 - info->box->y : info->box->y); glDrawPixels(info->box->width, info->box->height, glformat, gltype, @@ -8382,10 +8872,7 @@ static int vrend_transfer_send_readpixels(struct vrend_context *ctx, int row_stride = info->stride / elsize; GLint old_fbo; - if (ctx) - vrend_use_program(ctx->sub, 0); - else - glUseProgram(0); + vrend_use_program(ctx->sub, 0); enum virgl_formats fmt = res->base.format; @@ -8887,59 +9374,41 @@ void vrend_set_scissor_state(struct vrend_context *ctx, uint32_t num_scissor, struct pipe_scissor_state *ss) { - uint i, idx; - - if (start_slot > PIPE_MAX_VIEWPORTS || - num_scissor > (PIPE_MAX_VIEWPORTS - start_slot)) { + if (start_slot < PIPE_MAX_VIEWPORTS && + start_slot + num_scissor <= PIPE_MAX_VIEWPORTS) { + for (uint i = 0; i < num_scissor; i++) { + uint idx = start_slot + i; + ctx->sub->ss[idx] = ss[i]; + ctx->sub->scissor_state_dirty |= (1 << idx); + } + } else vrend_report_buffer_error(ctx, 0); - return; - } - - for (i = 0; i < num_scissor; i++) { - idx = start_slot + i; - ctx->sub->ss[idx] = ss[i]; - ctx->sub->scissor_state_dirty |= (1 << idx); - } } void vrend_set_polygon_stipple(struct vrend_context *ctx, struct pipe_poly_stipple *ps) { if (vrend_state.use_core_profile) { - static const unsigned bit31 = 1u << 31; - GLubyte *stip = calloc(1, 1024); - int i, j; - - if (!ctx->pstip_inited) - vrend_init_pstipple_texture(ctx); - - if (!stip) - return; - - for (i = 0; i < 32; i++) { - for (j = 0; j < 32; j++) { - if (ps->stipple[i] & (bit31 >> j)) - stip[i * 32 + j] = 0; - else - stip[i * 32 + j] = 255; - } - } - - glBindTexture(GL_TEXTURE_2D, ctx->pstipple_tex_id); - glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 32, 32, - GL_RED, GL_UNSIGNED_BYTE, stip); - glBindTexture(GL_TEXTURE_2D, 0); - free(stip); - return; + /* std140 aligns array elements at 16 byte */ + for (int i = 0; i < VREND_POLYGON_STIPPLE_SIZE ; ++i) + ctx->sub->sysvalue_data.stipple_pattern[i][0] = ps->stipple[i]; + ctx->sub->sysvalue_data_cookie++; + } else { + glPolygonStipple((const GLubyte *)ps->stipple); } - glPolygonStipple((const GLubyte *)ps->stipple); } void vrend_set_clip_state(struct vrend_context *ctx, struct pipe_clip_state *ucp) { if (vrend_state.use_core_profile) { ctx->sub->ucp_state = *ucp; + + ctx->sub->sysvalue_data_cookie++; + for (int i = 0 ; i < VIRGL_NUM_CLIP_PLANES; i++) { + memcpy(&ctx->sub->sysvalue_data.clipp[i], + (const GLfloat *) &ctx->sub->ucp_state.ucp[i], sizeof(GLfloat) * 4); + } } else { int i, j; GLdouble val[4]; @@ -9789,6 +10258,7 @@ void vrend_renderer_blit(struct vrend_context *ctx, { unsigned int comp_flags = 0; struct vrend_resource *src_res, *dst_res; + int src_width, src_height, dst_width, dst_height; src_res = vrend_renderer_ctx_res_lookup(ctx, src_handle); dst_res = vrend_renderer_ctx_res_lookup(ctx, dst_handle); @@ -9851,6 +10321,11 @@ void vrend_renderer_blit(struct vrend_context *ctx, !(vrend_resource_needs_srgb_decode(src_res, info->src.format) || vrend_resource_needs_srgb_encode(dst_res, info->dst.format)); + src_width = u_minify(src_res->base.width0, info->src.level); + src_height = u_minify(src_res->base.height0, info->src.level); + dst_width = u_minify(dst_res->base.width0, info->dst.level); + dst_height = u_minify(dst_res->base.height0, info->dst.level); + /* The Gallium blit function can be called for a general blit that may * scale, convert the data, and apply some rander states, or it is called via * glCopyImageSubData. If the src or the dst image are equal, or the two @@ -9865,6 +10340,10 @@ void vrend_renderer_blit(struct vrend_context *ctx, !info->scissor_enable && (info->filter == PIPE_TEX_FILTER_NEAREST) && !info->alpha_blend && (info->mask == PIPE_MASK_RGBA) && src_res->base.nr_samples == dst_res->base.nr_samples && + info->src.box.x + info->src.box.width <= src_width && + info->dst.box.x + info->dst.box.width <= dst_width && + info->src.box.y + info->src.box.height <= src_height && + info->dst.box.y + info->dst.box.height <= dst_height && info->src.box.width == info->dst.box.width && info->src.box.height == info->dst.box.height && info->src.box.depth == info->dst.box.depth) { @@ -10198,11 +10677,8 @@ int vrend_create_query(struct vrend_context *ctx, uint32_t handle, uint32_t query_type, uint32_t query_index, uint32_t res_handle, UNUSED uint32_t offset) { - struct vrend_query *q; - struct vrend_resource *res; - uint32_t ret_handle; bool fake_samples_passed = false; - res = vrend_renderer_ctx_res_lookup(ctx, res_handle); + struct vrend_resource *res = vrend_renderer_ctx_res_lookup(ctx, res_handle); if (!res || !has_bit(res->storage_bits, VREND_STORAGE_HOST_SYSTEM_MEMORY)) { vrend_report_context_error(ctx, VIRGL_ERROR_CTX_ILLEGAL_RESOURCE, res_handle); return EINVAL; @@ -10222,10 +10698,12 @@ int vrend_create_query(struct vrend_context *ctx, uint32_t handle, return EINVAL; } - q = CALLOC_STRUCT(vrend_query); + struct vrend_query *q = CALLOC_STRUCT(vrend_query); if (!q) return ENOMEM; + int err = 0; + list_inithead(&q->waiting_queries); q->type = query_type; q->index = query_index; @@ -10240,20 +10718,22 @@ int vrend_create_query(struct vrend_context *ctx, uint32_t handle, q->gltype = GL_SAMPLES_PASSED_ARB; break; case PIPE_QUERY_OCCLUSION_PREDICATE: - if (has_feature(feat_occlusion_query_boolean)) { + if (has_feature(feat_occlusion_query_boolean)) q->gltype = GL_ANY_SAMPLES_PASSED; - break; - } else - return EINVAL; + else + err = EINVAL; + break; case PIPE_QUERY_TIMESTAMP: - if (!has_feature(feat_timer_query)) - return EINVAL; - q->gltype = GL_TIMESTAMP; + if (has_feature(feat_timer_query)) + q->gltype = GL_TIMESTAMP; + else + err = EINVAL; break; case PIPE_QUERY_TIME_ELAPSED: - if (!has_feature(feat_timer_query)) - return EINVAL; - q->gltype = GL_TIME_ELAPSED; + if (has_feature(feat_timer_query)) + q->gltype = GL_TIME_ELAPSED; + else + err = EINVAL; break; case PIPE_QUERY_PRIMITIVES_GENERATED: q->gltype = GL_PRIMITIVES_GENERATED; @@ -10265,29 +10745,34 @@ int vrend_create_query(struct vrend_context *ctx, uint32_t handle, q->gltype = GL_ANY_SAMPLES_PASSED_CONSERVATIVE; break; case PIPE_QUERY_SO_OVERFLOW_PREDICATE: - if (!has_feature(feat_transform_feedback_overflow_query)) - return EINVAL; - q->gltype = GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB; + if (has_feature(feat_transform_feedback_overflow_query)) + q->gltype = GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB; + else + err = EINVAL; break; case PIPE_QUERY_SO_OVERFLOW_ANY_PREDICATE: - if (!has_feature(feat_transform_feedback_overflow_query)) - return EINVAL; - q->gltype = GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB; + if (has_feature(feat_transform_feedback_overflow_query)) + q->gltype = GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB; + else + err = EINVAL; break; default: vrend_printf("unknown query object received %d\n", q->type); break; } - glGenQueries(1, &q->id); + if (!err) { + glGenQueries(1, &q->id); + if (!vrend_renderer_object_insert(ctx, q, handle, VIRGL_OBJECT_QUERY)) { + glDeleteQueries(1, &q->id); + err = ENOMEM; + } + } - ret_handle = vrend_renderer_object_insert(ctx, q, handle, - VIRGL_OBJECT_QUERY); - if (!ret_handle) { + if (err) FREE(q); - return ENOMEM; - } - return 0; + + return err; } static void vrend_destroy_query(struct vrend_query *query) @@ -10587,15 +11072,13 @@ static int vrender_get_glsl_version(void) version_str = glGetString(GL_SHADING_LANGUAGE_VERSION); if (vrend_state.use_gles) { - char tmp[20]; - c = sscanf((const char *)version_str, "%s %s %s %s %i.%i", - tmp, tmp, tmp, tmp, &major_local, &minor_local); - assert(c == 6); + c = sscanf((const char *)version_str, "%*s %*s %*s %*s %i.%i", + &major_local, &minor_local); } else { c = sscanf((const char *)version_str, "%i.%i", &major_local, &minor_local); - assert(c == 2); } + assert(c == 2); return (major_local * 100) + minor_local; } @@ -10847,6 +11330,10 @@ static void vrend_renderer_fill_caps_v1(int gl_ver, int gles_ver, union virgl_ca caps->v1.max_viewports = 1; } + if (has_feature(feat_timer_query)) { + caps->v1.bset.timer_query = 1; + } + /* Common limits for all backends. */ caps->v1.max_render_targets = vrend_state.max_draw_buffers; @@ -10885,11 +11372,18 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c * this value to avoid regressions when a guest with a new mesa version is * run on an old virgl host. Use it also to indicate non-cap fixes on the * host that help enable features in the guest. */ - caps->v2.host_feature_check_version = 12; + caps->v2.host_feature_check_version = 15; /* Forward host GL_RENDERER to the guest. */ strncpy(caps->v2.renderer, renderer, sizeof(caps->v2.renderer) - 1); + /* glamor reject llvmpipe, and since the renderer string is + * composed of "virgl" and this renderer string we have to + * hide the "llvmpipe" part */ + char *llvmpipe_string = strstr(caps->v2.renderer, "llvmpipe"); + if (llvmpipe_string) + memcpy(llvmpipe_string, "LLVMPIPE", 8); + glGetFloatv(GL_ALIASED_POINT_SIZE_RANGE, range); caps->v2.min_aliased_point_size = range[0]; caps->v2.max_aliased_point_size = range[1]; @@ -10944,6 +11438,8 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c } else caps->v2.max_shader_patch_varyings = 0; + vrend_state.max_shader_patch_varyings = caps->v2.max_shader_patch_varyings; + if (has_feature(feat_texture_gather)) { glGetIntegerv(GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET, &caps->v2.min_texture_gather_offset); glGetIntegerv(GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET, &caps->v2.max_texture_gather_offset); @@ -11009,49 +11505,57 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c } if (has_feature(feat_atomic_counters)) { - glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTERS, - (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_VERTEX)); - glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, - (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_VERTEX)); - /* OpenGL ES doesn't have the atomicCounter*() operations, force lowering to ssbo */ - if (gles_ver > 0) { - caps->v2.max_atomic_counters[PIPE_SHADER_FRAGMENT] = 0; - } else { + /* On GLES hosts we want atomics to be lowered to SSBOs */ + if (gl_ver > 0) { + glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTERS, + (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_VERTEX)); glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTERS, (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_FRAGMENT)); + + if (has_feature(feat_geometry_shader)) { + glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTERS, + (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_GEOMETRY)); + } + + if (has_feature(feat_tessellation)) { + glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, + (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_CTRL)); + glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, + (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_EVAL)); + } + + if (has_feature(feat_compute_shader)) { + glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTERS, + (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_COMPUTE)); + } + + glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTERS, + (GLint*)&caps->v2.max_combined_atomic_counters); } + glGetIntegerv(GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS, + (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_VERTEX)); + glGetIntegerv(GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS, (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_FRAGMENT)); - if (has_feature(feat_geometry_shader)) { - glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTERS, - (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_GEOMETRY)); + if (has_feature(feat_geometry_shader)) glGetIntegerv(GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS, (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_GEOMETRY)); - } if (has_feature(feat_tessellation)) { - glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS, - (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_CTRL)); glGetIntegerv(GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS, (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_TESS_CTRL)); - glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS, - (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_TESS_EVAL)); glGetIntegerv(GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS, (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_TESS_EVAL)); } if (has_feature(feat_compute_shader)) { - glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTERS, - (GLint*)(caps->v2.max_atomic_counters + PIPE_SHADER_COMPUTE)); glGetIntegerv(GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS, (GLint*)(caps->v2.max_atomic_counter_buffers + PIPE_SHADER_COMPUTE)); } - glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTERS, - (GLint*)&caps->v2.max_combined_atomic_counters); glGetIntegerv(GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS, (GLint*)&caps->v2.max_combined_atomic_counter_buffers); } @@ -11108,7 +11612,7 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c /* We want to expose ARB_gpu_shader_fp64 when running on top of ES */ if (vrend_state.use_gles) { - caps->v2.capability_bits |= VIRGL_CAP_FAKE_FP64; + caps->v2.capability_bits |= VIRGL_CAP_HOST_IS_GLES; } if (has_feature(feat_indirect_draw)) @@ -11164,7 +11668,8 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c if (has_feature(feat_arb_buffer_storage) && !vrend_state.use_external_blob) { const char *vendor = (const char *)glGetString(GL_VENDOR); - bool is_mesa = ((strstr(renderer, "Mesa") != NULL) || (strstr(renderer, "DRM") != NULL)); + bool is_mesa = ((strstr(renderer, "Mesa") != NULL) || (strstr(renderer, "DRM") != NULL) || + (strstr(renderer, "llvmpipe") != NULL)); /* * Intel GPUs (aside from Atom, which doesn't expose GL4.5) are cache-coherent. * Mesa AMDGPUs use write-combine mappings for coherent/persistent memory (see @@ -11179,6 +11684,8 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c vrend_state.inferred_gl_caching_type = VIRGL_RENDERER_MAP_CACHE_CACHED; else if (strstr(vendor, "AMD") != NULL) vrend_state.inferred_gl_caching_type = VIRGL_RENDERER_MAP_CACHE_WC; + else if (strstr(vendor, "Mesa") != NULL) + vrend_state.inferred_gl_caching_type = VIRGL_RENDERER_MAP_CACHE_CACHED; } else { /* This is an educated guess since things don't explode with VMX + Nvidia. */ if (strstr(renderer, "Quadro K2200") != NULL) @@ -11192,11 +11699,12 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c #ifdef ENABLE_MINIGBM_ALLOCATION if (gbm) { if (has_feature(feat_memory_object) && has_feature(feat_memory_object_fd)) { - if (!strcmp(gbm_device_get_backend_name(gbm->device), "i915") && + if ((!strcmp(gbm_device_get_backend_name(gbm->device), "i915") || + !strcmp(gbm_device_get_backend_name(gbm->device), "amdgpu")) && !vrend_winsys_different_gpu()) caps->v2.capability_bits |= VIRGL_CAP_ARB_BUFFER_STORAGE; } - caps->v2.capability_bits |= VIRGL_CAP_V2_SCANOUT_USES_GBM; + caps->v2.capability_bits_v2 |= VIRGL_CAP_V2_SCANOUT_USES_GBM; } #endif @@ -11227,6 +11735,9 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c if (vrend_winsys_different_gpu()) caps->v2.capability_bits_v2 |= VIRGL_CAP_V2_DIFFERENT_GPU; + if (has_feature(feat_texture_shadow_lod)) + caps->v2.capability_bits_v2 |= VIRGL_CAP_V2_TEXTURE_SHADOW_LOD; + // we use capability bits (not a version of protocol), because // we disable this on client side if virglrenderer is used under // vtest. vtest can't support this, because size of resource @@ -11244,13 +11755,17 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &max); caps->v2.max_texture_image_units = MIN2(max, PIPE_MAX_SHADER_SAMPLER_VIEWS); + if (has_feature(feat_ubo)) { + glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max); + caps->v2.max_uniform_block_size = max; + } + /* Propagate the max of Uniform Components */ glGetIntegerv(GL_MAX_VERTEX_UNIFORM_COMPONENTS, &max); caps->v2.max_const_buffer_size[PIPE_SHADER_VERTEX] = max * 4; - /* We might insert a `sampler2D pstipple_sampler` so reduce by 1 */ glGetIntegerv(GL_MAX_FRAGMENT_UNIFORM_COMPONENTS, &max); - caps->v2.max_const_buffer_size[PIPE_SHADER_FRAGMENT] = max * 4 - 1; + caps->v2.max_const_buffer_size[PIPE_SHADER_FRAGMENT] = max * 4; if (has_feature(feat_geometry_shader)) { glGetIntegerv(GL_MAX_GEOMETRY_UNIFORM_COMPONENTS, &max); @@ -11268,6 +11783,15 @@ static void vrend_renderer_fill_caps_v2(int gl_ver, int gles_ver, union virgl_c glGetIntegerv(GL_MAX_COMPUTE_UNIFORM_COMPONENTS, &max); caps->v2.max_const_buffer_size[PIPE_SHADER_COMPUTE] = max * 4; } + + if (has_feature(feat_separate_shader_objects)) + caps->v2.capability_bits_v2 |= VIRGL_CAP_V2_SSO; + +#ifdef ENABLE_VIDEO + vrend_video_fill_caps(caps); +#else + caps->v2.num_video_caps = 0; +#endif } void vrend_renderer_fill_caps(uint32_t set, uint32_t version, @@ -11390,6 +11914,7 @@ void *vrend_renderer_get_cursor_contents(struct pipe_resource *pres, void vrend_renderer_force_ctx_0(void) { + TRACE_FUNC(); vrend_state.current_ctx = NULL; vrend_state.current_hw_ctx = NULL; vrend_hw_switch_context(vrend_state.ctx0, true); @@ -11475,7 +12000,7 @@ void vrend_renderer_detach_res_ctx(struct vrend_context *ctx, vrend_ctx_resource_remove(ctx->res_hash, res->res_id); } -static struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, int res_handle) +struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, int res_handle) { return vrend_ctx_resource_lookup(ctx->res_hash, res_handle); } @@ -11583,6 +12108,9 @@ void vrend_renderer_create_sub_ctx(struct vrend_context *ctx, int sub_ctx_id) sub->object_hash = vrend_object_init_ctx_table(); + sub->sysvalue_data.winsys_adjust_y = 1.f; + sub->sysvalue_data_cookie = 1; + ctx->sub = sub; list_add(&sub->head, &ctx->sub_ctxs); if (sub_ctx_id == 0) @@ -12017,3 +12545,11 @@ void vrend_context_emit_string_marker(struct vrend_context *ctx, GLsizei length, length, message); } } + +#ifdef ENABLE_VIDEO +struct vrend_video_context *vrend_context_get_video_ctx(struct vrend_context *ctx) +{ + return ctx->video; +} +#endif + diff --git a/src/vrend_renderer.h b/src/vrend_renderer.h index a9090ff1..2aedf50e 100644 --- a/src/vrend_renderer.h +++ b/src/vrend_renderer.h @@ -122,11 +122,13 @@ struct vrend_if_cbs { virgl_gl_context (*create_gl_context)(int scanout, struct virgl_gl_ctx_param *params); void (*destroy_gl_context)(virgl_gl_context ctx); int (*make_current)(virgl_gl_context ctx); + int (*get_drm_fd)(void); }; #define VREND_USE_THREAD_SYNC (1 << 0) #define VREND_USE_EXTERNAL_BLOB (1 << 1) #define VREND_USE_ASYNC_FENCE_CB (1 << 2) +#define VREND_USE_VIDEO (1 << 3) bool vrend_check_no_error(struct vrend_context *ctx); @@ -149,7 +151,7 @@ int vrend_create_shader(struct vrend_context *ctx, const char *shd_text, uint32_t offlen, uint32_t num_tokens, uint32_t type, uint32_t pkt_length); -void vrend_link_program(struct vrend_context *ctx, uint32_t *handles); +void vrend_link_program_hook(struct vrend_context *ctx, uint32_t *handles); void vrend_bind_shader(struct vrend_context *ctx, uint32_t type, @@ -162,10 +164,10 @@ void vrend_clear(struct vrend_context *ctx, const union pipe_color_union *color, double depth, unsigned stencil); -void vrend_clear_texture(struct vrend_context* ctx, - uint32_t handle, uint32_t level, - const struct pipe_box *box, - const void * data); +int vrend_clear_texture(struct vrend_context* ctx, + uint32_t handle, uint32_t level, + const struct pipe_box *box, + const void * data); int vrend_draw_vbo(struct vrend_context *ctx, const struct pipe_draw_info *info, @@ -421,6 +423,9 @@ void vrend_check_texture_storage(struct vrend_format_table *table); void vrend_check_texture_multisample(struct vrend_format_table *table, bool enable_storage); +struct vrend_resource *vrend_renderer_ctx_res_lookup(struct vrend_context *ctx, + int res_handle); + void vrend_renderer_resource_destroy(struct vrend_resource *res); static inline void @@ -549,4 +554,7 @@ int vrend_renderer_resource_unmap(struct pipe_resource *pres); void vrend_renderer_get_meminfo(struct vrend_context *ctx, uint32_t res_handle); void vrend_context_emit_string_marker(struct vrend_context *ctx, GLsizei length, const char * message); + +struct vrend_video_context *vrend_context_get_video_ctx(struct vrend_context *ctx); + #endif diff --git a/src/vrend_shader.c b/src/vrend_shader.c index 85360739..60d7eb7f 100644 --- a/src/vrend_shader.c +++ b/src/vrend_shader.c @@ -75,10 +75,15 @@ #define SHADER_REQ_SAMPLER_BUF (1ULL << 31) #define SHADER_REQ_GEOMETRY_SHADER (1ULL << 32) #define SHADER_REQ_BLEND_EQUATION_ADVANCED (1ULL << 33) +#define SHADER_REQ_EXPLICIT_ATTRIB_LOCATION (1ULL << 34) +#define SHADER_REQ_SHADER_NOPERSPECTIVE_INTERPOLATION (1ULL << 35) +#define SHADER_REQ_TEXTURE_SHADOW_LOD (1ULL << 36) #define FRONT_COLOR_EMITTED (1 << 0) #define BACK_COLOR_EMITTED (1 << 1); +#define MAX_VARYING 32 + enum vrend_sysval_uniform { UNIFORM_WINSYS_ADJUST_Y, UNIFORM_CLIP_PLANE, @@ -106,6 +111,7 @@ struct vrend_shader_image { struct tgsi_declaration_image decl; enum tgsi_return_type image_return; bool vflag; + bool coherent; }; #define MAX_IMMEDIATE 1024 @@ -150,6 +156,7 @@ struct vrend_shader_io { bool override_no_wm : 1; bool is_int : 1; bool fbfetch_used : 1; + bool needs_override : 1; }; struct vrend_io_range { @@ -256,6 +263,7 @@ struct dump_ctx { int abo_offsets[32]; uint64_t shader_req_bits; + uint64_t patches_emitted_mask; struct pipe_stream_output_info *so; char **so_names; @@ -263,7 +271,7 @@ struct dump_ctx { bool write_all_cbufs; uint32_t shadow_samp_mask; - int fs_coord_origin, fs_pixel_center; + bool fs_lower_left_origin, fs_integer_pixel_center; int fs_depth_layout; uint32_t fs_blend_equation_advanced; @@ -289,6 +297,7 @@ struct dump_ctx { bool write_mul_utemp; bool write_mul_itemp; bool has_sample_input; + bool has_noperspective; bool early_depth_stencil; bool has_file_memory; bool force_color_two_side; @@ -296,12 +305,16 @@ struct dump_ctx { bool has_pointsize_input; bool has_pointsize_output; + bool has_input_arrays; + bool has_output_arrays; + int tcs_vertices_out; int tes_prim_mode; int tes_spacing; int tes_vertex_order; int tes_point_mode; bool is_last_vertex_stage; + bool require_dummy_value; uint16_t local_cs_block_size[3]; }; @@ -332,6 +345,7 @@ static const struct vrend_shader_table shader_req_table[] = { { SHADER_REQ_SHADER_ATOMIC_FLOAT, "NV_shader_atomic_float"}, { SHADER_REQ_CONSERVATIVE_DEPTH, "ARB_conservative_depth"}, {SHADER_REQ_BLEND_EQUATION_ADVANCED, "KHR_blend_equation_advanced"}, + { SHADER_REQ_TEXTURE_SHADOW_LOD, "EXT_texture_shadow_lod"}, }; enum vrend_type_qualifier { @@ -362,11 +376,12 @@ struct dest_info { enum vrend_type_qualifier udstconv; enum vrend_type_qualifier idstconv; bool dst_override_no_wm[2]; + int32_t dest_index; }; struct source_info { enum vrend_type_qualifier svec4; - uint32_t sreg_index; + int32_t sreg_index; bool tg4_has_component; bool override_no_wm[3]; bool override_no_cast[3]; @@ -586,15 +601,14 @@ static inline int gs_input_prim_to_size(int prim) static inline bool fs_emit_layout(const struct dump_ctx *ctx) { - if (ctx->fs_pixel_center) - return true; - /* if coord origin is 0 and invert is 0 - emit origin_upper_left, - if coord_origin is 0 and invert is 1 - emit nothing (lower) - if coord origin is 1 and invert is 0 - emit nothing (lower) - if coord_origin is 1 and invert is 1 - emit origin upper left */ - if (!(ctx->fs_coord_origin ^ ctx->key->fs.invert_origin)) + if (ctx->fs_integer_pixel_center) return true; - return false; + + /* if fs_lower_left_origin is 0 and lower_left_origin is 0 - emit origin_upper_left, + if fs_lower_left_origin is 0 and lower_left_origin is 1 - emit nothing (lower) + if fs_lower_left_origin is 1 and lower_left_origin is 0 - emit nothing (lower) + if fs_lower_left_origin is 1 and lower_left_origin is 1 - emit origin_upper_left */ + return ctx->fs_lower_left_origin == ctx->key->fs.lower_left_origin; } static const char *get_stage_input_name_prefix(const struct dump_ctx *ctx, int processor) @@ -1197,7 +1211,7 @@ map_overlapping_io_array(struct vrend_shader_io io[static 64], const struct tgsi_full_declaration *decl) { struct vrend_shader_io *overlap_io = find_overlapping_io(io, num_io, decl); - if (overlap_io) { + if (overlap_io && !overlap_io->needs_override) { int delta = new_io->first - overlap_io->first; if (delta >= 0) { new_io->array_offset = delta; @@ -1229,16 +1243,18 @@ iter_declaration(struct tgsi_iterate_context *iter, if (ctx->inputs[j].name == decl->Semantic.Name && ctx->inputs[j].sid == decl->Semantic.Index && ctx->inputs[j].first == decl->Range.First && - ctx->inputs[j].usage_mask == decl->Declaration.UsageMask && ((!decl->Declaration.Array && ctx->inputs[j].array_id == 0) || - (ctx->inputs[j].array_id == decl->Array.ArrayID))) + (ctx->inputs[j].array_id == decl->Array.ArrayID))) { return true; + } } + i = ctx->num_inputs++; if (ctx->num_inputs > ARRAY_SIZE(ctx->inputs)) { vrend_printf( "Number of inputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->inputs)); return false; } + if (iter->processor.Processor == TGSI_PROCESSOR_VERTEX) { ctx->attrib_input_mask |= (1 << decl->Range.First); ctx->inputs[i].type = get_type(ctx->key->vs.attrib_signed_int_bitmask, @@ -1261,14 +1277,38 @@ iter_declaration(struct tgsi_iterate_context *iter, ctx->inputs[i].glsl_gl_block = false; ctx->inputs[i].overlapping_array = NULL; - if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT && - decl->Interp.Location == TGSI_INTERPOLATE_LOC_SAMPLE) { - ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; - ctx->has_sample_input = true; + if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { + if (decl->Interp.Location == TGSI_INTERPOLATE_LOC_SAMPLE) { + ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; + ctx->has_sample_input = true; + } + if (decl->Interp.Interpolate == TGSI_INTERPOLATE_LINEAR && ctx->cfg->use_gles && + ctx->cfg->has_nopersective) { + ctx->shader_req_bits |= SHADER_REQ_SHADER_NOPERSPECTIVE_INTERPOLATION; + ctx->has_noperspective = true; + } } map_overlapping_io_array(ctx->inputs, &ctx->inputs[i], ctx->num_inputs, decl); + if (!ctx->inputs[i].glsl_predefined_no_emit) { + + /* If the output of the previous shader contained arrays we + * have to check whether a non-array input here should be part + * of an array */ + for (uint32_t j = 0; j < ctx->key->in_arrays.num_arrays; j++) { + const struct vrend_shader_io_array *array = &ctx->key->in_arrays.layout[j]; + + if (array->name == decl->Semantic.Name && + array->sid <= decl->Semantic.Index && + array->sid + array->size >= decl->Semantic.Index) { + ctx->inputs[i].sid = array->sid; + ctx->inputs[i].last = MAX2(ctx->inputs[i].first + array->size, ctx->inputs[i].last); + break; + } + } + } + if (ctx->inputs[i].first != ctx->inputs[i].last) ctx->glsl_ver_required = require_glsl_ver(ctx, 150); @@ -1307,7 +1347,7 @@ iter_declaration(struct tgsi_iterate_context *iter, if (ctx->front_face_emitted == false) { int k = ctx->num_inputs++; - if (ctx->num_inputs > ARRAY_SIZE(ctx->inputs)) { + if (ctx->num_inputs >= ARRAY_SIZE(ctx->inputs)) { vrend_printf( "Number of inputs exceeded, max is %lu\n", ARRAY_SIZE(ctx->inputs)); return false; } @@ -1410,7 +1450,7 @@ iter_declaration(struct tgsi_iterate_context *iter, ctx->inputs[i].glsl_no_index = true; ctx->inputs[i].glsl_gl_block = true; } else if (iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) { - if (ctx->cfg->use_gles && ctx->fs_pixel_center) { + if (ctx->cfg->use_gles && ctx->fs_integer_pixel_center) { name_prefix = "(gl_FragCoord - vec4(0.5, 0.5, 0.0, 0.0))"; } else name_prefix = "gl_FragCoord"; @@ -1513,7 +1553,6 @@ iter_declaration(struct tgsi_iterate_context *iter, if (ctx->outputs[j].name == decl->Semantic.Name && ctx->outputs[j].sid == decl->Semantic.Index && ctx->outputs[j].first == decl->Range.First && - ctx->outputs[j].usage_mask == decl->Declaration.UsageMask && ((!decl->Declaration.Array && ctx->outputs[j].array_id == 0) || (ctx->outputs[j].array_id == decl->Array.ArrayID))) return true; @@ -1913,10 +1952,10 @@ iter_property(struct tgsi_iterate_context *iter, ctx->write_all_cbufs = true; break; case TGSI_PROPERTY_FS_COORD_ORIGIN: - ctx->fs_coord_origin = prop->u[0].Data; + ctx->fs_lower_left_origin = prop->u[0].Data ? true : false; break; case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: - ctx->fs_pixel_center = prop->u[0].Data; + ctx->fs_integer_pixel_center = prop->u[0].Data ? true : false; break; case TGSI_PROPERTY_FS_DEPTH_LAYOUT: /* If the host doesn't support this, then we can savely ignore this, @@ -1985,7 +2024,14 @@ iter_property(struct tgsi_iterate_context *iter, } break; case TGSI_PROPERTY_SEPARABLE_PROGRAM: - ctx->separable_program = prop->u[0].Data; + /* GLES is very strict in how separable shaders interfaces should be matched. + * It doesn't allow, for example, inputs without matching outputs. So, we just + * disable separable shaders for GLES. */ + if (!ctx->cfg->use_gles) { + ctx->separable_program = prop->u[0].Data; + ctx->shader_req_bits |= SHADER_REQ_SEPERATE_SHADER_OBJECTS; + ctx->shader_req_bits |= SHADER_REQ_EXPLICIT_ATTRIB_LOCATION; + } break; default: vrend_printf("unhandled property: %x\n", prop->Property.PropertyName); @@ -2100,8 +2146,17 @@ static void emit_alpha_test(const struct dump_ctx *ctx, static void emit_pstipple_pass(struct vrend_glsl_strbufs *glsl_strbufs) { - emit_buf(glsl_strbufs, "stip_temp = texture(pstipple_sampler, vec2(gl_FragCoord.x / 32.0, gl_FragCoord.y / 32.0)).x;\n"); - emit_buf(glsl_strbufs, "if (stip_temp > 0.0) {\n\tdiscard;\n}\n"); + static_assert(VREND_POLYGON_STIPPLE_SIZE == 32, + "According to the spec stipple size must be 32"); + + const int mask = VREND_POLYGON_STIPPLE_SIZE - 1; + + emit_buf(glsl_strbufs, "{\n"); + emit_buff(glsl_strbufs, " int spx = int(gl_FragCoord.x) & %d;\n", mask); + emit_buff(glsl_strbufs, " int spy = int(gl_FragCoord.y) & %d;\n", mask); + emit_buf(glsl_strbufs, " stip_temp = stipple_pattern[spy] & (0x80000000u >> spx);\n"); + emit_buf(glsl_strbufs, " if (stip_temp == 0u) {\n discard;\n }\n"); + emit_buf(glsl_strbufs, "}\n"); glsl_strbufs->required_sysval_uniform_decls |= BIT(UNIFORM_PSTIPPLE_SAMPLER); } @@ -2304,7 +2359,10 @@ static void emit_clip_dist_movs(const struct dump_ctx *ctx, if (ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL) prefix = "gl_out[gl_InvocationID]."; - if (ctx->num_out_clip_dist == 0 && ctx->is_last_vertex_stage) { + + if (ctx->num_out_clip_dist == 0 && + ctx->is_last_vertex_stage && + ctx->num_outputs + 2 <= MAX_VARYING) { emit_buff(glsl_strbufs, "if (clip_plane_enabled) {\n"); for (i = 0; i < 8; i++) { emit_buff(glsl_strbufs, " %sgl_ClipDistance[%d] = dot(%s, clipp[%d]);\n", @@ -2408,7 +2466,12 @@ static void emit_fragment_logicop(const struct dump_ctx *ctx, char src_fb[PIPE_MAX_COLOR_BUFS][64]; double scale[PIPE_MAX_COLOR_BUFS]; int mask[PIPE_MAX_COLOR_BUFS]; - char full_op[PIPE_MAX_COLOR_BUFS][128 + 8]; + + struct vrend_strbuf full_op_buf[PIPE_MAX_COLOR_BUFS]; + for (int i = 0; i < PIPE_MAX_COLOR_BUFS; ++i) { + strbuf_alloc(&full_op_buf[i], 134); + } + for (unsigned i = 0; i < ctx->num_outputs; i++) { mask[i] = (1 << ctx->key->fs.surface_component_bits[i]) - 1; @@ -2446,67 +2509,52 @@ static void emit_fragment_logicop(const struct dump_ctx *ctx, for (unsigned i = 0; i < ctx->num_outputs; i++) { switch (ctx->key->fs.logicop_func) { case PIPE_LOGICOP_CLEAR: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s", "vec4(0)"); + strbuf_fmt(&full_op_buf[i], "%s", "vec4(0)"); break; case PIPE_LOGICOP_NOOP: - full_op[i][0]= 0; + strbuf_fmt(&full_op_buf[i], "%s", ""); break; case PIPE_LOGICOP_SET: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s", "vec4(1)"); + strbuf_fmt(&full_op_buf[i], "%s", "vec4(1)"); break; case PIPE_LOGICOP_COPY: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "fsout_tmp_c%d", i); + strbuf_fmt(&full_op_buf[i], "fsout_tmp_c%d", i); break; case PIPE_LOGICOP_COPY_INVERTED: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~%s", src[i]); + strbuf_fmt(&full_op_buf[i], "~%s", src[i]); break; case PIPE_LOGICOP_INVERT: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~%s", src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~%s", src_fb[i]); break; case PIPE_LOGICOP_AND: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s & %s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "%s & %s", src[i], src_fb[i]); break; case PIPE_LOGICOP_NAND: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~( %s & %s )", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~( %s & %s )", src[i], src_fb[i]); break; case PIPE_LOGICOP_NOR: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~( %s | %s )", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~( %s | %s )", src[i], src_fb[i]); break; case PIPE_LOGICOP_AND_INVERTED: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~%s & %s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~%s & %s", src[i], src_fb[i]); break; case PIPE_LOGICOP_AND_REVERSE: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s & ~%s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "%s & ~%s", src[i], src_fb[i]); break; case PIPE_LOGICOP_XOR: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s ^%s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "%s ^%s", src[i], src_fb[i]); break; case PIPE_LOGICOP_EQUIV: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~( %s ^ %s )", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~( %s ^ %s )", src[i], src_fb[i]); break; case PIPE_LOGICOP_OR_INVERTED: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "~%s | %s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "~%s | %s", src[i], src_fb[i]); break; case PIPE_LOGICOP_OR_REVERSE: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s | ~%s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "%s | ~%s", src[i], src_fb[i]); break; case PIPE_LOGICOP_OR: - snprintf(full_op[i], ARRAY_SIZE(full_op[i]), - "%s | %s", src[i], src_fb[i]); + strbuf_fmt(&full_op_buf[i], "%s | %s", src[i], src_fb[i]); break; } } @@ -2518,10 +2566,10 @@ static void emit_fragment_logicop(const struct dump_ctx *ctx, case PIPE_LOGICOP_COPY: case PIPE_LOGICOP_CLEAR: case PIPE_LOGICOP_SET: - emit_buff(glsl_strbufs, "fsout_c%d = %s;\n", i, full_op[i]); + emit_buff(glsl_strbufs, "fsout_c%d = %s;\n", i, full_op_buf[i].buf); break; default: - emit_buff(glsl_strbufs, "fsout_c%d = vec4((%s) & %d) / %f;\n", i, full_op[i], mask[i], scale[i]); + emit_buff(glsl_strbufs, "fsout_c%d = vec4((%s) & %d) / %f;\n", i, full_op_buf[i].buf, mask[i], scale[i]); } } } @@ -2561,7 +2609,7 @@ static void emit_cbuf_colorspace_convert(const struct dump_ctx *ctx, static void handle_fragment_proc_exit(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *glsl_strbufs) { - if (ctx->key->pstipple_tex) + if (ctx->key->pstipple_enabled) emit_pstipple_pass(glsl_strbufs); if (ctx->key->fs.cbufs_are_a8_bitmask) @@ -2755,8 +2803,6 @@ static void emit_txqs(struct dump_ctx *ctx, static const char *get_tex_inst_ext(const struct tgsi_full_instruction *inst) { switch (inst->Instruction.Opcode) { - case TGSI_OPCODE_LODQ: - return "QueryLOD"; case TGSI_OPCODE_TXP: if (inst->Texture.Texture == TGSI_TEXTURE_CUBE || inst->Texture.Texture == TGSI_TEXTURE_2D_ARRAY || @@ -2792,25 +2838,32 @@ static const char *get_tex_inst_ext(const struct tgsi_full_instruction *inst) } } -static void get_temp(const struct dump_ctx *ctx, - bool indirect_dim, int dim, int reg, - char buf[static 64]) +static void +get_temp(const struct dump_ctx *ctx, + bool indirect_dim, int dim, int reg, + char buf[static 64], bool *require_dummy_value) { struct vrend_temp_range *range = find_temp_range(ctx, reg); - if (indirect_dim) { - snprintf(buf, 64, "temp%d[addr%d + %d]", range->first, dim, reg - range->first); - } else { - if (range->array_id > 0) { - snprintf(buf, 64, "temp%d[%d]", range->first, reg - range->first); + if (range) { + if (indirect_dim) { + snprintf(buf, 64, "temp%d[addr%d + %d]", range->first, dim, reg - range->first); } else { - snprintf(buf, 64, "temp%d", reg); + if (range->array_id > 0) { + snprintf(buf, 64, "temp%d[%d]", range->first, reg - range->first); + } else { + snprintf(buf, 64, "temp%d", reg); + } } + } else { + snprintf(buf, 64, "dummy_value"); + *require_dummy_value = true; } } static bool fill_offset_buffer(const struct dump_ctx *ctx, const struct tgsi_full_instruction *inst, - struct vrend_strbuf *offset_buf) + struct vrend_strbuf *offset_buf, + bool *require_dummy_value) { if (inst->TexOffsets[0].File == TGSI_FILE_IMMEDIATE) { const struct immed *imd = &ctx->imm[inst->TexOffsets[0].Index]; @@ -2842,7 +2895,7 @@ static bool fill_offset_buffer(const struct dump_ctx *ctx, } } else if (inst->TexOffsets[0].File == TGSI_FILE_TEMPORARY) { char temp_buf[64]; - get_temp(ctx, false, 0, inst->TexOffsets[0].Index, temp_buf); + get_temp(ctx, false, 0, inst->TexOffsets[0].Index, temp_buf, require_dummy_value); switch (inst->Texture.Texture) { case TGSI_TEXTURE_1D: case TGSI_TEXTURE_1D_ARRAY: @@ -2923,6 +2976,57 @@ static bool fill_offset_buffer(const struct dump_ctx *ctx, return true; } +static void +emit_lodq(struct dump_ctx *ctx, + const struct tgsi_full_instruction *inst, + const struct source_info *sinfo, + const struct dest_info *dinfo, + const char *srcs[4], + const char *dst, + const char *writemask) +{ + ctx->shader_req_bits |= SHADER_REQ_LODQ; + + set_texture_reqs(ctx, inst, sinfo->sreg_index); + + emit_buff(&ctx->glsl_strbufs, "%s = %s(textureQueryLOD(%s, ", + dst, get_string(dinfo->dstconv), srcs[1]); + + switch (inst->Texture.Texture) { + case TGSI_TEXTURE_1D: + case TGSI_TEXTURE_1D_ARRAY: + case TGSI_TEXTURE_SHADOW1D: + case TGSI_TEXTURE_SHADOW1D_ARRAY: + if (ctx->cfg->use_gles) + emit_buff(&ctx->glsl_strbufs, "vec2(%s.x, 0)", srcs[0]); + else + emit_buff(&ctx->glsl_strbufs, "%s.x", srcs[0]); + break; + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_2D_ARRAY: + case TGSI_TEXTURE_2D_MSAA: + case TGSI_TEXTURE_2D_ARRAY_MSAA: + case TGSI_TEXTURE_RECT: + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_SHADOW2D_ARRAY: + case TGSI_TEXTURE_SHADOWRECT: + emit_buff(&ctx->glsl_strbufs, "%s.xy", srcs[0]); + break; + case TGSI_TEXTURE_3D: + case TGSI_TEXTURE_CUBE: + case TGSI_TEXTURE_SHADOWCUBE: + case TGSI_TEXTURE_SHADOWCUBE_ARRAY: + case TGSI_TEXTURE_CUBE_ARRAY: + emit_buff(&ctx->glsl_strbufs, "%s.xyz", srcs[0]); + break; + default: + emit_buff(&ctx->glsl_strbufs, "%s", srcs[0]); + break; + } + + emit_buff(&ctx->glsl_strbufs, ")%s);\n", writemask); +} + // TODO Consider exposing non-const ctx-> members as args to make *ctx const static void translate_tex(struct dump_ctx *ctx, const struct tgsi_full_instruction *inst, @@ -2933,11 +3037,11 @@ static void translate_tex(struct dump_ctx *ctx, const char *writemask) { enum vrend_type_qualifier txfi = TYPE_CONVERSION_NONE; - unsigned twm = TGSI_WRITEMASK_NONE, gwm = TGSI_WRITEMASK_NONE; + const char *src_swizzle; enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; bool is_shad; - int sampler_index; + int sampler_index = 1; const char *tex_ext; struct vrend_strbuf bias_buf; @@ -2964,30 +3068,25 @@ static void translate_tex(struct dump_ctx *ctx, break; } - sampler_index = 1; - - if (inst->Instruction.Opcode == TGSI_OPCODE_LODQ) - ctx->shader_req_bits |= SHADER_REQ_LODQ; - switch (inst->Texture.Texture) { case TGSI_TEXTURE_1D: case TGSI_TEXTURE_BUFFER: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = TGSI_WRITEMASK_NONE; + src_swizzle = ""; else - twm = TGSI_WRITEMASK_X; + src_swizzle = ".x"; txfi = INT; break; case TGSI_TEXTURE_1D_ARRAY: - twm = TGSI_WRITEMASK_XY; + src_swizzle = ".xy"; txfi = IVEC2; break; case TGSI_TEXTURE_2D: case TGSI_TEXTURE_RECT: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = TGSI_WRITEMASK_NONE; + src_swizzle = ""; else - twm = TGSI_WRITEMASK_XY; + src_swizzle = ".xy"; txfi = IVEC2; break; case TGSI_TEXTURE_SHADOW1D: @@ -2996,24 +3095,24 @@ static void translate_tex(struct dump_ctx *ctx, case TGSI_TEXTURE_SHADOWRECT: case TGSI_TEXTURE_3D: if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) - twm = TGSI_WRITEMASK_NONE; + src_swizzle = ""; else if (inst->Instruction.Opcode == TGSI_OPCODE_TG4) - twm = TGSI_WRITEMASK_XY; + src_swizzle = ".xy"; else - twm = TGSI_WRITEMASK_XYZ; + src_swizzle = ".xyz"; txfi = IVEC3; break; case TGSI_TEXTURE_CUBE: case TGSI_TEXTURE_2D_ARRAY: - twm = TGSI_WRITEMASK_XYZ; + src_swizzle = ".xyz"; txfi = IVEC3; break; case TGSI_TEXTURE_2D_MSAA: - twm = TGSI_WRITEMASK_XY; + src_swizzle = ".xy"; txfi = IVEC2; break; case TGSI_TEXTURE_2D_ARRAY_MSAA: - twm = TGSI_WRITEMASK_XYZ; + src_swizzle = ".xyz"; txfi = IVEC3; break; @@ -3025,57 +3124,33 @@ static void translate_tex(struct dump_ctx *ctx, if (inst->Instruction.Opcode == TGSI_OPCODE_TG4 && inst->Texture.Texture != TGSI_TEXTURE_CUBE_ARRAY && inst->Texture.Texture != TGSI_TEXTURE_SHADOWCUBE_ARRAY) - twm = TGSI_WRITEMASK_XYZ; + src_swizzle = ".xyz"; else - twm = TGSI_WRITEMASK_NONE; + src_swizzle = ""; txfi = TYPE_CONVERSION_NONE; break; } - if (inst->Instruction.Opcode == TGSI_OPCODE_TXD) { - switch (inst->Texture.Texture) { - case TGSI_TEXTURE_1D: - case TGSI_TEXTURE_SHADOW1D: - case TGSI_TEXTURE_1D_ARRAY: - case TGSI_TEXTURE_SHADOW1D_ARRAY: - gwm = TGSI_WRITEMASK_X; - break; - case TGSI_TEXTURE_2D: - case TGSI_TEXTURE_SHADOW2D: - case TGSI_TEXTURE_2D_ARRAY: - case TGSI_TEXTURE_SHADOW2D_ARRAY: - case TGSI_TEXTURE_RECT: - case TGSI_TEXTURE_SHADOWRECT: - gwm = TGSI_WRITEMASK_XY; - break; - case TGSI_TEXTURE_3D: - case TGSI_TEXTURE_CUBE: - case TGSI_TEXTURE_SHADOWCUBE: - case TGSI_TEXTURE_CUBE_ARRAY: - gwm = TGSI_WRITEMASK_XYZ; - break; - default: - gwm = TGSI_WRITEMASK_NONE; - break; - } - } - switch (inst->Instruction.Opcode) { - case TGSI_OPCODE_TXB2: - case TGSI_OPCODE_TXL2: case TGSI_OPCODE_TEX2: sampler_index = 2; - if (inst->Instruction.Opcode != TGSI_OPCODE_TEX2) + if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY) strbuf_appendf(&bias_buf, ", %s.x", srcs[1]); - else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY) - strbuf_appendf(&bias_buf, ", float(%s)", srcs[1]); + break; + case TGSI_OPCODE_TXB2: + case TGSI_OPCODE_TXL2: + sampler_index = 2; + strbuf_appendf(&bias_buf, ", %s.x", srcs[1]); + if (inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY) + strbuf_appendf(&bias_buf, ", %s.y", srcs[1]); break; case TGSI_OPCODE_TXB: case TGSI_OPCODE_TXL: /* On GLES we emulate the 1D array by using a 2D array, for this - * there is no shadow lookup with bias. To avoid that compiling an - * invalid shader results in a crash we ignore the bias value */ - if (!(ctx->cfg->use_gles && + * there is no shadow lookup with bias unless EXT_texture_shadow_lod is used. + * To avoid that compiling an invalid shader results in a crash we ignore + * the bias value */ + if (!(ctx->cfg->use_gles && !ctx->cfg->has_texture_shadow_lod && TGSI_TEXTURE_SHADOW1D_ARRAY == inst->Texture.Texture)) strbuf_appendf(&bias_buf, ", %s.w", srcs[0]); break; @@ -3090,14 +3165,35 @@ static void translate_tex(struct dump_ctx *ctx, strbuf_appendf(&bias_buf, ", int(%s.w)", srcs[0]); break; case TGSI_OPCODE_TXD: - if (ctx->cfg->use_gles && (inst->Texture.Texture == TGSI_TEXTURE_1D || - inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D || - inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY || - inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY)) - strbuf_appendf(&bias_buf, ", vec2(%s%s, 0), vec2(%s%s, 0)", srcs[1], get_wm_string(gwm), srcs[2], get_wm_string(gwm)); - else - strbuf_appendf(&bias_buf, ", %s%s, %s%s", srcs[1], get_wm_string(gwm), srcs[2], get_wm_string(gwm)); sampler_index = 3; + switch (inst->Texture.Texture) { + case TGSI_TEXTURE_1D: + case TGSI_TEXTURE_SHADOW1D: + case TGSI_TEXTURE_1D_ARRAY: + case TGSI_TEXTURE_SHADOW1D_ARRAY: + if (ctx->cfg->use_gles) + strbuf_appendf(&bias_buf, ", vec2(%s.x, 0), vec2(%s.x, 0)", srcs[1], srcs[2]); + else + strbuf_appendf(&bias_buf, ", %s.x, %s.x", srcs[1], srcs[2]); + break; + case TGSI_TEXTURE_2D: + case TGSI_TEXTURE_SHADOW2D: + case TGSI_TEXTURE_2D_ARRAY: + case TGSI_TEXTURE_SHADOW2D_ARRAY: + case TGSI_TEXTURE_RECT: + case TGSI_TEXTURE_SHADOWRECT: + strbuf_appendf(&bias_buf, ", %s.xy, %s.xy", srcs[1], srcs[2]); + break; + case TGSI_TEXTURE_3D: + case TGSI_TEXTURE_CUBE: + case TGSI_TEXTURE_SHADOWCUBE: + case TGSI_TEXTURE_CUBE_ARRAY: + strbuf_appendf(&bias_buf, ", %s.xyz, %s.xyz", srcs[1], srcs[2]); + break; + default: + strbuf_appendf(&bias_buf, ", %s, %s", srcs[1], srcs[2]); + break; + } break; case TGSI_OPCODE_TG4: sampler_index = 2; @@ -3143,6 +3239,19 @@ static void translate_tex(struct dump_ctx *ctx, const char *bias = bias_buf.buf; const char *offset = offset_buf.buf; + // EXT_texture_shadow_lod defines a few more functions handling bias + if (bias && + (inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY || + inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE || + inst->Texture.Texture == TGSI_TEXTURE_SHADOWCUBE_ARRAY)) + ctx->shader_req_bits |= SHADER_REQ_TEXTURE_SHADOW_LOD; + + // EXT_texture_shadow_lod also adds the missing textureOffset for 2DArrayShadow in GLES + if ((bias || offset) && ctx->cfg->use_gles && + (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY || + inst->Texture.Texture == TGSI_TEXTURE_SHADOW2D_ARRAY)) + ctx->shader_req_bits |= SHADER_REQ_TEXTURE_SHADOW_LOD; + if (inst->Texture.NumOffsets == 1) { if (inst->TexOffsets[0].Index >= (int)ARRAY_SIZE(ctx->imm)) { vrend_printf( "Immediate exceeded, max is %lu\n", ARRAY_SIZE(ctx->imm)); @@ -3150,7 +3259,7 @@ static void translate_tex(struct dump_ctx *ctx, goto cleanup; } - if (!fill_offset_buffer(ctx, inst, &offset_buf)) { + if (!fill_offset_buffer(ctx, inst, &offset_buf, &ctx->require_dummy_value)) { set_buf_error(&ctx->glsl_strbufs); goto cleanup; } @@ -3161,13 +3270,14 @@ static void translate_tex(struct dump_ctx *ctx, } } + char buf[255]; + const char *new_srcs[4] = { buf, srcs[1], srcs[2], srcs[3] }; + /* We have to unnormalize the coordinate for all but the texel fetch instruction */ if (inst->Instruction.Opcode != TGSI_OPCODE_TXF && vrend_shader_sampler_views_mask_get(ctx->key->sampler_views_emulated_rect_mask, sinfo->sreg_index)) { - char buf[255]; const char *bias = ""; - const char *new_srcs[4] = { buf, srcs[1], srcs[2], srcs[3] }; /* No LOD for these texture types, but on GLES we emulate RECT by using * a normal 2D texture, so we have to give LOD 0 */ @@ -3212,21 +3322,21 @@ static void translate_tex(struct dump_ctx *ctx, if (inst->Texture.Texture == TGSI_TEXTURE_1D) emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texelFetch%s(%s, ivec2(%s(%s%s), 0)%s%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), - tex_ext, srcs[sampler_index], get_string(txfi), srcs[0], - get_wm_string(twm), bias, offset, + tex_ext, srcs[sampler_index], get_string(txfi), + srcs[0], src_swizzle, bias, offset, dinfo->dst_override_no_wm[0] ? "" : writemask); else if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) { /* the y coordinate must go into the z element and the y must be zero */ emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texelFetch%s(%s, ivec3(%s(%s%s), 0).xzy%s%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), - tex_ext, srcs[sampler_index], get_string(txfi), srcs[0], - get_wm_string(twm), bias, offset, + tex_ext, srcs[sampler_index], get_string(txfi), + srcs[0], src_swizzle, bias, offset, dinfo->dst_override_no_wm[0] ? "" : writemask); } else { emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texelFetch%s(%s, %s(%s%s), 0%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), - tex_ext, srcs[sampler_index], get_string(txfi), srcs[0], - get_wm_string(twm), offset, + tex_ext, srcs[sampler_index], get_string(txfi), + srcs[0], src_swizzle, offset, dinfo->dst_override_no_wm[0] ? "" : writemask); } } else { @@ -3242,8 +3352,8 @@ static void translate_tex(struct dump_ctx *ctx, */ emit_buff(&ctx->glsl_strbufs, "{\n vec4 val = %s(texelFetch%s(%s, %s(%s%s)%s%s));\n", get_string(dtypeprefix), - tex_ext, srcs[sampler_index], get_string(txfi), srcs[0], - get_wm_string(twm), bias, offset); + tex_ext, srcs[sampler_index], get_string(txfi), + srcs[0], src_swizzle, bias, offset); if (vrend_shader_sampler_views_mask_get(ctx->key->sampler_views_lower_swizzle_mask, sinfo->sreg_index)) { int16_t packed_swizzles = ctx->key->tex_swizzle[sinfo->sreg_index]; @@ -3256,7 +3366,19 @@ static void translate_tex(struct dump_ctx *ctx, int swz = (packed_swizzles >> (i * 3)) & 7; switch (swz) { case PIPE_SWIZZLE_ZERO : emit_buf(&ctx->glsl_strbufs, "0.0"); break; - case PIPE_SWIZZLE_ONE : emit_buf(&ctx->glsl_strbufs, "1.0"); break; + case PIPE_SWIZZLE_ONE : + switch (dtypeprefix) { + case UINT_BITS_TO_FLOAT: + emit_buf(&ctx->glsl_strbufs, "uintBitsToFloat(1u)"); + break; + case INT_BITS_TO_FLOAT: + emit_buf(&ctx->glsl_strbufs, "intBitsToFloat(1)"); + break; + default: + emit_buf(&ctx->glsl_strbufs, "1.0"); + break; + } + break; default: emit_buff(&ctx->glsl_strbufs, "val%s", get_swizzle_string(swz)); } @@ -3289,21 +3411,21 @@ static void translate_tex(struct dump_ctx *ctx, emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(vec4(vec4(texture%s(%s, vec4(%s%s.xzw, 0).xwyz %s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], - srcs[0], get_wm_string(twm), offset, bias, cname, - src->Register.Index, cname, - src->Register.Index, writemask); + srcs[0], src_swizzle, offset, bias, + cname, src->Register.Index, + cname, src->Register.Index, writemask); else emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(vec4(vec4(texture%s(%s, vec3(%s%s.xz, 0).xzy %s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], - srcs[0], get_wm_string(twm), offset, bias, cname, - src->Register.Index, cname, - src->Register.Index, writemask); + srcs[0], src_swizzle, offset, bias, + cname, src->Register.Index, + cname, src->Register.Index, writemask); } else if (inst->Texture.Texture == TGSI_TEXTURE_SHADOW1D_ARRAY) { emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(vec4(vec4(texture%s(%s, vec4(%s%s, 0).xwyz %s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], - get_wm_string(twm), offset, bias, cname, + src_swizzle, offset, bias, cname, src->Register.Index, cname, src->Register.Index, writemask); } @@ -3311,9 +3433,9 @@ static void translate_tex(struct dump_ctx *ctx, emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(vec4(vec4(texture%s(%s, %s%s%s%s)) * %sshadmask%d + %sshadadd%d)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], srcs[0], - get_wm_string(twm), offset, bias, cname, - src->Register.Index, cname, - src->Register.Index, writemask); + src_swizzle, offset, bias, + cname, src->Register.Index, + cname, src->Register.Index, writemask); } else { /* OpenGL ES do not support 1D texture * so we use a 2D texture with a parameter set to 0.5 @@ -3332,7 +3454,7 @@ static void translate_tex(struct dump_ctx *ctx, emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texture%s(%s, vec2(%s%s, 0.5) %s%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], - srcs[0], get_wm_string(twm), offset, bias, + srcs[0], src_swizzle, offset, bias, dinfo->dst_override_no_wm[0] ? "" : writemask); } else if (inst->Texture.Texture == TGSI_TEXTURE_1D_ARRAY) { if (inst->Instruction.Opcode == TGSI_OPCODE_TXP) @@ -3345,13 +3467,13 @@ static void translate_tex(struct dump_ctx *ctx, emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texture%s(%s, vec3(%s%s, 0).xzy %s%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), tex_ext, srcs[sampler_index], - srcs[0], get_wm_string(twm), offset, bias, + srcs[0], src_swizzle, offset, bias, dinfo->dst_override_no_wm[0] ? "" : writemask); } } else { emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(texture%s(%s, %s%s%s%s)%s));\n", dst, get_string(dinfo->dstconv), get_string(dtypeprefix), - tex_ext, srcs[sampler_index], srcs[0], get_wm_string(twm), + tex_ext, srcs[sampler_index], srcs[0], src_swizzle, offset, bias, dinfo->dst_override_no_wm[0] ? "" : writemask); } } @@ -3427,7 +3549,6 @@ void load_clipdist_fs(const struct dump_ctx *ctx, struct vrend_strbuf *result, const struct tgsi_full_src_register *src, int input_idx, - bool gl_in, const char *stypeprefix, int offset) { @@ -3450,10 +3571,7 @@ void load_clipdist_fs(const struct dump_ctx *ctx, else snprintf(clip_indirect, 32, "%d + %d", src->Register.Index - offset, base_idx); - if (gl_in) - strbuf_fmt(result, "%s(clip_dist_temp[%s].%s)", stypeprefix, clip_indirect, swz); - else - strbuf_fmt(result, "%s(clip_dist_temp[%s].%s)", stypeprefix, clip_indirect, swz); + strbuf_fmt(result, "%s(clip_dist_temp[%s].%s)", stypeprefix, clip_indirect, swz); } @@ -3499,6 +3617,20 @@ static bool is_integer_memory(const struct dump_ctx *ctx, enum tgsi_file_type fi return false; } +static void set_image_qualifier(struct vrend_shader_image images[], + uint32_t image_used_mask, + const struct tgsi_full_instruction *inst, + uint32_t reg_index, bool indirect) +{ + if (inst->Memory.Qualifier == TGSI_MEMORY_COHERENT) { + if (indirect) { + while (image_used_mask) + images[u_bit_scan(&image_used_mask)].coherent = true; + } else + images[reg_index].coherent = true; + } +} + static void set_memory_qualifier(uint8_t ssbo_memory_qualifier[], uint32_t ssbo_used_mask, const struct tgsi_full_instruction *inst, @@ -3529,14 +3661,24 @@ static void translate_store(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *glsl_strbufs, uint8_t ssbo_memory_qualifier[], + struct vrend_shader_image images[], const struct tgsi_full_instruction *inst, struct source_info *sinfo, const char *srcs[4], + const struct dest_info *dinfo, const char *dst) { const struct tgsi_full_dst_register *dst_reg = &inst->Dst[0]; + assert(dinfo->dest_index >= 0); if (dst_reg->Register.File == TGSI_FILE_IMAGE) { + + /* bail out if we want to write to a non-existing image */ + if (!((1 << dinfo->dest_index) & ctx->images_used_mask)) + return; + + set_image_qualifier(images, ctx->images_used_mask, inst, inst->Src[0].Register.Index, inst->Src[0].Register.Indirect); + bool is_ms = false; enum vrend_type_qualifier coord_prefix = get_coord_prefix(ctx->images[dst_reg->Register.Index].decl.Resource, &is_ms, ctx->cfg->use_gles); enum tgsi_return_type itype; @@ -3628,8 +3770,7 @@ static void emit_load_mem(struct vrend_glsl_strbufs *glsl_strbufs, const char *d } } - -static void +static bool translate_load(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *glsl_strbufs, uint8_t ssbo_memory_qualifier[], @@ -3643,6 +3784,15 @@ translate_load(const struct dump_ctx *ctx, { const struct tgsi_full_src_register *src = &inst->Src[0]; if (src->Register.File == TGSI_FILE_IMAGE) { + + /* Bail out if we want to load from an image that is not actually used */ + assert(sinfo->sreg_index >= 0); + if (!((1 << sinfo->sreg_index) & ctx->images_used_mask)) + return false; + + set_image_qualifier(images, ctx->images_used_mask, inst, inst->Src[0].Register.Index, inst->Src[0].Register.Indirect); + + bool is_ms = false; enum vrend_type_qualifier coord_prefix = get_coord_prefix(ctx->images[sinfo->sreg_index].decl.Resource, &is_ms, ctx->cfg->use_gles); enum vrend_type_qualifier dtypeprefix = TYPE_CONVERSION_NONE; @@ -3708,11 +3858,13 @@ translate_load(const struct dump_ctx *ctx, set_memory_qualifier(ssbo_memory_qualifier, ctx->ssbo_used_mask, inst, inst->Src[0].Register.Index, inst->Src[0].Register.Indirect); - strcpy(mydst, dst); - char *wmp = strchr(mydst, '.'); + const char *d = dst; + char *md = mydst; + unsigned i = 0; + while ((i < sizeof(mydst) - 1) && *d && *d != '.') + *md++ = *d++; + *md = 0; - if (wmp) - wmp[0] = 0; emit_buff(glsl_strbufs, "ssbo_addr_temp = uint(floatBitsToUint(%s)) >> 2;\n", srcs[1]); atomic_op[0] = atomic_src[0] = '\0'; @@ -3748,6 +3900,7 @@ translate_load(const struct dump_ctx *ctx, } else if (src->Register.File == TGSI_FILE_HW_ATOMIC) { emit_buff(glsl_strbufs, "%s = uintBitsToFloat(atomicCounter(%s));\n", dst, srcs[0]); } + return true; } static const char *get_atomic_opname(int tgsi_opcode, bool *is_cas) @@ -4094,7 +4247,8 @@ get_destination_info(struct dump_ctx *ctx, struct vrend_shader_io *output = &ctx->outputs[j]; if (inst->Instruction.Precise) { - if (!output->invariant && output->name != TGSI_SEMANTIC_CLIPVERTEX) { + if (!output->invariant && output->name != TGSI_SEMANTIC_CLIPVERTEX && + ctx->cfg->has_gpu_shader5) { output->precise = true; ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; } @@ -4186,14 +4340,15 @@ get_destination_info(struct dump_ctx *ctx, } else if (dst_reg->Register.File == TGSI_FILE_TEMPORARY) { char temp_buf[64]; - get_temp(ctx, dst_reg->Register.Indirect, 0, dst_reg->Register.Index, temp_buf); - struct vrend_temp_range *range = find_temp_range(ctx, dst_reg->Register.Index); - if (!range) - return false; + get_temp(ctx, dst_reg->Register.Indirect, 0, dst_reg->Register.Index, + temp_buf, &ctx->require_dummy_value); strbuf_fmt(&dst_bufs[i], "%s%s", temp_buf, writemask); if (inst->Instruction.Precise) { - range->precise_result |= true; - ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; + struct vrend_temp_range *range = find_temp_range(ctx, dst_reg->Register.Index); + if (range && ctx->cfg->has_gpu_shader5) { + range->precise_result = true; + ctx->shader_req_bits |= SHADER_REQ_GPU_SHADER5; + } } } else if (dst_reg->Register.File == TGSI_FILE_IMAGE) { @@ -4207,6 +4362,7 @@ get_destination_info(struct dump_ctx *ctx, strbuf_fmt(&dst_bufs[i], "%simg%d[%d]", cname, basearrayidx, dst_reg->Register.Index - basearrayidx); } else strbuf_fmt(&dst_bufs[i], "%simg%d", cname, dst_reg->Register.Index); + dinfo->dest_index = dst_reg->Register.Index; } else if (dst_reg->Register.File == TGSI_FILE_BUFFER) { const char *cname = tgsi_proc_to_prefix(ctx->prog_type); if (ctx->info.indirect_files & (1 << TGSI_FILE_BUFFER)) { @@ -4219,6 +4375,7 @@ get_destination_info(struct dump_ctx *ctx, strbuf_fmt(&dst_bufs[i], "%sssboarr%s[%d].%sssbocontents%d", cname, atomic_str, dst_reg->Register.Index - base, cname, base); } else strbuf_fmt(&dst_bufs[i], "%sssbocontents%d", cname, dst_reg->Register.Index); + dinfo->dest_index = dst_reg->Register.Index; } else if (dst_reg->Register.File == TGSI_FILE_MEMORY) { strbuf_fmt(&dst_bufs[i], "values"); } else if (dst_reg->Register.File == TGSI_FILE_ADDRESS) { @@ -4288,10 +4445,16 @@ static void get_source_info_generic(const struct dump_ctx *ctx, enum io_decl_type decl_type = decl_plain; - if (io->first != io->last && prefer_generic_io_block(ctx, iot)) { - const char *stage_prefix = iot == io_in ? get_stage_input_name_prefix(ctx, ctx->prog_type) : - get_stage_output_name_prefix(ctx->prog_type); - get_blockvarname(outvarname, stage_prefix, io, arrayname); + if ((io->first != io->last || io->overlapping_array) && + prefer_generic_io_block(ctx, iot)) { + + const struct vrend_shader_io *array = io->overlapping_array ? + io->overlapping_array : io; + + const char *stage_prefix = iot == io_in ? + get_stage_input_name_prefix(ctx, ctx->prog_type) : + get_stage_output_name_prefix(ctx->prog_type); + get_blockvarname(outvarname, stage_prefix, array, arrayname); arrayname = outvarname; decl_type = decl_block; } @@ -4462,7 +4625,7 @@ get_source_info(struct dump_ctx *ctx, strbuf_fmt(src_buf, "%s(%s ? 1.0 : -1.0)", get_string(stypeprefix), input->glsl_name); else if (input->name == TGSI_SEMANTIC_CLIPDIST) { if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT) - load_clipdist_fs(ctx, src_buf, src, j, false, get_string(stypeprefix), input->first); + load_clipdist_fs(ctx, src_buf, src, j, get_string(stypeprefix), input->first); else create_swizzled_clipdist(ctx, src_buf, src, j, false, get_string(stypeprefix), prefix, arrayname, input->first); } else if (input->name == TGSI_SEMANTIC_TESSOUTER || @@ -4484,13 +4647,14 @@ get_source_info(struct dump_ctx *ctx, if (inst->Instruction.Opcode == TGSI_OPCODE_INTERP_SAMPLE && i == 1) { strbuf_fmt(src_buf, "floatBitsToInt(%s%s%s%s)", prefix, input->glsl_name, arrayname, swizzle); } else if (input->name == TGSI_SEMANTIC_GENERIC) { - struct vrend_shader_io *io = ctx->generic_ios.input_range.used ? &ctx->generic_ios.input_range.io : &ctx->inputs[j]; - get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf); + get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, + &ctx->inputs[j], arrayname, swizzle, src_buf); } else if (input->name == TGSI_SEMANTIC_TEXCOORD) { - get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, &ctx->inputs[j], arrayname, swizzle, src_buf); + get_source_info_generic(ctx, io_in, srcstypeprefix, prefix, src, + &ctx->inputs[j], arrayname, swizzle, src_buf); } else if (input->name == TGSI_SEMANTIC_PATCH) { - struct vrend_shader_io *io = ctx->patch_ios.input_range.used ? &ctx->patch_ios.input_range.io : &ctx->inputs[j]; - get_source_info_patch(srcstypeprefix, prefix, src, io, arrayname, swizzle, src_buf); + get_source_info_patch(srcstypeprefix, prefix, src, + &ctx->inputs[j], arrayname, swizzle, src_buf); } else if (input->name == TGSI_SEMANTIC_POSITION && ctx->prog_type == TGSI_PROCESSOR_VERTEX && input->first != input->last) { if (src->Register.Indirect) @@ -4551,7 +4715,8 @@ get_source_info(struct dump_ctx *ctx, stypeprefix = FLOAT_BITS_TO_INT; } char temp_buf[64]; - get_temp(ctx, src->Register.Indirect, src->Indirect.Index, src->Register.Index, temp_buf); + get_temp(ctx, src->Register.Indirect, src->Indirect.Index, src->Register.Index, + temp_buf, &ctx->require_dummy_value); strbuf_fmt(src_buf, "%s%c%s%s%s%c", get_string(stypeprefix), stprefix ? '(' : ' ', prefix, temp_buf, swizzle, stprefix ? ')' : ' '); } else if (src->Register.File == TGSI_FILE_CONSTANT) { const char *cname = tgsi_proc_to_prefix(ctx->prog_type); @@ -4678,7 +4843,9 @@ get_source_info(struct dump_ctx *ctx, } /* build up a vec4 of immediates */ - strbuf_fmt(src_buf, "%s(%s%s(", get_string(imm_stypeprefix), prefix, get_string(vtype)); + strbuf_fmt(src_buf, "%s%s(%s(", prefix, + get_string(imm_stypeprefix), get_string(vtype)); + for (uint32_t j = 0; j < 4; j++) { if (j == 0) idx = src->Register.SwizzleX; @@ -4859,180 +5026,89 @@ static bool rewrite_1d_image_coordinate(struct vrend_strbuf *src, const struct t } return true; } -/* We have indirect IO access, but the guest actually send separate values, so - * now we have to emulate an array. - */ -static -void rewrite_io_ranged(struct dump_ctx *ctx) -{ - if ((ctx->info.indirect_files & (1 << TGSI_FILE_INPUT)) || - ctx->key->input.num_indirect_generic || - ctx->key->input.num_indirect_patch) { - for (uint i = 0; i < ctx->num_inputs; ++i) { - if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) { - ctx->inputs[i].glsl_predefined_no_emit = true; - if (ctx->inputs[i].sid < ctx->patch_ios.input_range.io.sid || ctx->patch_ios.input_range.used == false) { - ctx->patch_ios.input_range.io.sid = ctx->inputs[i].sid; - ctx->patch_ios.input_range.io.first = i; - ctx->patch_ios.input_range.io.name = TGSI_SEMANTIC_PATCH; - ctx->patch_ios.input_range.used = true; - if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) - ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; - } - if (i > ctx->patch_ios.input_range.io.last) - ctx->patch_ios.input_range.io.last = i; - } - - if (ctx->inputs[i].name == TGSI_SEMANTIC_GENERIC) { - ctx->inputs[i].glsl_predefined_no_emit = true; - if (ctx->inputs[i].sid < ctx->generic_ios.input_range.io.sid || ctx->generic_ios.input_range.used == false) { - ctx->generic_ios.input_range.io.sid = ctx->inputs[i].sid; - ctx->generic_ios.input_range.io.first = i; - ctx->generic_ios.input_range.io.name = TGSI_SEMANTIC_GENERIC; - ctx->generic_ios.input_range.used = true; - if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) - ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; - } - if (i > ctx->generic_ios.input_range.io.last) - ctx->generic_ios.input_range.io.last = i; - } +/* We have indirect IO access, but the guest actually send separate values, so + * now we have to emulate arrays by putting IO values into arrays according + * to semantic. Only join elements that are consecutive. */ +static int +make_array_from_semantic(struct vrend_shader_io *io, int start_index, + int num_entries, enum tgsi_semantic semantic) +{ + struct vrend_shader_io *io_out_range = &io[start_index]; + + int last_sid = io_out_range->sid; + for (int i = start_index + 1; i < num_entries; ++i) { + if (io[i].name == semantic && (io[i].sid - last_sid == 1)) { + io[i].glsl_predefined_no_emit = true; + last_sid = io[i].sid; + io[i].array_offset = io[i].sid - io_out_range->sid; + io_out_range->last = io_out_range->first + io[i].array_offset; + io[i].overlapping_array = io_out_range; + } else { + break; } + } + return io_out_range->last + 1; +} - if (ctx->key->input.num_indirect_generic > 0) - ctx->generic_ios.input_range.io.last = ctx->generic_ios.input_range.io.first + - ctx->key->input.num_indirect_generic - 1; +static bool +collapse_vars_to_arrays(struct vrend_shader_io *io, + int num_entries, + enum tgsi_semantic semantic) +{ + + bool retval = 0; + int start_index = 0; + while (start_index < num_entries) { + if (io[start_index].name == semantic && !io[start_index].glsl_predefined_no_emit) { + int new_start_index = make_array_from_semantic(io, start_index, num_entries, semantic); + retval |= io[start_index].first != io[start_index].last; + start_index = new_start_index; + } else { + ++start_index; + } + } - if (ctx->key->input.num_indirect_patch > 0) - ctx->patch_ios.input_range.io.last = ctx->patch_ios.input_range.io.first + - ctx->key->input.num_indirect_patch - 1; + io->num_components = 4; + io->usage_mask = 0xf; + return retval; +} - snprintf(ctx->patch_ios.input_range.io.glsl_name, 64, "%s_p%d", - get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->patch_ios.input_range.io.sid); - snprintf(ctx->generic_ios.input_range.io.glsl_name, 64, "%s_g%d", - get_stage_input_name_prefix(ctx, ctx->prog_type), ctx->generic_ios.input_range.io.sid); +static void +rewrite_io_ranged(struct dump_ctx *ctx) +{ + if ((ctx->info.indirect_files & (1 << TGSI_FILE_INPUT)) || + ctx->key->require_input_arrays) { - ctx->generic_ios.input_range.io.num_components = 4; - ctx->generic_ios.input_range.io.usage_mask = 0xf; + bool generic_array = collapse_vars_to_arrays(ctx->inputs, ctx->num_inputs, + TGSI_SEMANTIC_GENERIC); + bool patch_array = collapse_vars_to_arrays(ctx->inputs, ctx->num_inputs, + TGSI_SEMANTIC_PATCH); - ctx->patch_ios.input_range.io.num_components = 4; - ctx->patch_ios.input_range.io.usage_mask = 0xf; + ctx->has_input_arrays = generic_array || patch_array; if (prefer_generic_io_block(ctx, io_in)) - ctx->glsl_ver_required = require_glsl_ver(ctx, 150); + ctx->glsl_ver_required = require_glsl_ver(ctx, 150); } if ((ctx->info.indirect_files & (1 << TGSI_FILE_OUTPUT)) || - ctx->key->output.num_indirect_generic || - ctx->key->output.num_indirect_patch) { + ctx->key->require_output_arrays) { - for (uint i = 0; i < ctx->num_outputs; ++i) { - if (ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) { - ctx->outputs[i].glsl_predefined_no_emit = true; - if (ctx->outputs[i].sid < ctx->patch_ios.output_range.io.sid || ctx->patch_ios.output_range.used == false) { - ctx->patch_ios.output_range.io.sid = ctx->outputs[i].sid; - ctx->patch_ios.output_range.io.first = i; - ctx->patch_ios.output_range.io.name = TGSI_SEMANTIC_PATCH; - ctx->patch_ios.output_range.used = true; - if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) - ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; - } - if (i > ctx->patch_ios.output_range.io.last) { - ctx->patch_ios.output_range.io.last = i; - } - } + bool generic_array = collapse_vars_to_arrays(ctx->outputs, ctx->num_outputs, + TGSI_SEMANTIC_GENERIC); + bool patch_array = collapse_vars_to_arrays(ctx->outputs, ctx->num_outputs, + TGSI_SEMANTIC_PATCH); - if (ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC) { - ctx->outputs[i].glsl_predefined_no_emit = true; - if (ctx->outputs[i].sid < ctx->generic_ios.output_range.io.sid || ctx->generic_ios.output_range.used == false) { - ctx->generic_ios.output_range.io.sid = ctx->outputs[i].sid; - ctx->generic_ios.output_range.io.first = i; - ctx->generic_ios.output_range.io.name = TGSI_SEMANTIC_GENERIC; - ctx->generic_ios.output_range.used = true; - if (ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) - ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; - } - if (i > ctx->generic_ios.output_range.io.last) { - ctx->generic_ios.output_range.io.last = i; - } - } - } - - if (ctx->key->output.num_indirect_generic > 0) - ctx->generic_ios.output_range.io.last = ctx->generic_ios.output_range.io.first + - ctx->key->output.num_indirect_generic - 1; - - if (ctx->key->output.num_indirect_patch > 0) - ctx->patch_ios.output_range.io.last = ctx->patch_ios.output_range.io.first + - ctx->key->output.num_indirect_patch - 1; - - snprintf(ctx->patch_ios.output_range.io.glsl_name, 64, "%s_p%d", - get_stage_output_name_prefix(ctx->prog_type), ctx->patch_ios.output_range.io.sid); - snprintf(ctx->generic_ios.output_range.io.glsl_name, 64, "%s_g%d", - get_stage_output_name_prefix(ctx->prog_type), ctx->generic_ios.output_range.io.sid); - - ctx->generic_ios.output_range.io.num_components = 4; - ctx->generic_ios.output_range.io.usage_mask = 0xf; - - ctx->patch_ios.output_range.io.num_components = 4; - ctx->patch_ios.output_range.io.usage_mask = 0xf; + ctx->has_output_arrays = generic_array || patch_array; if (prefer_generic_io_block(ctx, io_out)) - ctx->glsl_ver_required = require_glsl_ver(ctx, 150); - } -} - - -static void rename_variables(unsigned nio, struct vrend_shader_io *io, - const char *name_prefix, unsigned coord_replace) -{ - /* Rename the generic and patch variables after applying all identifications */ - for (unsigned i = 0; i < nio; ++i) { - if ((io[i].name != TGSI_SEMANTIC_GENERIC && - io[i].name != TGSI_SEMANTIC_PATCH) || - (coord_replace & (1 << io[i].sid))) - continue; - char io_type = io[i].name == TGSI_SEMANTIC_GENERIC ? 'g' : 'p'; - snprintf(io[i].glsl_name, 64, "%s_%c%d", name_prefix, io_type, io[i].sid); - } -} - -static -void rewrite_components(unsigned nio, struct vrend_shader_io *io, - const char *name_prefix, unsigned coord_replace, - bool no_input_arrays) -{ - if (!nio) - return; - - for (unsigned i = 0; i < nio - 1; ++i) { - if ((io[i].name != TGSI_SEMANTIC_GENERIC && - io[i].name != TGSI_SEMANTIC_PATCH) || - io[i].glsl_predefined_no_emit) - continue; - - for (unsigned j = i + 1; j < nio; ++j) { - if ((io[j].name != TGSI_SEMANTIC_GENERIC && - io[j].name != TGSI_SEMANTIC_PATCH) || - io[j].glsl_predefined_no_emit) - continue; - if (io[i].first == io[j].first) - io[j].glsl_predefined_no_emit = true; - } + ctx->glsl_ver_required = require_glsl_ver(ctx, 150); } - for (unsigned i = 0; i < nio; ++i) { - if ((io[i].name != TGSI_SEMANTIC_GENERIC && - io[i].name != TGSI_SEMANTIC_PATCH) || - !no_input_arrays) - continue; - - io[i].usage_mask = 0xf; - io[i].num_components = 4; - io[i].override_no_wm = false; - } + if ((ctx->has_output_arrays || ctx->has_input_arrays) + && ctx->cfg->has_arrays_of_arrays && !ctx->cfg->use_gles) + ctx->shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; - rename_variables(nio, io, name_prefix, coord_replace); } static @@ -5135,14 +5211,112 @@ static void handle_io_arrays(struct dump_ctx *ctx) /* The guest didn't send real arrays, do we might have to add a big array * for all generic and another for patch inputs */ rewrite_io_ranged(ctx); - rewrite_components(ctx->num_inputs, ctx->inputs, - get_stage_input_name_prefix(ctx, ctx->prog_type), - ctx->key->fs.coord_replace, true); - rewrite_components(ctx->num_outputs, ctx->outputs, - get_stage_output_name_prefix(ctx->prog_type), 0, true); } } +static int +compare_shader_io(const void *vlhs, const void *vrhs) +{ + struct vrend_shader_io *lhs = (struct vrend_shader_io *)vlhs; + struct vrend_shader_io *rhs = (struct vrend_shader_io *)vrhs; + + if (lhs->name < rhs->name) + return -1; + if (lhs->name > rhs->name) + return 1; + return lhs->sid - rhs->sid; +} + +static void +add_missing_semantic_inputs(struct vrend_shader_io *inputs, int *num_inputs, + int *next_location, uint64_t sids_missing, + const char *prefix, char *type_prefix, + enum tgsi_semantic name, + const struct vrend_shader_key *key) +{ + + while (sids_missing) { + int sid = u_bit_scan64(&sids_missing); + struct vrend_shader_io *io = &inputs[*num_inputs]; + io->sid = sid; + io->last = io->first = *next_location; + io->name = name; + io->type = VEC_FLOAT; + uint32_t sids_added = 1 << sid; + + + for (uint32_t j = 0; j < key->in_arrays.num_arrays; j++) { + const struct vrend_shader_io_array *array = &key->in_arrays.layout[j]; + if (array->name == name && + array->sid <= sid && + array->sid + array->size >= sid) { + io->last = io->first + array->size; + io->sid = array->sid; + sids_added = ((1u << array->size) - 1) << sid; + break; + } + } + + (*next_location) += io->last - io->first + 1; + + sids_missing &= ~sids_added; + + snprintf(io->glsl_name, 128, "%s%s%d", prefix, type_prefix, sid); + (*num_inputs)++; + } +} + +static int +add_missing_inputs(const struct dump_ctx *ctx, struct vrend_shader_io *inputs, + int num_inputs) +{ + uint64_t generics_declared = 0; + uint64_t patches_declared = 0; + uint8_t texcoord_declared = 0; + + int next_location = 0; + for (int i = 0; i < num_inputs; ++i) { + int offset = 0; + for (int k = inputs[i].first; k <= inputs[i].last; ++k, ++offset) { + int sid = inputs[i].sid + offset; + switch (inputs[i].name) { + case TGSI_SEMANTIC_GENERIC: + generics_declared |= 1ull << sid; + break; + case TGSI_SEMANTIC_PATCH: + patches_declared |= 1ull << sid; + break; + case TGSI_SEMANTIC_TEXCOORD: + texcoord_declared |= 1ull << sid; + break; + default: + ; + } + } + if (next_location < inputs[i].last) + next_location = inputs[i].last; + } + ++next_location; + + uint64_t generics_missing = ctx->key->in_generic_expected_mask & ~generics_declared; + uint64_t patches_missing = ctx->key->in_patch_expected_mask & ~patches_declared; + uint64_t texcoord_missing = ctx->key->in_texcoord_expected_mask & ~texcoord_declared; + + const char *prefix = get_stage_input_name_prefix(ctx, ctx->prog_type); + add_missing_semantic_inputs(inputs, &num_inputs, &next_location, + generics_missing, prefix, "_g", + TGSI_SEMANTIC_GENERIC, ctx->key); + add_missing_semantic_inputs(inputs, &num_inputs, &next_location, + texcoord_missing, prefix, "_t", + TGSI_SEMANTIC_TEXCOORD, ctx->key); + add_missing_semantic_inputs(inputs, &num_inputs, &next_location, + patches_missing, "patch", "", + TGSI_SEMANTIC_PATCH, ctx->key); + + qsort(inputs, num_inputs, sizeof(struct vrend_shader_io), + compare_shader_io); + return num_inputs; +} static boolean iter_instruction(struct tgsi_iterate_context *iter, @@ -5164,6 +5338,8 @@ iter_instruction(struct tgsi_iterate_context *iter, ctx->prog_type = iter->processor.Processor; if (instno == 0) { + if (ctx->prog_type != TGSI_PROCESSOR_VERTEX) + ctx->num_inputs = add_missing_inputs(ctx, ctx->inputs, ctx->num_inputs); handle_io_arrays(ctx); /* Vertex shader inputs are not send as arrays, but the access may still be @@ -5361,7 +5537,8 @@ iter_instruction(struct tgsi_iterate_context *iter, emit_arit_op2("+"); break; case TGSI_OPCODE_UADD: - emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(ivec4((uvec4(%s) + uvec4(%s))))%s);\n", dsts[0], get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); + emit_buff(&ctx->glsl_strbufs, "%s = %s(%s(uvec4(%s) + uvec4(%s))%s);\n", dsts[0], + get_string(dinfo.dstconv), get_string(dinfo.dtypeprefix), srcs[0], srcs[1], writemask); break; case TGSI_OPCODE_SUB: emit_arit_op2("-"); @@ -5422,9 +5599,11 @@ iter_instruction(struct tgsi_iterate_context *iter, case TGSI_OPCODE_TXF: case TGSI_OPCODE_TG4: case TGSI_OPCODE_TXP: - case TGSI_OPCODE_LODQ: translate_tex(ctx, inst, &sinfo, &dinfo, srcs, dsts[0], writemask); break; + case TGSI_OPCODE_LODQ: + emit_lodq(ctx, inst, &sinfo, &dinfo, srcs, dsts[0], writemask); + break; case TGSI_OPCODE_TXQ: emit_txq(ctx, inst, sinfo.sreg_index, srcs, dsts[0], writemask); break; @@ -5483,6 +5662,12 @@ iter_instruction(struct tgsi_iterate_context *iter, case TGSI_OPCODE_SLT: emit_compare("lessThan"); break; + case TGSI_OPCODE_SLE: + emit_compare("lessThanEqual"); + break; + case TGSI_OPCODE_SGT: + emit_compare("greaterThan"); + break; case TGSI_OPCODE_ISLT: case TGSI_OPCODE_USLT: case TGSI_OPCODE_FSLT: @@ -5693,8 +5878,10 @@ iter_instruction(struct tgsi_iterate_context *iter, return false; srcs[1] = ctx->src_bufs[1].buf; } - translate_store(ctx, &ctx->glsl_strbufs, ctx->ssbo_memory_qualifier, - inst, &sinfo, srcs, dsts[0]); + /* Don't try to write to dest with a negative index. */ + if (dinfo.dest_index >= 0) + translate_store(ctx, &ctx->glsl_strbufs, ctx->ssbo_memory_qualifier, ctx->images, + inst, &sinfo, srcs, &dinfo, dsts[0]); break; case TGSI_OPCODE_LOAD: if (ctx->cfg->use_gles) { @@ -5702,8 +5889,12 @@ iter_instruction(struct tgsi_iterate_context *iter, return false; srcs[1] = ctx->src_bufs[1].buf; } - translate_load(ctx, &ctx->glsl_strbufs, ctx->ssbo_memory_qualifier, ctx->images, - inst, &sinfo, &dinfo, srcs, dsts[0], writemask); + /* Replace an obvious out-of-bounds load with loading zero. */ + if (sinfo.sreg_index < 0 || + !translate_load(ctx, &ctx->glsl_strbufs, ctx->ssbo_memory_qualifier, ctx->images, + inst, &sinfo, &dinfo, srcs, dsts[0], writemask)) { + emit_buff(&ctx->glsl_strbufs, "%s = vec4(0.0, 0.0, 0.0, 0.0)%s;\n", dsts[0], writemask); + } break; case TGSI_OPCODE_ATOMUADD: case TGSI_OPCODE_ATOMXCHG: @@ -5807,6 +5998,9 @@ static void emit_header(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *g if (ctx->shader_req_bits & SHADER_REQ_NV_IMAGE_FORMATS) emit_ext(glsl_strbufs, "NV_image_formats", "require"); + if (ctx->shader_req_bits & SHADER_REQ_SEPERATE_SHADER_OBJECTS) + emit_ext(glsl_strbufs, "EXT_separate_shader_objects", "require"); + if ((ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL || ctx->prog_type == TGSI_PROCESSOR_TESS_EVAL)) { if (ctx->cfg->glsl_version < 320) @@ -5846,9 +6040,15 @@ static void emit_header(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *g } + if (ctx->shader_req_bits & SHADER_REQ_TEXTURE_SHADOW_LOD) + emit_ext(glsl_strbufs, "EXT_texture_shadow_lod", "require"); + if (ctx->shader_req_bits & SHADER_REQ_LODQ) emit_ext(glsl_strbufs, "EXT_texture_query_lod", "require"); + if (ctx->shader_req_bits & SHADER_REQ_SHADER_NOPERSPECTIVE_INTERPOLATION) + emit_ext(glsl_strbufs, "NV_shader_noperspective_interpolation", "require"); + emit_hdr(glsl_strbufs, "precision highp float;\n"); emit_hdr(glsl_strbufs, "precision highp int;\n"); } else { @@ -5875,6 +6075,9 @@ static void emit_header(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *g if (ctx->shader_req_bits & SHADER_REQ_SEPERATE_SHADER_OBJECTS) emit_ext(glsl_strbufs, "ARB_separate_shader_objects", "require"); + if (ctx->shader_req_bits & SHADER_REQ_EXPLICIT_ATTRIB_LOCATION) + emit_ext(glsl_strbufs, "ARB_explicit_attrib_location", "require"); + if (ctx->shader_req_bits & SHADER_REQ_ARRAYS_OF_ARRAYS) emit_ext(glsl_strbufs, "ARB_arrays_of_arrays", "require"); @@ -5967,7 +6170,7 @@ static const char *get_interp_string(const struct vrend_shader_cfg *cfg, enum tg { switch (interpolate) { case TGSI_INTERPOLATE_LINEAR: - if (!cfg->use_gles) + if (cfg->has_nopersective) return "noperspective "; else return ""; @@ -6166,6 +6369,7 @@ static void emit_image_decl(const struct dump_ctx *ctx, const char *sname, *stc, *formatstr; enum tgsi_return_type itype; const char *volatile_str = image->vflag ? "volatile " : ""; + const char *coherent_str = image->coherent ? "coherent " : ""; const char *precision = ctx->cfg->use_gles ? "highp " : ""; const char *access = ""; formatstr = get_internalformat_string(image->decl.Format, &itype); @@ -6202,11 +6406,11 @@ static void emit_image_decl(const struct dump_ctx *ctx, } if (range) - emit_hdrf(glsl_strbufs, "%s%suniform %s%cimage%s %simg%d[%d];\n", - access, volatile_str, precision, ptc, stc, sname, i, range); + emit_hdrf(glsl_strbufs, "%s%s%suniform %s%cimage%s %simg%d[%d];\n", + access, volatile_str, coherent_str, precision, ptc, stc, sname, i, range); else - emit_hdrf(glsl_strbufs, "%s%suniform %s%cimage%s %simg%d;\n", - access, volatile_str, precision, ptc, stc, sname, i); + emit_hdrf(glsl_strbufs, "%s%s%suniform %s%cimage%s %simg%d;\n", + access, volatile_str, coherent_str, precision, ptc, stc, sname, i); } static int emit_ios_common(const struct dump_ctx *ctx, @@ -6227,6 +6431,9 @@ static int emit_ios_common(const struct dump_ctx *ctx, } } + if (ctx->require_dummy_value) + emit_hdr(glsl_strbufs, "vec4 dummy_value = vec4(0.0, 0.0, 0.0, 0.0);\n"); + if (ctx->write_mul_utemp) { emit_hdr(glsl_strbufs, "uvec4 mul_utemp;\n"); emit_hdr(glsl_strbufs, "uvec4 umul_temp;\n"); @@ -6408,11 +6615,6 @@ static void emit_ios_indirect_generics_input(const struct dump_ctx *ctx, snprintf(array_handle, sizeof(array_handle), "[%d]", size); assert(size < 256 && size >= 0); - if (size < ctx->key->input.num_indirect_generic) { - VREND_DEBUG(dbg_shader, NULL, "WARNING: shader key indicates less indirect inputs" - " (%d) then are actually used (%d)\n", - ctx->key->input.num_indirect_generic, size); - } if (prefer_generic_io_block(ctx, io_in)) { @@ -6444,26 +6646,26 @@ emit_ios_generic(const struct dump_ctx *ctx, const struct vrend_shader_io *io, const char *inout, const char *postfix) { - const char *atype[3][4] = { - {"float", " vec2", " vec3", " vec4"}, - {" int", "ivec2", "ivec3", "ivec4"}, - {" uint", "uvec2", "uvec3", "uvec4"}, + const char *atype[3] = { + " vec4", "ivec4", "uvec4" }; - const char **type = atype[io->type]; - const char *t = type[3]; + + const char *t = atype[io->type]; char layout[128] = ""; if (io->overlapping_array) return; - if (io->usage_mask != 0xf && io->name == TGSI_SEMANTIC_GENERIC) - t = type[io->num_components - 1]; + if (ctx->separable_program && io->name == TGSI_SEMANTIC_GENERIC && + !(ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && strcmp(inout, "in") != 0)) { + snprintf(layout, sizeof(layout), "layout(location = %d) ", 31 - io->sid); + } if (io->first == io->last) { emit_hdr(glsl_strbufs, layout); /* ugly leave spaces to patch interp in later */ - emit_hdrf(glsl_strbufs, "%s%s\n%s %s %s %s%s;\n", + emit_hdrf(glsl_strbufs, "%s%s %s %s %s %s%s;\n", io->precise ? "precise" : "", io->invariant ? "invariant" : "", prefix, @@ -6489,6 +6691,7 @@ emit_ios_generic(const struct dump_ctx *ctx, } } else { + int array_size = io->last - io->first + 1; if (prefer_generic_io_block(ctx, iot)) { const char *stage_prefix = iot == io_in ? get_stage_input_name_prefix(ctx, ctx->prog_type): get_stage_output_name_prefix(ctx->prog_type); @@ -6507,7 +6710,7 @@ emit_ios_generic(const struct dump_ctx *ctx, prefix, t, io->glsl_name, - io->last - io->first +1, + array_size, blockvarame); } else { emit_hdr(glsl_strbufs, layout); @@ -6519,8 +6722,24 @@ emit_ios_generic(const struct dump_ctx *ctx, t, io->glsl_name, postfix, - io->last - io->first +1); + array_size); + uint64_t mask = ((1ull << array_size) - 1) << io->sid; + if (io->name == TGSI_SEMANTIC_GENERIC) { + assert(io->sid + array_size < 64); + if (iot == io_in) { + generic_ios->match.inputs_emitted_mask |= mask; + } else { + generic_ios->match.outputs_emitted_mask |= mask; + } + } else if (io->name == TGSI_SEMANTIC_TEXCOORD) { + assert(io->sid + array_size < 8); + if (iot == io_in) { + texcoord_ios->match.inputs_emitted_mask |= mask; + } else { + texcoord_ios->match.outputs_emitted_mask |= mask; + } + } } } } @@ -6625,22 +6844,28 @@ emit_ios_generic_outputs(const struct dump_ctx *ctx, *force_color_two_side = 1; } -static void +static uint64_t emit_ios_patch(struct vrend_glsl_strbufs *glsl_strbufs, const char *prefix, const struct vrend_shader_io *io, - const char *inout, int size) + const char *inout, int size, bool emit_location) { - const char type[4][6] = {"float", " vec2", " vec3", " vec4"}; - const char *t = " vec4"; + uint64_t emitted_patches = 0; - if (io->usage_mask != 0xf) - t = type[io->num_components - 1]; + /* We start these locations from 32 and proceed downwards, to avoid + * conflicting with generic IO locations. */ + if (emit_location) + emit_hdrf(glsl_strbufs, "layout(location = %d) ", io->sid); - if (io->last == io->first) - emit_hdrf(glsl_strbufs, "%s %s %s %s;\n", prefix, inout, t, io->glsl_name); - else - emit_hdrf(glsl_strbufs, "%s %s %s %s[%d];\n", prefix, inout, t, + if (io->last == io->first) { + emit_hdrf(glsl_strbufs, "%s %s vec4 %s;\n", prefix, inout, io->glsl_name); + emitted_patches |= 1ul << io->sid; + } else { + emit_hdrf(glsl_strbufs, "%s %s vec4 %s[%d];\n", prefix, inout, io->glsl_name, size); + uint64_t mask = (1ul << size) - 1; + emitted_patches |= mask << io->sid; + } + return emitted_patches; } static bool @@ -6751,7 +6976,7 @@ static void emit_ios_vs(const struct dump_ctx *ctx, const char *psize_buf = ctx->has_pointsize_output ? "out float gl_PointSize;\n" : ""; - if (!ctx->is_last_vertex_stage && ctx->key->output.use_pervertex) { + if (!ctx->is_last_vertex_stage && ctx->key->use_pervertex_in) { emit_hdrf(glsl_strbufs, "out gl_PerVertex {\n vec4 gl_Position;\n %s%s%s};\n", clip_buf, cull_buf, psize_buf); } } @@ -6780,14 +7005,14 @@ static void emit_ios_fs(const struct dump_ctx *ctx, uint32_t i; if (fs_emit_layout(ctx)) { - bool upper_left = !(ctx->fs_coord_origin ^ ctx->key->fs.invert_origin); - char comma = (upper_left && ctx->fs_pixel_center) ? ',' : ' '; + bool upper_left = ctx->fs_lower_left_origin == ctx->key->fs.lower_left_origin; + char comma = (upper_left && ctx->fs_integer_pixel_center) ? ',' : ' '; if (!ctx->cfg->use_gles) emit_hdrf(glsl_strbufs, "layout(%s%c%s) in vec4 gl_FragCoord;\n", upper_left ? "origin_upper_left" : "", comma, - ctx->fs_pixel_center ? "pixel_center_integer" : ""); + ctx->fs_integer_pixel_center ? "pixel_center_integer" : ""); } if (ctx->early_depth_stencil) { emit_hdr(glsl_strbufs, "layout(early_fragment_tests) in;\n"); @@ -6959,7 +7184,7 @@ static void emit_ios_per_vertex_out(const struct dump_ctx *ctx, if (ctx->num_out_clip_dist && !num_clip_cull) clip_dist = ctx->num_out_clip_dist; - if (ctx->key->output.use_pervertex) { + if (ctx->key->use_pervertex_in) { char clip_var[64] = "", cull_var[64] = ""; if (cull_dist) snprintf(cull_var, 64, "float gl_CullDistance[%d];\n", cull_dist); @@ -7063,6 +7288,7 @@ static void emit_ios_tcs(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_generic_ios *generic_ios, struct vrend_texcoord_ios *texcoord_ios, + uint64_t *emitted_out_patches_mask, bool *has_pervertex) { uint32_t i; @@ -7071,26 +7297,31 @@ static void emit_ios_tcs(const struct dump_ctx *ctx, for (i = 0; i < ctx->num_inputs; i++) { if (!ctx->inputs[i].glsl_predefined_no_emit) { - if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) - emit_ios_patch(glsl_strbufs, "", &ctx->inputs[i], "in", ctx->inputs[i].last - ctx->inputs[i].first + 1); - else + if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) { + emit_ios_patch(glsl_strbufs, "", &ctx->inputs[i], "in", + ctx->inputs[i].last - ctx->inputs[i].first + 1, + ctx->separable_program); + } else emit_ios_generic(ctx, glsl_strbufs, generic_ios, texcoord_ios, io_in, "", &ctx->inputs[i], "in", "[]"); } } - emit_hdrf(glsl_strbufs, "layout(vertices = %d) out;\n", ctx->tcs_vertices_out); + uint64_t emitted_patches = 0; - emit_ios_indirect_generics_output(ctx, glsl_strbufs, "[]"); + emit_hdrf(glsl_strbufs, "layout(vertices = %d) out;\n", ctx->tcs_vertices_out); if (ctx->patch_ios.output_range.used) - emit_ios_patch(glsl_strbufs, "patch", &ctx->patch_ios.output_range.io, "out", - ctx->patch_ios.output_range.io.last - ctx->patch_ios.output_range.io.first + 1); + emitted_patches |= emit_ios_patch(glsl_strbufs, "patch", &ctx->patch_ios.output_range.io, "out", + ctx->patch_ios.output_range.io.last - ctx->patch_ios.output_range.io.first + 1, + ctx->separable_program); for (i = 0; i < ctx->num_outputs; i++) { if (!ctx->outputs[i].glsl_predefined_no_emit) { if (ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) { - emit_ios_patch(glsl_strbufs, "patch", &ctx->outputs[i], "out", - ctx->outputs[i].last - ctx->outputs[i].first + 1); + + emitted_patches |= emit_ios_patch(glsl_strbufs, "patch", &ctx->outputs[i], "out", + ctx->outputs[i].last - ctx->outputs[i].first + 1, + ctx->separable_program); } else emit_ios_generic(ctx, glsl_strbufs, generic_ios, texcoord_ios, io_out, "", &ctx->outputs[i], "out", "[]"); } else if (ctx->outputs[i].invariant || ctx->outputs[i].precise) { @@ -7103,6 +7334,8 @@ static void emit_ios_tcs(const struct dump_ctx *ctx, emit_ios_per_vertex_in(ctx, glsl_strbufs, has_pervertex); emit_ios_per_vertex_out(ctx, glsl_strbufs, " gl_out[]"); + + *emitted_out_patches_mask = emitted_patches; } static void emit_ios_tes(const struct dump_ctx *ctx, @@ -7118,7 +7351,9 @@ static void emit_ios_tes(const struct dump_ctx *ctx, if (ctx->patch_ios.input_range.used) emit_ios_patch(glsl_strbufs, "patch", &ctx->patch_ios.input_range.io, "in", - ctx->patch_ios.input_range.io.last - ctx->patch_ios.input_range.io.first + 1); + ctx->patch_ios.input_range.io.last - + ctx->patch_ios.input_range.io.first + 1, + ctx->separable_program); if (generic_ios->input_range.used) emit_ios_indirect_generics_input(ctx, glsl_strbufs, "[]"); @@ -7127,7 +7362,8 @@ static void emit_ios_tes(const struct dump_ctx *ctx, if (!ctx->inputs[i].glsl_predefined_no_emit) { if (ctx->inputs[i].name == TGSI_SEMANTIC_PATCH) emit_ios_patch(glsl_strbufs, "patch", &ctx->inputs[i], "in", - ctx->inputs[i].last - ctx->inputs[i].first + 1); + ctx->inputs[i].last - ctx->inputs[i].first + 1, + ctx->separable_program); else emit_ios_generic(ctx, glsl_strbufs, generic_ios, texcoord_ios, io_in, "", &ctx->inputs[i], "in", "[]"); } @@ -7200,17 +7436,22 @@ static void emit_match_interfaces(struct vrend_glsl_strbufs *glsl_strbufs, int i = u_bit_scan64(&mask); emit_interp_info(glsl_strbufs, ctx->cfg, &ctx->key->fs_info, semantic->name, i, ctx->key->flatshade); + + if (semantic->name == TGSI_SEMANTIC_GENERIC && ctx->separable_program) + emit_hdrf(glsl_strbufs, "layout(location=%d) ", i); + emit_hdrf(glsl_strbufs, "out vec4 %s_%c%d%s;\n", get_stage_output_name_prefix(ctx->prog_type), semantic->prefix, i, ctx->prog_type == TGSI_PROCESSOR_TESS_CTRL ? "[]" : ""); - } + } } static int emit_ios(const struct dump_ctx *ctx, struct vrend_glsl_strbufs *glsl_strbufs, struct vrend_generic_ios *generic_ios, struct vrend_texcoord_ios *texcoord_ios, + uint64_t *patches_emitted_mask, uint8_t front_back_color_emitted_flags[], uint32_t *num_interps, bool *has_pervertex, @@ -7237,7 +7478,7 @@ static int emit_ios(const struct dump_ctx *ctx, emit_ios_geom(ctx, glsl_strbufs, generic_ios, texcoord_ios, front_back_color_emitted_flags, num_interps, has_pervertex, force_color_two_side); break; case TGSI_PROCESSOR_TESS_CTRL: - emit_ios_tcs(ctx, glsl_strbufs, generic_ios, texcoord_ios, has_pervertex); + emit_ios_tcs(ctx, glsl_strbufs, generic_ios, texcoord_ios, patches_emitted_mask, has_pervertex); break; case TGSI_PROCESSOR_TESS_EVAL: emit_ios_tes(ctx, glsl_strbufs, generic_ios, texcoord_ios, front_back_color_emitted_flags, num_interps, has_pervertex, force_color_two_side); @@ -7261,8 +7502,8 @@ static int emit_ios(const struct dump_ctx *ctx, glsl_ver_required = emit_ios_common(ctx, glsl_strbufs, shadow_samp_mask); if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT && - ctx->key->pstipple_tex == true) { - emit_hdr(glsl_strbufs, "float stip_temp;\n"); + ctx->key->pstipple_enabled) { + emit_hdr(glsl_strbufs, "uint stip_temp;\n"); } return glsl_ver_required; @@ -7339,6 +7580,7 @@ static void fill_var_sinfo(const struct dump_ctx *ctx, struct vrend_variable_sha { sinfo->num_ucp = ctx->is_last_vertex_stage ? VIRGL_NUM_CLIP_PLANES : 0; sinfo->fs_info.has_sample_input = ctx->has_sample_input; + sinfo->fs_info.has_noperspective = ctx->has_noperspective; sinfo->fs_info.num_interps = ctx->num_interps; sinfo->fs_info.glsl_ver = ctx->glsl_ver_required; bool has_prop = (ctx->num_clip_dist_prop + ctx->num_cull_dist_prop) > 0; @@ -7352,7 +7594,7 @@ static void fill_var_sinfo(const struct dump_ctx *ctx, struct vrend_variable_sha static void fill_sinfo(const struct dump_ctx *ctx, struct vrend_shader_info *sinfo) { - sinfo->in.use_pervertex = ctx->has_pervertex; + sinfo->use_pervertex_in = ctx->has_pervertex; sinfo->samplers_used_mask = ctx->samplers_used; sinfo->images_used_mask = ctx->images_used_mask; sinfo->num_consts = ctx->num_consts; @@ -7364,19 +7606,12 @@ static void fill_sinfo(const struct dump_ctx *ctx, struct vrend_shader_info *sin sinfo->ubo_indirect = !!(ctx->info.dimension_indirect_files & (1 << TGSI_FILE_CONSTANT)); - if (ctx->generic_ios.input_range.used) - sinfo->in.num_indirect_generic = ctx->generic_ios.input_range.io.last - - ctx->generic_ios.input_range.io.first + 1; - if (ctx->patch_ios.input_range.used) - sinfo->in.num_indirect_patch = ctx->patch_ios.input_range.io.last - - ctx->patch_ios.input_range.io.first + 1; + sinfo->has_output_arrays = ctx->has_output_arrays; + sinfo->has_input_arrays = ctx->has_input_arrays; - if (ctx->generic_ios.output_range.used) - sinfo->out.num_indirect_generic = ctx->generic_ios.output_range.io.last - - ctx->generic_ios.output_range.io.first + 1; - if (ctx->patch_ios.output_range.used) - sinfo->out.num_indirect_patch = ctx->patch_ios.output_range.io.last - - ctx->patch_ios.output_range.io.first + 1; + sinfo->out_generic_emitted_mask = ctx->generic_ios.match.outputs_emitted_mask; + sinfo->out_texcoord_emitted_mask = ctx->texcoord_ios.match.outputs_emitted_mask; + sinfo->out_patch_emitted_mask = ctx->patches_emitted_mask; sinfo->num_inputs = ctx->num_inputs; sinfo->num_outputs = ctx->num_outputs; @@ -7399,18 +7634,7 @@ static void fill_sinfo(const struct dump_ctx *ctx, struct vrend_shader_info *sin * to the next shader stage. mesa/tgsi doesn't provide this information for * TCS, TES, and GEOM shaders. */ - sinfo->out.guest_sent_io_arrays = ctx->guest_sent_io_arrays; - sinfo->out.num_generic_and_patch = 0; for(unsigned i = 0; i < ctx->num_outputs; i++) { - if ((ctx->outputs[i].name == TGSI_SEMANTIC_GENERIC || ctx->outputs[i].name == TGSI_SEMANTIC_PATCH) && - !ctx->outputs[i].overlapping_array) { - sinfo->generic_outputs_layout[sinfo->out.num_generic_and_patch].name = ctx->outputs[i].name; - sinfo->generic_outputs_layout[sinfo->out.num_generic_and_patch].sid = ctx->outputs[i].sid; - sinfo->generic_outputs_layout[sinfo->out.num_generic_and_patch].location = 0; - sinfo->generic_outputs_layout[sinfo->out.num_generic_and_patch].array_id = ctx->outputs[i].array_id; - sinfo->out.num_generic_and_patch++; - } - if (ctx->prog_type == TGSI_PROCESSOR_FRAGMENT) { if (ctx->outputs[i].name == TGSI_SEMANTIC_COLOR) sinfo->fs_output_layout[i] = ctx->outputs[i].sid; @@ -7429,8 +7653,8 @@ static void fill_sinfo(const struct dump_ctx *ctx, struct vrend_shader_info *sin free(sinfo->image_arrays); sinfo->image_arrays = ctx->image_arrays; sinfo->num_image_arrays = ctx->num_image_arrays; - sinfo->in.generic_emitted_mask = ctx->generic_ios.match.inputs_emitted_mask; - sinfo->in.texcoord_emitted_mask = ctx->texcoord_ios.match.inputs_emitted_mask; + sinfo->in_generic_emitted_mask = ctx->generic_ios.match.inputs_emitted_mask; + sinfo->in_texcoord_emitted_mask = ctx->texcoord_ios.match.inputs_emitted_mask; for (unsigned i = 0; i < ctx->num_outputs; ++i) { if (ctx->outputs[i].invariant) { @@ -7441,6 +7665,22 @@ static void fill_sinfo(const struct dump_ctx *ctx, struct vrend_shader_info *sin } } sinfo->gles_use_tex_query_level = ctx->gles_use_tex_query_level; + + if (ctx->guest_sent_io_arrays) { + sinfo->output_arrays.num_arrays = 0; + for (unsigned i = 0; i < ctx->num_outputs; ++i) { + const struct vrend_shader_io *io = &ctx->outputs[i]; + if (io->array_id > 0) { + struct vrend_shader_io_array *array = + &sinfo->output_arrays.layout[sinfo->output_arrays.num_arrays]; + array->sid = io->sid; + array->size = io->last - io->first; + array->name = io->name; + array->array_id = io->array_id; + ++sinfo->output_arrays.num_arrays; + } + } + } } static bool allocate_strbuffers(struct vrend_glsl_strbufs* glsl_strbufs) @@ -7473,18 +7713,14 @@ static void emit_required_sysval_uniforms(struct vrend_strbuf *block, uint32_t m if (!mask) return; - if (mask != BIT(UNIFORM_PSTIPPLE_SAMPLER)) { - strbuf_append(block, "layout (std140) uniform VirglBlock {\n"); - strbuf_append(block, "\tvec4 clipp[8];\n"); - strbuf_append(block, "\tfloat winsys_adjust_y;\n"); - strbuf_append(block, "\tfloat alpha_ref_val;\n"); - strbuf_append(block, "\tbool clip_plane_enabled;\n"); - strbuf_append(block, "};\n"); - } + strbuf_append(block, "layout (std140) uniform VirglBlock {\n"); + strbuf_append(block, "\tvec4 clipp[8];\n"); + strbuf_appendf(block, "\tuint stipple_pattern[%d];\n", VREND_POLYGON_STIPPLE_SIZE); + strbuf_append(block, "\tfloat winsys_adjust_y;\n"); + strbuf_append(block, "\tfloat alpha_ref_val;\n"); + strbuf_append(block, "\tbool clip_plane_enabled;\n"); + strbuf_append(block, "};\n"); - if (mask & BIT(UNIFORM_PSTIPPLE_SAMPLER)) { - strbuf_append(block, "uniform sampler2D pstipple_sampler;\n"); - } } static int compare_sid(const void *lhs, const void *rhs) @@ -7498,6 +7734,102 @@ static int compare_sid(const void *lhs, const void *rhs) return l->sid - r->sid; } +struct sso_scan_ctx { + struct tgsi_iterate_context iter; + const struct vrend_shader_cfg *cfg; + uint8_t max_generic_in_sid; + uint8_t max_patch_in_sid; + uint8_t max_generic_out_sid; + uint8_t max_patch_out_sid; + bool separable_program; + bool unsupported_io; +}; + +static boolean +iter_prop_for_separable(struct tgsi_iterate_context *iter, + struct tgsi_full_property *prop) +{ + struct sso_scan_ctx *ctx = (struct sso_scan_ctx *) iter; + + if (prop->Property.PropertyName == TGSI_PROPERTY_SEPARABLE_PROGRAM) + ctx->separable_program = prop->u[0].Data != 0; + return true; +} + +static boolean +iter_decl_for_overlap(struct tgsi_iterate_context *iter, + struct tgsi_full_declaration *decl) +{ + struct sso_scan_ctx *ctx = (struct sso_scan_ctx *) iter; + + /* VS inputs and FS outputs are of no interest + * when it comes to IO matching */ + if (decl->Declaration.File == TGSI_FILE_INPUT && + iter->processor.Processor == TGSI_PROCESSOR_VERTEX) + return true; + + if (decl->Declaration.File == TGSI_FILE_OUTPUT && + iter->processor.Processor == TGSI_PROCESSOR_FRAGMENT) + return true; + + switch (decl->Semantic.Name) { + case TGSI_SEMANTIC_PATCH: + if (decl->Declaration.File == TGSI_FILE_INPUT) { + if (ctx->max_patch_in_sid < decl->Semantic.Index) + ctx->max_patch_in_sid = decl->Semantic.Index; + } else { + if (ctx->max_patch_out_sid < decl->Semantic.Index) + ctx->max_patch_out_sid = decl->Semantic.Index; + } + break; + case TGSI_SEMANTIC_GENERIC: + if (decl->Declaration.File == TGSI_FILE_INPUT) { + if (ctx->max_generic_in_sid < decl->Semantic.Index) + ctx->max_generic_in_sid = decl->Semantic.Index; + } else { + if (ctx->max_generic_out_sid < decl->Semantic.Index) + ctx->max_generic_out_sid = decl->Semantic.Index; + } + break; + case TGSI_SEMANTIC_COLOR: + case TGSI_SEMANTIC_CLIPVERTEX: + case TGSI_SEMANTIC_BCOLOR: + case TGSI_SEMANTIC_TEXCOORD: + case TGSI_SEMANTIC_FOG: + /* These are semantics that need to be matched by name and since we can't + * guarantee that they exist in all the stages of separable shaders + * we can't emit the shader as SSO */ + ctx->unsupported_io = true; + break; + default: + ; + } + return true; +} + + +bool vrend_shader_query_separable_program(const struct tgsi_token *tokens, + const struct vrend_shader_cfg *cfg) +{ + struct sso_scan_ctx ctx = {0}; + ctx.cfg = cfg; + ctx.iter.iterate_property = iter_prop_for_separable; + ctx.iter.iterate_declaration = iter_decl_for_overlap; + tgsi_iterate_shader(tokens, &ctx.iter); + + /* Since we have to match by location, and have to handle generics and patches + * at in the limited range of 32 locations, we have to make sure that the + * the generics range and the patch range don't overlap. In addition, to + * work around that radeonsi doesn't support patch locations above 30 we have + * to check that limit too. */ + bool supports_separable = !ctx.unsupported_io && + (ctx.max_generic_in_sid + ctx.max_patch_in_sid < MAX_VARYING) && + (ctx.max_generic_out_sid + ctx.max_patch_out_sid < MAX_VARYING) && + (ctx.max_patch_in_sid < ctx.cfg->max_shader_patch_varyings) && + (ctx.max_patch_out_sid < ctx.cfg->max_shader_patch_varyings); + return ctx.separable_program && supports_separable; +} + bool vrend_convert_shader(const struct vrend_context *rctx, const struct vrend_shader_cfg *cfg, const struct tgsi_token *tokens, @@ -7511,6 +7843,7 @@ bool vrend_convert_shader(const struct vrend_context *rctx, boolean bret; memset(&ctx, 0, sizeof(struct dump_ctx)); + ctx.cfg = cfg; /* First pass to deal with edge cases. */ ctx.iter.iterate_declaration = iter_decls; @@ -7525,7 +7858,6 @@ bool vrend_convert_shader(const struct vrend_context *rctx, (ctx.iter.processor.Processor == TGSI_PROCESSOR_VERTEX && !key->gs_present && !key->tes_present); ctx.num_inputs = 0; - ctx.iter.prolog = prolog; ctx.iter.iterate_instruction = iter_instruction; ctx.iter.iterate_declaration = iter_declaration; @@ -7543,9 +7875,9 @@ bool vrend_convert_shader(const struct vrend_context *rctx, ctx.ssbo_atomic_array_base = 0xffffffff; ctx.has_sample_input = false; ctx.req_local_mem = req_local_mem; - ctx.guest_sent_io_arrays = key->input.guest_sent_io_arrays; - ctx.generic_ios.match.outputs_expected_mask = key->output.generic_emitted_mask; - ctx.texcoord_ios.match.outputs_expected_mask = key->output.texcoord_emitted_mask; + ctx.guest_sent_io_arrays = false; + ctx.generic_ios.match.outputs_expected_mask = key->out_generic_expected_mask; + ctx.texcoord_ios.match.outputs_expected_mask = key->out_texcoord_expected_mask; tgsi_scan_shader(tokens, &ctx.info); /* if we are in core profile mode we should use GLSL 1.40 */ @@ -7578,6 +7910,18 @@ bool vrend_convert_shader(const struct vrend_context *rctx, if (bret == false) goto fail; + /* If we need a sysvalue UBO then we require GLSL 1.40 */ + if (ctx.glsl_strbufs.required_sysval_uniform_decls) + ctx.glsl_ver_required = require_glsl_ver(&ctx, 140); + + if (!ctx.cfg->use_gles && + ( key->in_arrays.num_arrays > 0 ) && + (ctx.prog_type == TGSI_PROCESSOR_GEOMETRY || + ctx.prog_type == TGSI_PROCESSOR_TESS_CTRL || + ctx.prog_type == TGSI_PROCESSOR_TESS_EVAL)) { + ctx.shader_req_bits |= SHADER_REQ_ARRAYS_OF_ARRAYS; + } + for (size_t i = 0; i < ARRAY_SIZE(ctx.src_bufs); ++i) strbuf_free(ctx.src_bufs + i); @@ -7595,9 +7939,15 @@ bool vrend_convert_shader(const struct vrend_context *rctx, ctx.shader_req_bits |= SHADER_REQ_GPU_SHADER5; } + if (fs_info->num_interps && fs_info->has_noperspective && + cfg->use_gles) { + ctx.shader_req_bits |= SHADER_REQ_SHADER_NOPERSPECTIVE_INTERPOLATION; + } + emit_header(&ctx, &ctx.glsl_strbufs); ctx.glsl_ver_required = emit_ios(&ctx, &ctx.glsl_strbufs, &ctx.generic_ios, - &ctx.texcoord_ios, ctx.front_back_color_emitted_flags, + &ctx.texcoord_ios, &ctx.patches_emitted_mask, + ctx.front_back_color_emitted_flags, &ctx.num_interps, &ctx.has_pervertex, &ctx.force_color_two_side, &ctx.shadow_samp_mask); @@ -7773,7 +8123,8 @@ bool vrend_shader_create_passthrough_tcs(const struct vrend_context *rctx, emit_header(&ctx, &ctx.glsl_strbufs); ctx.glsl_ver_required = emit_ios(&ctx, &ctx.glsl_strbufs, &ctx.generic_ios, - &ctx.texcoord_ios, ctx.front_back_color_emitted_flags, + &ctx.texcoord_ios, &ctx.patches_emitted_mask, + ctx.front_back_color_emitted_flags, &ctx.num_interps, &ctx.has_pervertex, &ctx.force_color_two_side, &ctx.shadow_samp_mask); @@ -7843,13 +8194,8 @@ void vrend_shader_write_io_as_src(struct vrend_strbuf *result, { - if (io->first == io->last) { - if (io->overlapping_array) - strbuf_appendf(result, "%s%s[%d]", io->overlapping_array->glsl_name, - array_or_varname, io->array_offset); - else - strbuf_appendf(result, "%s%s", io->glsl_name, array_or_varname); - + if (io->first == io->last && !io->overlapping_array) { + strbuf_appendf(result, "%s%s", io->glsl_name, array_or_varname); } else { const struct vrend_shader_io *base = io->overlapping_array ? io->overlapping_array : io; const int offset = src->Register.Index - io->first + io->array_offset; diff --git a/src/vrend_shader.h b/src/vrend_shader.h index 13fd03f4..849acd9b 100644 --- a/src/vrend_shader.h +++ b/src/vrend_shader.h @@ -32,6 +32,8 @@ #define VIRGL_NUM_CLIP_PLANES 8 +#define VREND_POLYGON_STIPPLE_SIZE 32 + #define VREND_SHADER_SAMPLER_VIEWS_MASK_LENGTH \ ((PIPE_MAX_SHADER_SAMPLER_VIEWS + 63) / 64) @@ -81,31 +83,47 @@ struct vrend_fs_shader_info { int num_interps; int glsl_ver; bool has_sample_input; + bool has_noperspective; struct vrend_interp_info interpinfo[PIPE_MAX_SHADER_INPUTS]; }; struct vrend_shader_info_out { - uint64_t num_indirect_generic : 8; - uint64_t num_indirect_patch : 8; - uint64_t num_generic_and_patch : 8; - uint64_t guest_sent_io_arrays : 1; + uint8_t num_generic_and_patch; + uint8_t num_indirect_generic; + uint8_t num_indirect_patch; + bool guest_sent_io_arrays; }; struct vrend_shader_info_in { uint64_t generic_emitted_mask; uint64_t texcoord_emitted_mask; - uint32_t num_indirect_generic : 8; - uint32_t num_indirect_patch : 8; - uint32_t use_pervertex : 1; + bool indirect_generic_or_patch : 1; + bool use_pervertex : 1; }; +struct vrend_shader_io_array { + enum tgsi_semantic name : 6; + uint32_t sid : 6; + uint32_t size : 6; + uint32_t array_id : 6; + uint32_t padding : 8; +}; + +struct vrend_shader_io_array_info { + uint32_t num_arrays; + struct vrend_shader_io_array layout[16]; +}; struct vrend_shader_info { uint32_t invariant_outputs[4]; - struct vrend_shader_info_out out; - struct vrend_shader_info_in in; + uint64_t in_generic_emitted_mask; + uint64_t in_texcoord_emitted_mask; + + uint64_t out_generic_emitted_mask; + uint64_t out_patch_emitted_mask; + + struct vrend_shader_io_array_info output_arrays; - struct vrend_layout_info generic_outputs_layout[64]; struct vrend_array *sampler_arrays; struct vrend_array *image_arrays; char **so_names; @@ -132,10 +150,14 @@ struct vrend_shader_info { int num_sampler_arrays; int num_image_arrays; + uint8_t out_texcoord_emitted_mask; uint8_t ubo_indirect : 1; uint8_t tes_point_mode : 1; uint8_t gles_use_tex_query_level : 1; uint8_t separable_program : 1; + uint8_t has_input_arrays : 1; + uint8_t has_output_arrays : 1; + uint8_t use_pervertex_in : 1; }; struct vrend_variable_shader_info { @@ -149,12 +171,17 @@ struct vrend_variable_shader_info { }; struct vrend_shader_key { + uint64_t out_generic_expected_mask; + uint64_t out_texcoord_expected_mask; + + uint64_t in_generic_expected_mask; + uint64_t in_texcoord_expected_mask; + uint64_t in_patch_expected_mask; + uint32_t force_invariant_inputs[4]; struct vrend_fs_shader_info fs_info; - struct vrend_shader_info_out input; - struct vrend_shader_info_in output; - struct vrend_layout_info prev_stage_generic_and_patch_outputs_layout[64]; + struct vrend_shader_io_array_info in_arrays; union { struct { @@ -168,7 +195,7 @@ struct vrend_shader_key { uint32_t logicop_func : 4; uint32_t logicop_enabled : 1; uint32_t prim_is_points : 1; - uint32_t invert_origin : 1; + uint32_t lower_left_origin : 1; uint32_t available_color_in_bits : 4; } fs; @@ -193,19 +220,22 @@ struct vrend_shader_key { uint8_t num_in_clip : 4; uint8_t num_out_cull : 4; uint8_t num_out_clip : 4; - uint8_t pstipple_tex : 1; + uint8_t pstipple_enabled : 1; uint8_t add_alpha_test : 1; uint8_t color_two_side : 1; uint8_t gs_present : 1; uint8_t tcs_present : 1; uint8_t tes_present : 1; uint8_t flatshade : 1; - + uint8_t require_input_arrays : 1; + uint8_t require_output_arrays : 1; + uint8_t use_pervertex_in : 1; }; struct vrend_shader_cfg { uint32_t glsl_version : 12; uint32_t max_draw_buffers : 4; + uint32_t max_shader_patch_varyings : 6; uint32_t use_gles : 1; uint32_t use_core_profile : 1; uint32_t use_explicit_locations : 1; @@ -217,6 +247,8 @@ struct vrend_shader_cfg { uint32_t has_dual_src_blend : 1; uint32_t has_fbfetch_coherent : 1; uint32_t has_cull_distance : 1; + uint32_t has_nopersective : 1; + uint32_t has_texture_shadow_lod : 1; }; struct vrend_context; @@ -251,6 +283,9 @@ bool vrend_shader_create_passthrough_tcs(const struct vrend_context *ctx, bool vrend_shader_needs_alpha_func(const struct vrend_shader_key *key); +bool vrend_shader_query_separable_program(const struct tgsi_token *tokens, + const struct vrend_shader_cfg *cfg); + static inline bool vrend_shader_sampler_views_mask_get( const uint64_t mask[static VREND_SHADER_SAMPLER_VIEWS_MASK_LENGTH], int index) diff --git a/src/vrend_strbuf.h b/src/vrend_strbuf.h index da5cb470..8568d010 100644 --- a/src/vrend_strbuf.h +++ b/src/vrend_strbuf.h @@ -148,11 +148,14 @@ static inline void strbuf_vappendf(struct vrend_strbuf *sb, const char *fmt, va_ int len = vsnprintf(sb->buf + sb->size, sb->alloc_size - sb->size, fmt, ap); if (len >= (int)(sb->alloc_size - sb->size)) { - if (!strbuf_grow(sb, len)) - return; + if (!strbuf_grow(sb, len)) { + goto end; + } vsnprintf(sb->buf + sb->size, sb->alloc_size - sb->size, fmt, cp); } sb->size += len; +end: + va_end(ap); } __attribute__((format(printf, 2, 3))) @@ -172,10 +175,12 @@ static inline void strbuf_vfmt(struct vrend_strbuf *sb, const char *fmt, va_list int len = vsnprintf(sb->buf, sb->alloc_size, fmt, ap); if (len >= (int)(sb->alloc_size)) { if (!strbuf_grow(sb, len)) - return; + goto end; vsnprintf(sb->buf, sb->alloc_size, fmt, cp); } sb->size = len; +end: + va_end(ap); } __attribute__((format(printf, 2, 3))) diff --git a/src/vrend_video.c b/src/vrend_video.c new file mode 100644 index 00000000..38da8ff9 --- /dev/null +++ b/src/vrend_video.c @@ -0,0 +1,771 @@ +/************************************************************************** + * + * Copyright (C) 2022 Kylin Software Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * The video implementation of the vrend renderer. + * + * It is based on the general virgl video submodule and handles data transfer + * and synchronization between host and guest. + * + * The relationship between vaSurface and video buffer objects: + * + * GUEST (Mesa) | HOST (Virglrenderer) + * | + * +------------+ | +------------+ + * | vaSurface | | | vaSurface | <------+ + * +------------+ | +------------+ | + * | | | + * +---------------------------+ | +-------------------------+ | + * | virgl_video_buffer | | | vrend_video_buffer | | + * | +-----------------------+ | | | +-------------------+ | | + * | | vl_video_buffer | | | | | vrend_resource(s) | | | + * | | +-------------------+ | |<--+-->| +-------------------+ | | + * | | | virgl_resource(s) | | | | | +--------------------+ | | + * | | +-------------------+ | | | | | virgl_video_buffer |-+--+ + * | +-----------------------+ | | | +--------------------+ | + * +---------------------------+ | +-------------------------+ + * + * The relationship between vaContext and video codec objects: + * + * GUEST (Mesa) | HOST (Virglrenderer) + * | + * +------------+ | +------------+ + * | vaContext | | | vaContext | <-------+ + * +------------+ | +------------+ | + * | | | + * +------------------------+ | +--------------------------+ | + * | virgl_video_codec | <--+--> | vrend_video_codec | | + * +------------------------+ | | +--------------------+ | | + * | | | virgl_video_codec | -+--+ + * | | +--------------------+ | + * | +--------------------------+ + * + * @author Feng Jiang <jiangfeng@kylinos.cn> + */ + + +#include <sys/param.h> + +#include "virgl_video.h" +#include "virgl_video_hw.h" + +#include "vrend_debug.h" +#include "vrend_winsys.h" +#include "vrend_renderer.h" +#include "vrend_video.h" + +struct vrend_context; + +struct vrend_video_context { + struct vrend_context *ctx; + struct list_head codecs; + struct list_head buffers; +}; + +struct vrend_video_codec { + struct virgl_video_codec *codec; + uint32_t handle; + struct vrend_resource *feed_res; /* encoding feedback */ + struct vrend_resource *dest_res; /* encoding coded buffer */ + struct vrend_video_context *ctx; + struct list_head head; +}; + +struct vrend_video_plane { + uint32_t res_handle; + GLuint texture; /* texture for temporary use */ + GLuint framebuffer; /* framebuffer for temporary use */ + EGLImageKHR egl_image; /* egl image for temporary use */ +}; + +struct vrend_video_buffer { + struct virgl_video_buffer *buffer; + + uint32_t handle; + struct vrend_video_context *ctx; + struct list_head head; + + uint32_t num_planes; + struct vrend_video_plane planes[3]; +}; + +static struct vrend_video_codec *vrend_video_codec( + struct virgl_video_codec *codec) +{ + return virgl_video_codec_opaque_data(codec); +} + +static struct vrend_video_buffer *vrend_video_buffer( + struct virgl_video_buffer *buffer) +{ + return virgl_video_buffer_opaque_data(buffer); +} + +static struct vrend_video_codec *get_video_codec( + struct vrend_video_context *ctx, + uint32_t cdc_handle) +{ + struct vrend_video_codec *cdc; + + LIST_FOR_EACH_ENTRY(cdc, &ctx->codecs, head) { + if (cdc->handle == cdc_handle) + return cdc; + } + + return NULL; +} + +static struct vrend_video_buffer *get_video_buffer( + struct vrend_video_context *ctx, + uint32_t buf_handle) +{ + struct vrend_video_buffer *buf; + + LIST_FOR_EACH_ENTRY(buf, &ctx->buffers, head) { + if (buf->handle == buf_handle) + return buf; + } + + return NULL; +} + + +static int sync_dmabuf_to_video_buffer(struct vrend_video_buffer *buf, + const struct virgl_video_dma_buf *dmabuf) +{ + if (!(dmabuf->flags & VIRGL_VIDEO_DMABUF_READ_ONLY)) { + vrend_printf("%s: dmabuf is not readable\n", __func__); + return -1; + } + + for (unsigned i = 0; i < dmabuf->num_planes && i < buf->num_planes; i++) { + struct vrend_video_plane *plane = &buf->planes[i]; + struct vrend_resource *res; + + res = vrend_renderer_ctx_res_lookup(buf->ctx->ctx, plane->res_handle); + if (!res) { + vrend_printf("%s: res %d not found\n", __func__, plane->res_handle); + continue; + } + + /* dmabuf -> eglimage */ + if (EGL_NO_IMAGE_KHR == plane->egl_image) { + EGLint img_attrs[16] = { + EGL_LINUX_DRM_FOURCC_EXT, dmabuf->planes[i].drm_format, + EGL_WIDTH, dmabuf->width / (i + 1), + EGL_HEIGHT, dmabuf->height / (i + 1), + EGL_DMA_BUF_PLANE0_FD_EXT, dmabuf->planes[i].fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, dmabuf->planes[i].offset, + EGL_DMA_BUF_PLANE0_PITCH_EXT, dmabuf->planes[i].pitch, + EGL_NONE + }; + + plane->egl_image = eglCreateImageKHR(eglGetCurrentDisplay(), + EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, img_attrs); + } + + if (EGL_NO_IMAGE_KHR == plane->egl_image) { + vrend_printf("%s: create egl image failed\n", __func__); + continue; + } + + /* eglimage -> texture */ + glBindTexture(GL_TEXTURE_2D, plane->texture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, + (GLeglImageOES)(plane->egl_image)); + + /* texture -> framebuffer */ + glBindFramebuffer(GL_READ_FRAMEBUFFER, plane->framebuffer); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, plane->texture, 0); + + /* framebuffer -> vrend_video_buffer.planes[i] */ + glBindTexture(GL_TEXTURE_2D, res->id); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, + res->base.width0, res->base.height0); + } + + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + return 0; +} + +static int sync_video_buffer_to_dmabuf(struct vrend_video_buffer *buf, + const struct virgl_video_dma_buf *dmabuf) +{ + if (!(dmabuf->flags & VIRGL_VIDEO_DMABUF_WRITE_ONLY)) { + vrend_printf("%s: dmabuf is not writable\n", __func__); + return -1; + } + + for (unsigned i = 0; i < dmabuf->num_planes && i < buf->num_planes; i++) { + struct vrend_video_plane *plane = &buf->planes[i]; + struct vrend_resource *res; + + res = vrend_renderer_ctx_res_lookup(buf->ctx->ctx, plane->res_handle); + if (!res) { + vrend_printf("%s: res %d not found\n", __func__, plane->res_handle); + continue; + } + + /* dmabuf -> eglimage */ + if (EGL_NO_IMAGE_KHR == plane->egl_image) { + EGLint img_attrs[16] = { + EGL_LINUX_DRM_FOURCC_EXT, dmabuf->planes[i].drm_format, + EGL_WIDTH, dmabuf->width / (i + 1), + EGL_HEIGHT, dmabuf->height / (i + 1), + EGL_DMA_BUF_PLANE0_FD_EXT, dmabuf->planes[i].fd, + EGL_DMA_BUF_PLANE0_OFFSET_EXT, dmabuf->planes[i].offset, + EGL_DMA_BUF_PLANE0_PITCH_EXT, dmabuf->planes[i].pitch, + EGL_NONE + }; + + plane->egl_image = eglCreateImageKHR(eglGetCurrentDisplay(), + EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, NULL, img_attrs); + } + + if (EGL_NO_IMAGE_KHR == plane->egl_image) { + vrend_printf("%s: create egl image failed\n", __func__); + continue; + } + + /* eglimage -> texture */ + glBindTexture(GL_TEXTURE_2D, plane->texture); + glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, + (GLeglImageOES)(plane->egl_image)); + + /* vrend_video_buffer.planes[i] -> framebuffer */ + glBindFramebuffer(GL_READ_FRAMEBUFFER, plane->framebuffer); + glFramebufferTexture2D(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, res->id, 0); + + /* framebuffer -> texture */ + glBindTexture(GL_TEXTURE_2D, plane->texture); + glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, + res->base.width0, res->base.height0); + + } + + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + return 0; +} + + +static void vrend_video_decode_completed( + struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *dmabuf) +{ + struct vrend_video_buffer *buf = vrend_video_buffer(dmabuf->buf); + + (void)codec; + + sync_dmabuf_to_video_buffer(buf, dmabuf); +} + + +static void vrend_video_enocde_upload_picture( + struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *dmabuf) +{ + struct vrend_video_buffer *buf = vrend_video_buffer(dmabuf->buf); + + (void)codec; + + sync_video_buffer_to_dmabuf(buf, dmabuf); +} + +static void vrend_video_encode_completed( + struct virgl_video_codec *codec, + const struct virgl_video_dma_buf *src_buf, + const struct virgl_video_dma_buf *ref_buf, + unsigned num_coded_bufs, + const void * const *coded_bufs, + const unsigned *coded_sizes) +{ + void *buf; + unsigned i, size, data_size; + struct virgl_video_encode_feedback feedback; + struct vrend_video_codec *cdc = vrend_video_codec(codec); + + (void)src_buf; + (void)ref_buf; + + if (!cdc->dest_res || !cdc->feed_res) + return; + + memset(&feedback, 0, sizeof(feedback)); + + /* sync coded data to guest */ + if (has_bit(cdc->dest_res->storage_bits, VREND_STORAGE_GL_BUFFER)) { + glBindBufferARB(cdc->dest_res->target, cdc->dest_res->id); + buf = glMapBufferRange(cdc->dest_res->target, 0, + cdc->dest_res->base.width0, GL_MAP_WRITE_BIT); + for (i = 0, data_size = 0; i < num_coded_bufs && + data_size < cdc->dest_res->base.width0; i++) { + size = MIN(cdc->dest_res->base.width0 - data_size, coded_sizes[i]); + memcpy((uint8_t *)buf + data_size, coded_bufs[i], size); + vrend_write_to_iovec(cdc->dest_res->iov, cdc->dest_res->num_iovs, + data_size, coded_bufs[i], size); + data_size += size; + } + glUnmapBuffer(cdc->dest_res->target); + glBindBufferARB(cdc->dest_res->target, 0); + feedback.stat = VIRGL_VIDEO_ENCODE_STAT_SUCCESS; + feedback.coded_size = data_size; + } else { + vrend_printf("unexcepted coded res type\n"); + feedback.stat = VIRGL_VIDEO_ENCODE_STAT_FAILURE; + feedback.coded_size = 0; + } + + /* send feedback */ + vrend_write_to_iovec(cdc->feed_res->iov, cdc->feed_res->num_iovs, + 0, (char *)(&feedback), + MIN(cdc->feed_res->base.width0, sizeof(feedback))); + + cdc->dest_res = NULL; + cdc->feed_res = NULL; +} + +static struct virgl_video_callbacks video_callbacks = { + .decode_completed = vrend_video_decode_completed, + .encode_upload_picture = vrend_video_enocde_upload_picture, + .encode_completed = vrend_video_encode_completed, +}; + +int vrend_video_init(int drm_fd) +{ + if (drm_fd < 0) + return -1; + + return virgl_video_init(drm_fd, &video_callbacks, 0); +} + +void vrend_video_fini(void) +{ + virgl_video_destroy(); +} + +int vrend_video_fill_caps(union virgl_caps *caps) +{ + return virgl_video_fill_caps(caps); +} + +int vrend_video_create_codec(struct vrend_video_context *ctx, + uint32_t handle, + uint32_t profile, + uint32_t entrypoint, + uint32_t chroma_format, + uint32_t level, + uint32_t width, + uint32_t height, + uint32_t max_ref, + uint32_t flags) +{ + struct vrend_video_codec *cdc = get_video_codec(ctx, handle); + struct virgl_video_create_codec_args args; + + if (cdc) + return 0; + + if (profile <= PIPE_VIDEO_PROFILE_UNKNOWN || + profile >= PIPE_VIDEO_PROFILE_MAX) + return -1; + + if (entrypoint <= PIPE_VIDEO_ENTRYPOINT_UNKNOWN || + entrypoint > PIPE_VIDEO_ENTRYPOINT_ENCODE) + return -1; + + if (chroma_format >= PIPE_VIDEO_CHROMA_FORMAT_NONE) + return -1; + + if (!width || !height) + return -1; + + cdc = (struct vrend_video_codec *)calloc(1, sizeof(*cdc)); + if (!cdc) + return -1; + + args.profile = profile; + args.entrypoint = entrypoint; + args.chroma_format = chroma_format; + args.level = level; + args.width = width; + args.height = height; + args.max_references = max_ref; + args.flags = flags; + args.opaque = cdc; + cdc->codec = virgl_video_create_codec(&args); + if (!cdc->codec) { + free(cdc); + return -1; + } + + cdc->handle = handle; + cdc->ctx = ctx; + list_add(&cdc->head, &ctx->codecs); + + return 0; +} + +static void destroy_video_codec(struct vrend_video_codec *cdc) +{ + if (cdc) { + list_del(&cdc->head); + virgl_video_destroy_codec(cdc->codec); + free(cdc); + } +} + +void vrend_video_destroy_codec(struct vrend_video_context *ctx, + uint32_t handle) +{ + struct vrend_video_codec *cdc = get_video_codec(ctx, handle); + + destroy_video_codec(cdc); +} + +int vrend_video_create_buffer(struct vrend_video_context *ctx, + uint32_t handle, + uint32_t format, + uint32_t width, + uint32_t height, + uint32_t *res_handles, + unsigned int num_res) +{ + unsigned i; + struct vrend_video_plane *plane; + struct vrend_video_buffer *buf = get_video_buffer(ctx, handle); + struct virgl_video_create_buffer_args args; + + if (buf) + return 0; + + if (format <= PIPE_FORMAT_NONE || format >= PIPE_FORMAT_COUNT) + return -1; + + if (!width || !height || !res_handles || !num_res) + return -1; + + buf = (struct vrend_video_buffer *)calloc(1, sizeof(*buf)); + if (!buf) + return -1; + + args.format = format; + args.width = width; + args.height = height; + args.interlaced = 0; + args.opaque = buf; + buf->buffer = virgl_video_create_buffer(&args); + if (!buf->buffer) { + free(buf); + return -1; + } + + for (i = 0; i < ARRAY_SIZE(buf->planes); i++) + buf->planes[i].egl_image = EGL_NO_IMAGE_KHR; + + for (i = 0, buf->num_planes = 0; + i < num_res && buf->num_planes < ARRAY_SIZE(buf->planes); i++) { + + if (!res_handles[i]) + continue; + + plane = &buf->planes[buf->num_planes++]; + plane->res_handle = res_handles[i]; + glGenFramebuffers(1, &plane->framebuffer); + glGenTextures(1, &plane->texture); + glBindTexture(GL_TEXTURE_2D, plane->texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glBindTexture(GL_TEXTURE_2D, 0); + } + + buf->handle = handle; + buf->ctx = ctx; + list_add(&buf->head, &ctx->buffers); + + return 0; +} + +static void destroy_video_buffer(struct vrend_video_buffer *buf) +{ + unsigned i; + struct vrend_video_plane *plane; + + if (!buf) + return; + + list_del(&buf->head); + + for (i = 0; i < buf->num_planes; i++) { + plane = &buf->planes[i]; + + glDeleteTextures(1, &plane->texture); + glDeleteFramebuffers(1, &plane->framebuffer); + if (plane->egl_image == EGL_NO_IMAGE_KHR) + eglDestroyImageKHR(eglGetCurrentDisplay(), plane->egl_image); + } + + virgl_video_destroy_buffer(buf->buffer); + + free(buf); +} + +void vrend_video_destroy_buffer(struct vrend_video_context *ctx, + uint32_t handle) +{ + struct vrend_video_buffer *buf = get_video_buffer(ctx, handle); + + destroy_video_buffer(buf); +} + +struct vrend_video_context *vrend_video_create_context(struct vrend_context *ctx) +{ + struct vrend_video_context *vctx; + + vctx = (struct vrend_video_context *)calloc(1, sizeof(*vctx)); + if (vctx) { + vctx->ctx = ctx; + list_inithead(&vctx->codecs); + list_inithead(&vctx->buffers); + } + + return vctx; +} + +void vrend_video_destroy_context(struct vrend_video_context *ctx) +{ + struct vrend_video_codec *vcdc, *vcdc_tmp; + struct vrend_video_buffer *vbuf, *vbuf_tmp; + + LIST_FOR_EACH_ENTRY_SAFE(vcdc, vcdc_tmp, &ctx->codecs, head) + destroy_video_codec(vcdc); + + LIST_FOR_EACH_ENTRY_SAFE(vbuf, vbuf_tmp, &ctx->buffers, head) + destroy_video_buffer(vbuf); + + free(ctx); +} + +int vrend_video_begin_frame(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle) +{ + struct vrend_video_codec *cdc = get_video_codec(ctx, cdc_handle); + struct vrend_video_buffer *tgt = get_video_buffer(ctx, tgt_handle); + + if (!cdc || !tgt) + return -1; + + return virgl_video_begin_frame(cdc->codec, tgt->buffer); +} + +static void modify_h264_picture_desc(struct vrend_video_codec *cdc, + struct vrend_video_buffer *tgt, + struct virgl_h264_picture_desc *desc) +{ + unsigned i; + struct vrend_video_buffer *vbuf; + + (void)tgt; + + for (i = 0; i < ARRAY_SIZE(desc->buffer_id); i++) { + vbuf = get_video_buffer(cdc->ctx, desc->buffer_id[i]); + desc->buffer_id[i] = virgl_video_buffer_id(vbuf ? vbuf->buffer : NULL); + } +} + +static void modify_h265_picture_desc(struct vrend_video_codec *cdc, + struct vrend_video_buffer *tgt, + struct virgl_h265_picture_desc *desc) +{ + unsigned i; + struct vrend_video_buffer *vbuf; + + (void)tgt; + + for (i = 0; i < ARRAY_SIZE(desc->ref); i++) { + vbuf = get_video_buffer(cdc->ctx, desc->ref[i]); + desc->ref[i] = virgl_video_buffer_id(vbuf ? vbuf->buffer : NULL); + } +} + +static void modify_picture_desc(struct vrend_video_codec *cdc, + struct vrend_video_buffer *tgt, + union virgl_picture_desc *desc) +{ + switch(virgl_video_codec_profile(cdc->codec)) { + case PIPE_VIDEO_PROFILE_MPEG4_AVC_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_CONSTRAINED_BASELINE: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_MAIN: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_EXTENDED: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH10: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH422: + case PIPE_VIDEO_PROFILE_MPEG4_AVC_HIGH444: + modify_h264_picture_desc(cdc, tgt, &desc->h264); + break; + case PIPE_VIDEO_PROFILE_HEVC_MAIN: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_10: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_STILL: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_12: + case PIPE_VIDEO_PROFILE_HEVC_MAIN_444: + modify_h265_picture_desc(cdc, tgt, &desc->h265); + break; + default: + break; + } +} + +int vrend_video_decode_bitstream(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle, + uint32_t desc_handle, + unsigned num_buffers, + const uint32_t *buffer_handles, + const uint32_t *buffer_sizes) +{ + int err = -1; + unsigned i, num_bs, *bs_sizes = NULL; + void **bs_buffers = NULL; + struct vrend_resource *res; + struct vrend_video_codec *cdc = get_video_codec(ctx, cdc_handle); + struct vrend_video_buffer *tgt = get_video_buffer(ctx, tgt_handle); + union virgl_picture_desc desc; + + if (!cdc || !tgt) + return -1; + + bs_buffers = calloc(num_buffers, sizeof(void *)); + if (!bs_buffers) { + vrend_printf("%s: alloc bs_buffers failed\n", __func__); + return -1; + } + + bs_sizes = calloc(num_buffers, sizeof(unsigned)); + if (!bs_sizes) { + vrend_printf("%s: alloc bs_sizes failed\n", __func__); + goto err; + } + + for (i = 0, num_bs = 0; i < num_buffers; i++) { + res = vrend_renderer_ctx_res_lookup(ctx->ctx, buffer_handles[i]); + if (!res || !res->ptr) { + vrend_printf("%s: bs res %d invalid or not found", + __func__, buffer_handles[i]); + continue; + } + + vrend_read_from_iovec(res->iov, res->num_iovs, 0, + res->ptr, buffer_sizes[i]); + bs_buffers[num_bs] = res->ptr; + bs_sizes[num_bs] = buffer_sizes[i]; + num_bs++; + } + + res = vrend_renderer_ctx_res_lookup(ctx->ctx, desc_handle); + if (!res) { + vrend_printf("%s: desc res %d not found\n", __func__, desc_handle); + goto err; + } + memset(&desc, 0, sizeof(desc)); + vrend_read_from_iovec(res->iov, res->num_iovs, 0, (char *)(&desc), + MIN(res->base.width0, sizeof(desc))); + modify_picture_desc(cdc, tgt, &desc); + + err = virgl_video_decode_bitstream(cdc->codec, tgt->buffer, &desc, + num_bs, (const void * const *)bs_buffers, bs_sizes); + +err: + free(bs_buffers); + free(bs_sizes); + + return err; +} + +int vrend_video_encode_bitstream(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t src_handle, + uint32_t dest_handle, + uint32_t desc_handle, + uint32_t feed_handle) +{ + union virgl_picture_desc desc; + struct vrend_resource *dest_res, *desc_res, *feed_res; + struct vrend_video_codec *cdc = get_video_codec(ctx, cdc_handle); + struct vrend_video_buffer *src = get_video_buffer(ctx, src_handle); + + if (!cdc || !src) + return -1; + + /* Feedback resource */ + feed_res = vrend_renderer_ctx_res_lookup(ctx->ctx, feed_handle); + if (!feed_res) { + vrend_printf("%s: feedback res %d not found\n", __func__, feed_handle); + return -1; + } + + /* Picture descriptor resource */ + desc_res = vrend_renderer_ctx_res_lookup(ctx->ctx, desc_handle); + if (!desc_res) { + vrend_printf("%s: desc res %d not found\n", __func__, desc_handle); + return -1; + } + memset(&desc, 0, sizeof(desc)); + vrend_read_from_iovec(desc_res->iov, desc_res->num_iovs, 0, (char *)(&desc), + MIN(desc_res->base.width0, sizeof(desc))); + + /* Destination buffer resource. */ + dest_res = vrend_renderer_ctx_res_lookup(ctx->ctx, dest_handle); + if (!dest_res) { + vrend_printf("%s: dest res %d not found\n", __func__, dest_handle); + return -1; + } + + cdc->feed_res = feed_res; + cdc->dest_res = dest_res; + + return virgl_video_encode_bitstream(cdc->codec, src->buffer, &desc); +} + +int vrend_video_end_frame(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle) +{ + struct vrend_video_codec *cdc = get_video_codec(ctx, cdc_handle); + struct vrend_video_buffer *tgt = get_video_buffer(ctx, tgt_handle); + + if (!cdc || !tgt) + return -1; + + return virgl_video_end_frame(cdc->codec, tgt->buffer); +} + diff --git a/src/vrend_video.h b/src/vrend_video.h new file mode 100644 index 00000000..7b61db12 --- /dev/null +++ b/src/vrend_video.h @@ -0,0 +1,95 @@ +/************************************************************************** + * + * Copyright (C) 2022 Kylin Software Co., Ltd. + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + **************************************************************************/ + +/** + * @file + * The video interface of the vrend renderer. + * + * These interfaces are mainly called by the vrend deocode submodule + * to process the corresponding virgl context video command. + * + * @author Feng Jiang <jiangfeng@kylinos.cn> + */ + +#ifndef VREND_VIDEO_H +#define VREND_VIDEO_H + +#include <virgl_hw.h> + +#define VREND_VIDEO_BUFFER_PLANE_NUM 3 + +struct vrend_video_context; + +int vrend_video_init(int drm_fd); +void vrend_video_fini(void); + +int vrend_video_fill_caps(union virgl_caps *caps); + +struct vrend_video_context *vrend_video_create_context(struct vrend_context *ctx); +void vrend_video_destroy_context(struct vrend_video_context *ctx); + +int vrend_video_create_codec(struct vrend_video_context *ctx, + uint32_t handle, + uint32_t profile, + uint32_t entrypoint, + uint32_t chroma_format, + uint32_t level, + uint32_t width, + uint32_t height, + uint32_t max_ref, + uint32_t flags); +void vrend_video_destroy_codec(struct vrend_video_context *ctx, + uint32_t handle); + +int vrend_video_create_buffer(struct vrend_video_context *ctx, + uint32_t handle, + uint32_t format, + uint32_t width, + uint32_t height, + uint32_t *res_handles, + unsigned int num_res); +void vrend_video_destroy_buffer(struct vrend_video_context *ctx, + uint32_t handle); + +int vrend_video_begin_frame(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle); +int vrend_video_decode_bitstream(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle, + uint32_t desc_handle, + unsigned num_buffers, + const uint32_t *buffer_handles, + const uint32_t *buffer_sizes); +int vrend_video_encode_bitstream(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t src_handle, + uint32_t dest_handle, + uint32_t desc_handle, + uint32_t feed_handle); +int vrend_video_end_frame(struct vrend_video_context *ctx, + uint32_t cdc_handle, + uint32_t tgt_handle); + +#endif /* VREND_VIDEO_H */ diff --git a/src/vrend_winsys.c b/src/vrend_winsys.c index 9371e81f..6a73b7fd 100644 --- a/src/vrend_winsys.c +++ b/src/vrend_winsys.c @@ -166,15 +166,24 @@ void vrend_winsys_destroy_context(virgl_renderer_gl_context ctx) int vrend_winsys_make_context_current(virgl_renderer_gl_context ctx) { + int ret = -1; #ifdef HAVE_EPOXY_EGL_H - if (use_context == CONTEXT_EGL) - return virgl_egl_make_context_current(egl, ctx); + if (use_context == CONTEXT_EGL) { + ret = virgl_egl_make_context_current(egl, ctx); + if (ret) + vrend_printf("%s: Error switching context: %s\n", + __func__, virgl_egl_error_string(eglGetError())); + } #endif #ifdef HAVE_EPOXY_GLX_H - if (use_context == CONTEXT_GLX) - return virgl_glx_make_context_current(glx_info, ctx); + if (use_context == CONTEXT_GLX) { + ret = virgl_glx_make_context_current(glx_info, ctx); + if (ret) + vrend_printf("%s: Error switching context\n", __func__); + } #endif - return -1; + assert(!ret && "Failed to switch GL context"); + return ret; } int vrend_winsys_has_gl_colorspace(void) @@ -186,7 +195,8 @@ int vrend_winsys_has_gl_colorspace(void) #endif return use_context == CONTEXT_NONE || use_context == CONTEXT_GLX || - (use_context == CONTEXT_EGL && egl_colorspace); + (use_context == CONTEXT_EGL && egl_colorspace) || + (use_context == CONTEXT_EGL_EXTERNAL && egl_colorspace); } int vrend_winsys_get_fourcc_for_texture(uint32_t tex_id, uint32_t format, int *fourcc) diff --git a/src/vrend_winsys_egl.c b/src/vrend_winsys_egl.c index 1982a764..4b38d5ea 100644 --- a/src/vrend_winsys_egl.c +++ b/src/vrend_winsys_egl.c @@ -33,7 +33,9 @@ #define EGL_EGLEXT_PROTOTYPES #include <errno.h> #include <fcntl.h> +#include <poll.h> #include <stdbool.h> +#include <unistd.h> #include <xf86drm.h> #include "util/u_memory.h" @@ -428,6 +430,9 @@ struct virgl_egl *virgl_egl_init_external(EGLDisplay egl_display) return NULL; } + gbm = virgl_gbm_init(-1); + egl->gbm = gbm; + return egl; } @@ -457,7 +462,7 @@ int virgl_egl_make_context_current(struct virgl_egl *egl, virgl_renderer_gl_cont EGLContext egl_ctx = (EGLContext)virglctx; return eglMakeCurrent(egl->egl_display, EGL_NO_SURFACE, EGL_NO_SURFACE, - egl_ctx); + egl_ctx) ? 0 : -1; } virgl_renderer_gl_context virgl_egl_get_current_context(UNUSED struct virgl_egl *egl) @@ -731,13 +736,38 @@ void virgl_egl_fence_destroy(struct virgl_egl *egl, EGLSyncKHR fence) { eglDestroySyncKHR(egl->egl_display, fence); } -bool virgl_egl_client_wait_fence(struct virgl_egl *egl, EGLSyncKHR fence, uint64_t timeout) +bool virgl_egl_client_wait_fence(struct virgl_egl *egl, EGLSyncKHR fence, bool blocking) { - EGLint ret = eglClientWaitSyncKHR(egl->egl_display, fence, 0, timeout); - if (ret == EGL_FALSE) { - vrend_printf("wait sync failed\n"); + /* attempt to poll the native fence fd instead of eglClientWaitSyncKHR() to + * avoid Mesa's eglapi global-display-lock synchronizing vrend's sync_thread. + */ + int fd = -1; + if (!virgl_egl_export_fence(egl, fence, &fd)) { + EGLint egl_result = eglClientWaitSyncKHR(egl->egl_display, fence, 0, + blocking ? EGL_FOREVER_KHR : 0); + if (egl_result == EGL_FALSE) + vrend_printf("wait sync failed\n"); + return egl_result != EGL_TIMEOUT_EXPIRED_KHR; } - return ret != EGL_TIMEOUT_EXPIRED_KHR; + assert(fd >= 0); + + int ret; + struct pollfd pfd = { + .fd = fd, + .events = POLLIN, + }; + do { + ret = poll(&pfd, 1, blocking ? -1 : 0); + if (ret > 0 && (pfd.revents & (POLLERR | POLLNVAL))) { + ret = -1; + break; + } + } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); + close(fd); + + if (ret < 0) + vrend_printf("wait sync failed\n"); + return ret != 0; } bool virgl_egl_export_signaled_fence(struct virgl_egl *egl, int *out_fd) { @@ -753,3 +783,27 @@ bool virgl_egl_different_gpu(struct virgl_egl *egl) { return egl->different_gpu; } + +const char *virgl_egl_error_string(EGLint error) +{ + switch (error) { +#define CASE_STR( value ) case value: return #value; + CASE_STR( EGL_SUCCESS ) + CASE_STR( EGL_NOT_INITIALIZED ) + CASE_STR( EGL_BAD_ACCESS ) + CASE_STR( EGL_BAD_ALLOC ) + CASE_STR( EGL_BAD_ATTRIBUTE ) + CASE_STR( EGL_BAD_CONTEXT ) + CASE_STR( EGL_BAD_CONFIG ) + CASE_STR( EGL_BAD_CURRENT_SURFACE ) + CASE_STR( EGL_BAD_DISPLAY ) + CASE_STR( EGL_BAD_SURFACE ) + CASE_STR( EGL_BAD_MATCH ) + CASE_STR( EGL_BAD_PARAMETER ) + CASE_STR( EGL_BAD_NATIVE_PIXMAP ) + CASE_STR( EGL_BAD_NATIVE_WINDOW ) + CASE_STR( EGL_CONTEXT_LOST ) +#undef CASE_STR + default: return "Unknown error"; + } +} diff --git a/src/vrend_winsys_egl.h b/src/vrend_winsys_egl.h index 0ef3e4eb..132e2154 100644 --- a/src/vrend_winsys_egl.h +++ b/src/vrend_winsys_egl.h @@ -75,8 +75,9 @@ void *virgl_egl_aux_plane_image_from_gbm_bo(struct virgl_egl *egl, struct gbm_bo bool virgl_egl_supports_fences(struct virgl_egl *egl); EGLSyncKHR virgl_egl_fence_create(struct virgl_egl *egl); void virgl_egl_fence_destroy(struct virgl_egl *egl, EGLSyncKHR fence); -bool virgl_egl_client_wait_fence(struct virgl_egl *egl, EGLSyncKHR fence, uint64_t timeout); +bool virgl_egl_client_wait_fence(struct virgl_egl *egl, EGLSyncKHR fence, bool blocking); bool virgl_egl_export_signaled_fence(struct virgl_egl *egl, int *out_fd); bool virgl_egl_export_fence(struct virgl_egl *egl, EGLSyncKHR fence, int *out_fd); bool virgl_egl_different_gpu(struct virgl_egl *egl); +const char *virgl_egl_error_string(EGLint error); #endif diff --git a/src/vrend_winsys_glx.c b/src/vrend_winsys_glx.c index 5b907ad6..66703749 100644 --- a/src/vrend_winsys_glx.c +++ b/src/vrend_winsys_glx.c @@ -100,7 +100,7 @@ void virgl_glx_destroy_context(struct virgl_glx *d, virgl_renderer_gl_context vi int virgl_glx_make_context_current(struct virgl_glx *d, virgl_renderer_gl_context virglctx) { - return glXMakeContextCurrent(d->display, d->pbuffer, d->pbuffer, virglctx); + return glXMakeContextCurrent(d->display, d->pbuffer, d->pbuffer, virglctx) ? 0 : -1; } uint32_t virgl_glx_query_video_memory(struct virgl_glx *d) @@ -113,4 +113,4 @@ uint32_t virgl_glx_query_video_memory(struct virgl_glx *d) } return video_memory; -}
\ No newline at end of file +} diff --git a/tests/fuzzer/meson.build b/tests/fuzzer/meson.build index 5ea892ca..596f89b5 100644 --- a/tests/fuzzer/meson.build +++ b/tests/fuzzer/meson.build @@ -32,16 +32,6 @@ virgl_fuzzer = executable( dependencies : [libvirglrenderer_dep, gallium_dep, epoxy_dep] ) -if with_venus - virgl_venus_fuzzer = executable( - 'virgl_venus_fuzzer', - 'virgl_venus_fuzzer.c', - c_args : [ '-fsanitize=fuzzer' ], - link_args : [ '-fsanitize=fuzzer' ], - dependencies : [libvirglrenderer_dep] - ) -endif - if with_drm virgl_drm_fuzzer = executable( 'virgl_drm_fuzzer', diff --git a/tests/fuzzer/virgl_drm_fuzzer.c b/tests/fuzzer/virgl_drm_fuzzer.c index 56270942..2a38a4af 100644 --- a/tests/fuzzer/virgl_drm_fuzzer.c +++ b/tests/fuzzer/virgl_drm_fuzzer.c @@ -34,7 +34,7 @@ fuzz_debug_callback(UNUSED const char *fmt, UNUSED va_list ap) static void fuzz_write_context_fence(UNUSED void *cookie, UNUSED uint32_t ctx_id, - UNUSED uint64_t queue_id, + UNUSED uint32_t ring_idx, UNUSED uint64_t fence_id) { diff --git a/tests/fuzzer/virgl_venus_fuzzer.c b/tests/fuzzer/virgl_venus_fuzzer.c deleted file mode 100644 index 49cfb4e4..00000000 --- a/tests/fuzzer/virgl_venus_fuzzer.c +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright 2021 Google LLC - * SPDX-License-Identifier: MIT - */ - -#include <stdbool.h> -#include <stddef.h> -#include <stdint.h> -#include <stdlib.h> - -#include "util/macros.h" -#include "virglrenderer.h" -#include "virglrenderer_hw.h" - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size); - -struct fuzz_renderer { - bool initialized; -}; - -static void -fuzz_atexit_callback(void) -{ - virgl_renderer_cleanup(NULL); -} - -static void -fuzz_debug_callback(UNUSED const char *fmt, UNUSED va_list ap) -{ - /* no logging */ -} - -static struct fuzz_renderer * -fuzz_renderer_get(void) -{ - static struct fuzz_renderer renderer; - if (renderer.initialized) - return &renderer; - - int ret = - virgl_renderer_init(NULL, VIRGL_RENDERER_VENUS | VIRGL_RENDERER_NO_VIRGL, NULL); - if (ret) - abort(); - - virgl_set_debug_callback(fuzz_debug_callback); - - atexit(fuzz_atexit_callback); - - renderer.initialized = true; - return &renderer; -} - -static uint32_t -fuzz_context_create(UNUSED struct fuzz_renderer *renderer) -{ - const uint32_t ctx_id = 1; - const char name[] = "virgl_venus_fuzzer"; - int ret = virgl_renderer_context_create_with_flags(ctx_id, VIRGL_RENDERER_CAPSET_VENUS, - sizeof(name), name); - if (ret) - abort(); - - return ctx_id; -} - -static void -fuzz_context_destroy(UNUSED struct fuzz_renderer *renderer, uint32_t ctx_id) -{ - virgl_renderer_context_destroy(ctx_id); -} - -static void -fuzz_context_submit(UNUSED struct fuzz_renderer *renderer, - uint32_t ctx_id, - const uint8_t *data, - size_t size) -{ - virgl_renderer_submit_cmd((void *)data, ctx_id, size / 4); -} - -int -LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) -{ - struct fuzz_renderer *renderer = fuzz_renderer_get(); - - const uint32_t ctx_id = fuzz_context_create(renderer); - fuzz_context_submit(renderer, ctx_id, data, size); - fuzz_context_destroy(renderer, ctx_id); - - return 0; -} diff --git a/vtest/vtest_fuzzer.c b/vtest/vtest_fuzzer.c index 89b12b29..7505f149 100644 --- a/vtest/vtest_fuzzer.c +++ b/vtest/vtest_fuzzer.c @@ -152,7 +152,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) int out_fd = open("/dev/null", O_WRONLY); struct vtest_buffer buffer; - buffer.buffer = data; + buffer.buffer = (char *)data; buffer.size = size; struct vtest_input input; input.data.buffer = &buffer; diff --git a/vtest/vtest_protocol.h b/vtest/vtest_protocol.h index f31b8e47..c48be146 100644 --- a/vtest/vtest_protocol.h +++ b/vtest/vtest_protocol.h @@ -153,7 +153,7 @@ #ifdef VIRGL_RENDERER_UNSTABLE_APIS enum vcmd_param { - VCMD_PARAM_MAX_SYNC_QUEUE_COUNT = 1, + VCMD_PARAM_MAX_TIMELINE_COUNT = 1, }; #define VCMD_GET_PARAM_SIZE 1 #define VCMD_GET_PARAM_PARAM 0 @@ -217,7 +217,7 @@ enum vcmd_sync_wait_flag { /* resp poll'able fd */ enum vcmd_submit_cmd2_flag { - VCMD_SUBMIT_CMD2_FLAG_SYNC_QUEUE = 1 << 0, + VCMD_SUBMIT_CMD2_FLAG_RING_IDX = 1 << 0, }; struct vcmd_submit_cmd2_batch { @@ -230,9 +230,8 @@ struct vcmd_submit_cmd2_batch { uint32_t sync_offset; uint32_t sync_count; - /* ignored unless VCMD_SUBMIT_CMD2_FLAG_SYNC_QUEUE is set */ - uint32_t sync_queue_index; - uint64_t sync_queue_id; + /* ignored unless VCMD_SUBMIT_CMD2_FLAG_RING_IDX is set */ + uint32_t ring_idx; }; #define VCMD_SUBMIT_CMD2_BATCH_COUNT 0 #define VCMD_SUBMIT_CMD2_BATCH_FLAGS(n) (1 + 8 * (n) + 0) @@ -240,9 +239,7 @@ struct vcmd_submit_cmd2_batch { #define VCMD_SUBMIT_CMD2_BATCH_CMD_SIZE(n) (1 + 8 * (n) + 2) #define VCMD_SUBMIT_CMD2_BATCH_SYNC_OFFSET(n) (1 + 8 * (n) + 3) #define VCMD_SUBMIT_CMD2_BATCH_SYNC_COUNT(n) (1 + 8 * (n) + 4) -#define VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_INDEX(n) (1 + 8 * (n) + 5) -#define VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_ID_LO(n) (1 + 8 * (n) + 6) -#define VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_ID_HI(n) (1 + 8 * (n) + 7) +#define VCMD_SUBMIT_CMD2_BATCH_RING_IDX(n) (1 + 8 * (n) + 5) #endif /* VIRGL_RENDERER_UNSTABLE_APIS */ diff --git a/vtest/vtest_renderer.c b/vtest/vtest_renderer.c index c44c78d4..dc9ba19c 100644 --- a/vtest/vtest_renderer.c +++ b/vtest/vtest_renderer.c @@ -56,7 +56,7 @@ #include "util/u_pointer.h" #include "util/u_hash_table.h" -#define VTEST_MAX_SYNC_QUEUE_COUNT 64 +#define VTEST_MAX_TIMELINE_COUNT 64 struct vtest_resource { struct list_head head; @@ -76,14 +76,14 @@ struct vtest_sync { uint64_t value; }; -struct vtest_sync_queue { +struct vtest_timeline { struct list_head submits; }; -struct vtest_sync_queue_submit { +struct vtest_timeline_submit { struct list_head head; - struct vtest_sync_queue *sync_queue; + struct vtest_timeline *timeline; uint32_t count; struct vtest_sync **syncs; @@ -122,7 +122,7 @@ struct vtest_context { struct util_hash_table *resource_table; struct util_hash_table *sync_table; - struct vtest_sync_queue sync_queues[VTEST_MAX_SYNC_QUEUE_COUNT]; + struct vtest_timeline timelines[VTEST_MAX_TIMELINE_COUNT]; struct list_head sync_waits; }; @@ -165,16 +165,16 @@ static void vtest_write_implicit_fence(UNUSED void *cookie, uint32_t fence_id_in renderer->implicit_fence_completed = fence_id_in; } -static void vtest_signal_sync_queue(struct vtest_sync_queue *queue, - struct vtest_sync_queue_submit *to_submit); +static void vtest_signal_timeline(struct vtest_timeline *timeline, + struct vtest_timeline_submit *to_submit); static void vtest_write_context_fence(UNUSED void *cookie, UNUSED uint32_t ctx_id, - UNUSED uint64_t queue_id, + UNUSED uint32_t ring_idx, uint64_t fence_id) { - struct vtest_sync_queue_submit *submit = (void*)(uintptr_t)fence_id; - vtest_signal_sync_queue(submit->sync_queue, submit); + struct vtest_timeline_submit *submit = (void*)(uintptr_t)fence_id; + vtest_signal_timeline(submit->timeline, submit); } static int vtest_get_drm_fd(void *cookie) @@ -279,7 +279,7 @@ static void vtest_unref_sync(struct vtest_sync *sync) list_add(&sync->head, &renderer.free_syncs); } -static void vtest_free_sync_queue_submit(struct vtest_sync_queue_submit *submit) +static void vtest_free_timeline_submit(struct vtest_timeline_submit *submit) { uint32_t i; for (i = 0; i < submit->count; i++) @@ -299,23 +299,17 @@ static void vtest_free_sync_wait(struct vtest_sync_wait *wait) free(wait); } -static unsigned -u32_hash_func(void *key) +static uint32_t +u32_hash_func(const void *key) { intptr_t ip = pointer_to_intptr(key); - return (unsigned)(ip & 0xffffffff); + return (uint32_t)(ip & 0xffffffff); } -static int -u32_compare_func(void *key1, void *key2) +static bool +u32_equal_func(const void *key1, const void *key2) { - if (key1 < key2) { - return -1; - } else if (key1 > key2) { - return 1; - } else { - return 0; - } + return key1 == key2; } static void @@ -523,7 +517,7 @@ static struct vtest_context *vtest_new_context(struct vtest_input *input, } ctx->resource_table = util_hash_table_create(u32_hash_func, - u32_compare_func, + u32_equal_func, resource_destroy_func); if (!ctx->resource_table) { free(ctx); @@ -531,7 +525,7 @@ static struct vtest_context *vtest_new_context(struct vtest_input *input, } ctx->sync_table = util_hash_table_create(u32_hash_func, - u32_compare_func, + u32_equal_func, sync_destroy_func); if (!ctx->sync_table) { util_hash_table_destroy(ctx->resource_table); @@ -539,9 +533,9 @@ static struct vtest_context *vtest_new_context(struct vtest_input *input, return NULL; } - for (i = 0; i < VTEST_MAX_SYNC_QUEUE_COUNT; i++) { - struct vtest_sync_queue *queue = &ctx->sync_queues[i]; - list_inithead(&queue->submits); + for (i = 0; i < VTEST_MAX_TIMELINE_COUNT; i++) { + struct vtest_timeline *timeline = &ctx->timelines[i]; + list_inithead(&timeline->submits); } list_inithead(&ctx->sync_waits); @@ -651,13 +645,13 @@ void vtest_destroy_context(struct vtest_context *ctx) } list_del(&ctx->head); - for (i = 0; i < VTEST_MAX_SYNC_QUEUE_COUNT; i++) { - struct vtest_sync_queue *queue = &ctx->sync_queues[i]; - struct vtest_sync_queue_submit *submit, *submit_tmp; + for (i = 0; i < VTEST_MAX_TIMELINE_COUNT; i++) { + struct vtest_timeline *timeline = &ctx->timelines[i]; + struct vtest_timeline_submit *submit, *submit_tmp; - LIST_FOR_EACH_ENTRY_SAFE(submit, submit_tmp, &queue->submits, head) - vtest_free_sync_queue_submit(submit); - list_inithead(&queue->submits); + LIST_FOR_EACH_ENTRY_SAFE(submit, submit_tmp, &timeline->submits, head) + vtest_free_timeline_submit(submit); + list_inithead(&timeline->submits); } LIST_FOR_EACH_ENTRY_SAFE(wait, wait_tmp, &ctx->sync_waits, head) { @@ -783,12 +777,12 @@ int vtest_get_param(UNUSED uint32_t length_dw) resp_buf[VTEST_CMD_ID] = VCMD_GET_PARAM; resp = &resp_buf[VTEST_CMD_DATA_START]; switch (param) { - case VCMD_PARAM_MAX_SYNC_QUEUE_COUNT: + case VCMD_PARAM_MAX_TIMELINE_COUNT: resp[0] = true; /* TODO until we have a timerfd */ #ifdef HAVE_EVENTFD_H if (!getenv("VIRGL_DISABLE_MT")) - resp[1] = VTEST_MAX_SYNC_QUEUE_COUNT; + resp[1] = VTEST_MAX_TIMELINE_COUNT; else resp[1] = 0; #else @@ -909,7 +903,7 @@ int vtest_send_caps2(UNUSED uint32_t length_dw) goto end; } - vtest_block_write(ctx->out_fd, caps_buf, max_size); + ret = vtest_block_write(ctx->out_fd, caps_buf, max_size); if (ret < 0) { goto end; } @@ -943,7 +937,7 @@ int vtest_send_caps(UNUSED uint32_t length_dw) goto end; } - vtest_block_write(ctx->out_fd, caps_buf, max_size); + ret = vtest_block_write(ctx->out_fd, caps_buf, max_size); if (ret < 0) { goto end; } @@ -1181,6 +1175,7 @@ int vtest_resource_create_blob(UNUSED uint32_t length_dw) fd = -1; break; default: + vtest_unref_resource(res); return -EINVAL; } @@ -1677,6 +1672,20 @@ static uint64_t vtest_gettime(uint32_t offset_ms) return ns + ns_per_ms * offset_ms; } +static inline void write_ready(int fd) +{ +#ifdef __GNUC__ +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wunused-result" +#endif + static const uint64_t val = 1; + write(fd, &val, sizeof(val)); +#ifdef __GNUC__ +# pragma GCC diagnostic pop +#endif +} + + /* TODO this is slow */ static void vtest_signal_sync(struct vtest_sync *sync, uint64_t value) { @@ -1720,22 +1729,20 @@ static void vtest_signal_sync(struct vtest_sync *sync, uint64_t value) } if (is_ready) { - const uint64_t val = 1; - list_del(&wait->head); - write(wait->fd, &val, sizeof(val)); + write_ready(wait->fd); vtest_free_sync_wait(wait); } } } } -static void vtest_signal_sync_queue(struct vtest_sync_queue *queue, - struct vtest_sync_queue_submit *to_submit) +static void vtest_signal_timeline(struct vtest_timeline *timeline, + struct vtest_timeline_submit *to_submit) { - struct vtest_sync_queue_submit *submit, *tmp; + struct vtest_timeline_submit *submit, *tmp; - LIST_FOR_EACH_ENTRY_SAFE(submit, tmp, &queue->submits, head) { + LIST_FOR_EACH_ENTRY_SAFE(submit, tmp, &timeline->submits, head) { uint32_t i; list_del(&submit->head); @@ -1971,18 +1978,15 @@ int vtest_sync_wait(uint32_t length_dw) sync_wait_buf + 2, sync_count); free(sync_wait_buf); - if (ret) { - free(wait); + if (ret) return ret; - } is_ready = !wait->count; if ((wait->flags & VCMD_SYNC_WAIT_FLAG_ANY) && wait->count < sync_count) is_ready = true; if (is_ready) { - const uint64_t val = 1; - write(wait->fd, &val, sizeof(val)); + write_ready(wait->fd); } resp_buf[VTEST_CMD_LEN] = 0; @@ -2004,7 +2008,7 @@ static int vtest_submit_cmd2_batch(struct vtest_context *ctx, const uint32_t *cmds, const uint32_t *syncs) { - struct vtest_sync_queue_submit *submit = NULL; + struct vtest_timeline_submit *submit = NULL; uint32_t i; int ret; @@ -2015,7 +2019,7 @@ static int vtest_submit_cmd2_batch(struct vtest_context *ctx, if (!batch->sync_count) return 0; - if (batch->flags & VCMD_SUBMIT_CMD2_FLAG_SYNC_QUEUE) { + if (batch->flags & VCMD_SUBMIT_CMD2_FLAG_RING_IDX) { submit = malloc(sizeof(*submit) + sizeof(*submit->syncs) * batch->sync_count + sizeof(*submit->values) * batch->sync_count); @@ -2049,25 +2053,25 @@ static int vtest_submit_cmd2_batch(struct vtest_context *ctx, if (i < batch->sync_count) { if (submit) { submit->count = i; - vtest_free_sync_queue_submit(submit); + vtest_free_timeline_submit(submit); } return -EEXIST; } if (submit) { - struct vtest_sync_queue *queue = &ctx->sync_queues[batch->sync_queue_index]; + struct vtest_timeline *timeline = &ctx->timelines[batch->ring_idx]; - submit->sync_queue = queue; + submit->timeline = timeline; ret = virgl_renderer_context_create_fence(ctx->ctx_id, VIRGL_RENDERER_FENCE_FLAG_MERGEABLE, - batch->sync_queue_id, + batch->ring_idx, (uintptr_t)submit); if (ret) { - vtest_free_sync_queue_submit(submit); + vtest_free_timeline_submit(submit); return ret; } - list_addtail(&submit->head, &queue->submits); + list_addtail(&submit->head, &timeline->submits); } return 0; @@ -2095,7 +2099,7 @@ int vtest_submit_cmd2(uint32_t length_dw) } batch_count = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_COUNT]; - if (VCMD_SUBMIT_CMD2_BATCH_COUNT + 8 * batch_count > length_dw) { + if (VCMD_SUBMIT_CMD2_BATCH_COUNT + 6 * batch_count > length_dw) { free(submit_cmd2_buf); return -EINVAL; } @@ -2107,16 +2111,14 @@ int vtest_submit_cmd2(uint32_t length_dw) .cmd_size = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_CMD_SIZE(i)], .sync_offset = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_SYNC_OFFSET(i)], .sync_count = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_SYNC_COUNT(i)], - .sync_queue_index = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_INDEX(i)], - .sync_queue_id = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_ID_LO(i)] | - (uint64_t)submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_SYNC_QUEUE_ID_HI(i)] << 32, + .ring_idx = submit_cmd2_buf[VCMD_SUBMIT_CMD2_BATCH_RING_IDX(i)], }; const uint32_t *cmds = &submit_cmd2_buf[batch.cmd_offset]; const uint32_t *syncs = &submit_cmd2_buf[batch.sync_offset]; if (batch.cmd_offset + batch.cmd_size > length_dw || batch.sync_offset + batch.sync_count * 3 > length_dw || - batch.sync_queue_index >= VTEST_MAX_SYNC_QUEUE_COUNT) { + batch.ring_idx >= VTEST_MAX_TIMELINE_COUNT) { free(submit_cmd2_buf); return -EINVAL; } diff --git a/vtest/vtest_server.c b/vtest/vtest_server.c index bb9ceec1..a6339aad 100644 --- a/vtest/vtest_server.c +++ b/vtest/vtest_server.c @@ -165,6 +165,7 @@ while (__AFL_LOOP(1000)) { #define OPT_RENDERNODE 'r' #define OPT_VENUS 'v' #define OPT_RENDER_SERVER 'n' +#define OPT_SOCKET_PATH 'p' static void vtest_server_parse_args(int argc, char **argv) { @@ -180,6 +181,7 @@ static void vtest_server_parse_args(int argc, char **argv) {"rendernode", required_argument, NULL, OPT_RENDERNODE}, {"venus", no_argument, NULL, OPT_VENUS}, {"render-server", no_argument, NULL, OPT_RENDER_SERVER}, + {"socket-path", optional_argument, NULL, OPT_SOCKET_PATH}, {0, 0, 0, 0} }; @@ -225,10 +227,13 @@ static void vtest_server_parse_args(int argc, char **argv) server.render_server = true; break; #endif + case OPT_SOCKET_PATH: + server.socket_name = optarg; + break; default: printf("Usage: %s [--no-fork] [--no-loop-or-fork] [--multi-clients] " "[--use-glx] [--use-egl-surfaceless] [--use-gles] " - "[--rendernode <dev>]" + "[--rendernode <dev>] [--socket-path <path>] " #ifdef ENABLE_VENUS " [--venus]" #endif |