blob: 03f419874e0304eaa177ae1085a3efca7d721f15 [file] [log] [blame]
// Copyright (C) 2018 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef __COMMON_EMULATOR_FEATURE_INFO_H
#define __COMMON_EMULATOR_FEATURE_INFO_H
// SyncImpl determines the presence of host/guest OpenGL fence sync
// capabilities. It corresponds exactly to EGL_ANDROID_native_fence_sync
// capability, but for the emulator, we need to make sure that
// OpenGL pipe protocols match, so we use a special extension name
// here.
// SYNC_IMPL_NONE means that the native fence sync capability is
// not present, and we will end up using the equivalent of glFinish
// in order to preserve buffer swapping order.
// SYNC_IMPL_NATIVE_SYNC means that we do have native fence sync
// capability, and we will use a fence fd to synchronize buffer swaps.
enum SyncImpl {
SYNC_IMPL_NONE = 0,
SYNC_IMPL_NATIVE_SYNC_V2 = 1, // ANDROID_native_fence_sync
SYNC_IMPL_NATIVE_SYNC_V3 = 2, // KHR_wait_sync
SYNC_IMPL_NATIVE_SYNC_V4 = 3, // Correct eglGetSyncAttribKHR
};
// Interface for native sync:
// Use the highest that shows up
static const char kRCNativeSyncV2[] = "ANDROID_EMU_native_sync_v2";
static const char kRCNativeSyncV3[] = "ANDROID_EMU_native_sync_v3";
static const char kRCNativeSyncV4[] = "ANDROID_EMU_native_sync_v4";
// DMA for OpenGL
enum DmaImpl {
DMA_IMPL_NONE = 0,
DMA_IMPL_v1 = 1,
};
static const char kDmaExtStr_v1[] = "ANDROID_EMU_dma_v1";
// OpenGL ES max supported version
enum GLESMaxVersion {
GLES_MAX_VERSION_2 = 0,
GLES_MAX_VERSION_3_0 = 1,
GLES_MAX_VERSION_3_1 = 2,
GLES_MAX_VERSION_3_2 = 3,
};
static const char kGLESMaxVersion_2[] = "ANDROID_EMU_gles_max_version_2";
static const char kGLESMaxVersion_3_0[] = "ANDROID_EMU_gles_max_version_3_0";
static const char kGLESMaxVersion_3_1[] = "ANDROID_EMU_gles_max_version_3_1";
static const char kGLESMaxVersion_3_2[] = "ANDROID_EMU_gles_max_version_3_2";
enum HostComposition {
HOST_COMPOSITION_NONE = 0,
HOST_COMPOSITION_V1,
HOST_COMPOSITION_V2,
};
static const char kHostCompositionV1[] = "ANDROID_EMU_host_composition_v1";
static const char kHostCompositionV2[] = "ANDROID_EMU_host_composition_v2";
// No querying errors from host extension
static const char kGLESNoHostError[] = "ANDROID_EMU_gles_no_host_error";
// Host to guest memory mapping
static const char kGLDirectMem[] = "ANDROID_EMU_direct_mem";
// Vulkan host support
// To be delivered/enabled when at least the following is working/available:
// - HOST_COHERENT memory mapping
// - Full gralloc interop: External memory, AHB
static const char kVulkan[] = "ANDROID_EMU_vulkan";
// Deferred Vulkan commands
static const char kDeferredVulkanCommands[] = "ANDROID_EMU_deferred_vulkan_commands";
// Vulkan null optional strings
static const char kVulkanNullOptionalStrings[] = "ANDROID_EMU_vulkan_null_optional_strings";
// Vulkan create resources with requirements
static const char kVulkanCreateResourcesWithRequirements[] = "ANDROID_EMU_vulkan_create_resources_with_requirements";
// Vulkan ignored handles
static const char kVulkanIgnoredHandles[] = "ANDROID_EMU_vulkan_ignored_handles";
// YUV host cache
static const char kYUVCache[] = "ANDROID_EMU_YUV_Cache";
// GL protocol v2
static const char kAsyncUnmapBuffer[] = "ANDROID_EMU_async_unmap_buffer";
// virtio-gpu-next
static const char kVirtioGpuNext[] = "ANDROID_EMU_virtio_gpu_next";
static const char kHasSharedSlotsHostMemoryAllocator[] = "ANDROID_EMU_has_shared_slots_host_memory_allocator";
// Vulkan free memory sync
static const char kVulkanFreeMemorySync[] = "ANDROID_EMU_vulkan_free_memory_sync";
// virtio-gpu syncfd support
static const char kVirtioGpuNativeSync[] = "ANDROID_EMU_virtio_gpu_native_sync";
// Vulkan extension that required a protocol update (new marshaling structs)
static const char kVulkanShaderFloat16Int8[] = "ANDROID_EMU_vulkan_shader_float16_int8";
// Vulkan async queue submit
static const char kVulkanAsyncQueueSubmit[] = "ANDROID_EMU_vulkan_async_queue_submit";
// A flag to _not_ ignore host opengl errors (now host opengl errors are ignored by default)
static const char kGLESUseHostError[] = "ANDROID_EMU_gles_use_host_error";
// Host side tracing
static const char kHostSideTracing[] = "ANDROID_EMU_host_side_tracing";
// Make current async
static const char kAsyncFrameCommands[] = "ANDROID_EMU_async_frame_commands";
// Queue submit with commands
static const char kVulkanQueueSubmitWithCommands[] = "ANDROID_EMU_vulkan_queue_submit_with_commands";
//
// Synchronized glBufferData call
static const char kSyncBufferData[] = "ANDROID_EMU_sync_buffer_data";
// Batched descriptor set update
static const char kVulkanBatchedDescriptorSetUpdate[] = "ANDROID_EMU_vulkan_batched_descriptor_set_update";
// Async QSRI
static const char kVulkanAsyncQsri[] = "ANDROID_EMU_vulkan_async_qsri";
// DMA for readback
static const char kReadColorBufferDma[] = "ANDROID_EMU_read_color_buffer_dma";
// HWC multiple display configs
static const char kHWCMultiConfigs[] = "ANDROID_EMU_hwc_multi_configs";
// Vulkan auxiliary command memory
static const char kVulkanAuxCommandMemory[] = "ANDROID_EMU_vulkan_aux_command_memory";
// Struct describing available emulator features
struct EmulatorFeatureInfo {
EmulatorFeatureInfo() :
syncImpl(SYNC_IMPL_NONE),
dmaImpl(DMA_IMPL_NONE),
hostComposition(HOST_COMPOSITION_NONE),
glesMaxVersion(GLES_MAX_VERSION_2),
hasDirectMem(false),
hasVulkan(false),
hasDeferredVulkanCommands(false),
hasVulkanNullOptionalStrings(false),
hasVulkanCreateResourcesWithRequirements(false),
hasVulkanIgnoredHandles(false),
hasYUVCache (false),
hasAsyncUnmapBuffer (false),
hasVirtioGpuNext (false),
hasSharedSlotsHostMemoryAllocator(false),
hasVulkanFreeMemorySync(false),
hasVirtioGpuNativeSync(false),
hasVulkanShaderFloat16Int8(false),
hasVulkanAsyncQueueSubmit(false),
hasHostSideTracing(false),
hasAsyncFrameCommands(false),
hasVulkanQueueSubmitWithCommands(false),
hasVulkanBatchedDescriptorSetUpdate(false),
hasSyncBufferData(false),
hasVulkanAsyncQsri(false),
hasReadColorBufferDma(false),
hasHWCMultiConfigs(false),
hasVulkanAuxCommandMemory(false)
{ }
SyncImpl syncImpl;
DmaImpl dmaImpl;
HostComposition hostComposition;
GLESMaxVersion glesMaxVersion;
bool hasDirectMem;
bool hasVulkan;
bool hasDeferredVulkanCommands;
bool hasVulkanNullOptionalStrings;
bool hasVulkanCreateResourcesWithRequirements;
bool hasVulkanIgnoredHandles;
bool hasYUVCache;
bool hasAsyncUnmapBuffer;
bool hasVirtioGpuNext;
bool hasSharedSlotsHostMemoryAllocator;
bool hasVulkanFreeMemorySync;
bool hasVirtioGpuNativeSync;
bool hasVulkanShaderFloat16Int8;
bool hasVulkanAsyncQueueSubmit;
bool hasHostSideTracing;
bool hasAsyncFrameCommands;
bool hasVulkanQueueSubmitWithCommands;
bool hasVulkanBatchedDescriptorSetUpdate;
bool hasSyncBufferData;
bool hasVulkanAsyncQsri;
bool hasReadColorBufferDma;
bool hasHWCMultiConfigs;
bool hasVulkanAuxCommandMemory; // This feature tracks if vulkan command buffers should be stored in an auxiliary shared memory
};
enum HostConnectionType {
HOST_CONNECTION_TCP = 0,
HOST_CONNECTION_QEMU_PIPE = 1,
HOST_CONNECTION_ADDRESS_SPACE = 2,
HOST_CONNECTION_VIRTIO_GPU_PIPE = 3,
HOST_CONNECTION_VIRTIO_GPU_ADDRESS_SPACE = 4,
};
enum GrallocType {
GRALLOC_TYPE_RANCHU = 0,
GRALLOC_TYPE_MINIGBM = 1,
GRALLOC_TYPE_DYN_ALLOC_MINIGBM = 2,
};
#endif // __COMMON_EMULATOR_FEATURE_INFO_H