Snap for 5511022 from 872613d9c5b00b93db0eea1c64765ee1d5c1480e to qt-release
Change-Id: I67ffcc64757152b4e99e5e4798ae721b91bc985a
diff --git a/BUILD.gn b/BUILD.gn
index 385ae8d..a6da1bd 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -99,16 +99,15 @@
]
deps = [
- "//zircon/public/fidl/fuchsia-hardware-goldfish:fuchsia-hardware-goldfish_c",
+ "//zircon/public/fidl/fuchsia-hardware-goldfish-address-space:fuchsia-hardware-goldfish-address-space_c",
"//zircon/public/fidl/fuchsia-sysmem",
"//zircon/public/lib/fdio",
- "//zircon/public/lib/fzl",
"//zircon/public/lib/trace",
]
defines += [
- "QEMU_PIPE_PATH=\"/dev/sys/platform/acpi/goldfish/goldfish-pipe\"",
- "GOLDFISH_ADDRESS_SPACE_DEVICE_NAME=\"/dev/sys/platform/acpi/goldfish/goldfish-pipe\"",
+ "QEMU_PIPE_PATH=\"/dev/class/goldfish-pipe/000\"",
+ "GOLDFISH_ADDRESS_SPACE_DEVICE_NAME=\"/dev/class/goldfish-address-space/000\"",
]
}
}
diff --git a/shared/OpenglCodecCommon/goldfish_address_space.cpp b/shared/OpenglCodecCommon/goldfish_address_space.cpp
index afa6b85..bbc59c6 100644
--- a/shared/OpenglCodecCommon/goldfish_address_space.cpp
+++ b/shared/OpenglCodecCommon/goldfish_address_space.cpp
@@ -127,8 +127,9 @@
}
#elif __Fuchsia__
#include <fcntl.h>
-#include <fuchsia/hardware/goldfish/c/fidl.h>
-#include <lib/fzl/fdio.h>
+#include <fuchsia/hardware/goldfish/address/space/c/fidl.h>
+#include <lib/fdio/fdio.h>
+#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
@@ -136,22 +137,23 @@
#include <zircon/syscalls.h>
#include <zircon/syscalls/object.h>
-GoldfishAddressSpaceBlockProvider::GoldfishAddressSpaceBlockProvider()
- : m_fd(::open(GOLDFISH_ADDRESS_SPACE_DEVICE_NAME, O_RDWR)) {}
+GoldfishAddressSpaceBlockProvider::GoldfishAddressSpaceBlockProvider() {
+ fdio_get_service_handle(::open(GOLDFISH_ADDRESS_SPACE_DEVICE_NAME, O_RDWR), &m_channel);
+}
GoldfishAddressSpaceBlockProvider::~GoldfishAddressSpaceBlockProvider()
{
- ::close(m_fd);
+ zx_handle_close(m_channel);
}
GoldfishAddressSpaceBlock::GoldfishAddressSpaceBlock()
: m_vmo(ZX_HANDLE_INVALID)
+ , m_channel(ZX_HANDLE_INVALID)
, m_mmaped_ptr(NULL)
, m_phys_addr(0)
, m_host_addr(0)
, m_offset(0)
- , m_size(0)
- , m_fd(-1) {}
+ , m_size(0) {}
GoldfishAddressSpaceBlock::~GoldfishAddressSpaceBlock()
{
@@ -166,7 +168,7 @@
m_host_addr = rhs.m_host_addr;
m_offset = rhs.m_offset;
m_size = rhs.m_size;
- m_fd = rhs.m_fd;
+ m_channel = rhs.m_channel;
return *this;
}
@@ -182,36 +184,13 @@
return false;
}
- {
- fzl::FdioCaller caller{fbl::unique_fd(provider->m_fd)};
-
- int32_t res = ZX_OK;
- zx_status_t status =
- fuchsia_hardware_goldfish_DeviceAllocateVmo(caller.borrow_channel(),
- size, &res, &m_vmo);
- if (status != ZX_OK || res != ZX_OK) {
- ALOGE("%s: allocate vmo failed: %d:%d", __func__, status, res);
- provider->m_fd = caller.release().release();
- return false;
- }
-
- zx_handle_t vmo_out;
- status = zx_handle_duplicate(m_vmo, ZX_DEFAULT_VMO_RIGHTS, &vmo_out);
- if (status != ZX_OK) {
- ALOGE("%s: vmo dup failed: %d:%d", __func__, status);
- provider->m_fd = caller.release().release();
- return false;
- }
-
- status = fuchsia_hardware_goldfish_DeviceGetPhysicalAddress(
- caller.borrow_channel(),
- vmo_out, &res, &m_phys_addr);
- provider->m_fd = caller.release().release();
-
- if (status != ZX_OK || res != ZX_OK) {
- ALOGE("%s: pin vmo failed: %d:%d", __func__, status, res);
- return false;
- }
+ int32_t res = ZX_OK;
+ zx_status_t status =
+ fuchsia_hardware_goldfish_address_space_DeviceAllocateBlock(
+ provider->m_channel, size, &res, &m_phys_addr, &m_vmo);
+ if (status != ZX_OK || res != ZX_OK) {
+ ALOGE("%s: allocate block failed: %d:%d", __func__, status, res);
+ return false;
}
m_offset = 0;
@@ -221,7 +200,7 @@
(unsigned long long)m_offset,
(unsigned long long)m_size);
- m_fd = provider->m_fd;
+ m_channel = provider->m_channel;
return true;
}
@@ -284,6 +263,14 @@
if (m_size) {
zx_handle_close(m_vmo);
m_vmo = ZX_HANDLE_INVALID;
+ int32_t res = ZX_OK;
+ zx_status_t status =
+ fuchsia_hardware_goldfish_address_space_DeviceDeallocateBlock(
+ m_channel, m_phys_addr, &res);
+ if (status != ZX_OK || res != ZX_OK) {
+ ALOGE("%s: deallocate block failed: %d:%d", __func__, status, res);
+ }
+ m_channel = ZX_HANDLE_INVALID;
m_phys_addr = 0;
m_host_addr = 0;
m_offset = 0;
@@ -303,7 +290,7 @@
bool GoldfishAddressSpaceBlockProvider::is_opened()
{
- return m_fd >= 0;
+ return m_channel != ZX_HANDLE_INVALID;
}
#else
#include <linux/types.h>
diff --git a/shared/OpenglCodecCommon/goldfish_address_space.h b/shared/OpenglCodecCommon/goldfish_address_space.h
index 637e20d..7ebb451 100644
--- a/shared/OpenglCodecCommon/goldfish_address_space.h
+++ b/shared/OpenglCodecCommon/goldfish_address_space.h
@@ -45,7 +45,11 @@
GoldfishAddressSpaceBlockProvider &operator=(const GoldfishAddressSpaceBlockProvider &rhs);
bool is_opened();
+#ifdef __Fuchsia__
+ uint32_t m_channel;
+#else
int m_fd;
+#endif
friend class GoldfishAddressSpaceBlock;
};
@@ -75,13 +79,15 @@
#else
#ifdef __Fuchsia__
uint32_t m_vmo;
+ uint32_t m_channel;
+#else
+ int m_fd;
#endif
void *m_mmaped_ptr;
uint64_t m_phys_addr;
uint64_t m_host_addr;
uint64_t m_offset;
size_t m_size;
- int m_fd;
#endif
};
diff --git a/system/vulkan/goldfish_vulkan.cpp b/system/vulkan/goldfish_vulkan.cpp
index 3b38994..4539c1b 100644
--- a/system/vulkan/goldfish_vulkan.cpp
+++ b/system/vulkan/goldfish_vulkan.cpp
@@ -161,6 +161,14 @@
AEMU_SCOPED_TRACE("vkstubhal::SetBufferCollectionConstraintsFUCHSIA");
return VK_SUCCESS;
}
+
+VkResult
+GetBufferCollectionPropertiesFUCHSIA(VkDevice /*device*/,
+ VkBufferCollectionFUCHSIA /*collection*/,
+ VkBufferCollectionPropertiesFUCHSIA* /*pProperties*/) {
+ AEMU_SCOPED_TRACE("vkstubhal::GetBufferCollectionPropertiesFUCHSIA");
+ return VK_SUCCESS;
+}
#endif
PFN_vkVoidFunction GetInstanceProcAddr(VkInstance instance,
@@ -195,6 +203,8 @@
return reinterpret_cast<PFN_vkVoidFunction>(DestroyBufferCollectionFUCHSIA);
if (strcmp(name, "vkSetBufferCollectionConstraintsFUCHSIA") == 0)
return reinterpret_cast<PFN_vkVoidFunction>(SetBufferCollectionConstraintsFUCHSIA);
+ if (strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIA") == 0)
+ return reinterpret_cast<PFN_vkVoidFunction>(GetBufferCollectionPropertiesFUCHSIA);
#endif
// Per the spec, return NULL if instance is NULL.
if (!instance)
@@ -440,6 +450,26 @@
return res;
}
+
+VKAPI_ATTR
+VkResult GetBufferCollectionPropertiesFUCHSIA(
+ VkDevice device,
+ VkBufferCollectionFUCHSIA collection,
+ VkBufferCollectionPropertiesFUCHSIA* pProperties) {
+ AEMU_SCOPED_TRACE("goldfish_vulkan::GetBufferCollectionPropertiesFUCHSIA");
+
+ VK_HOST_CONNECTION(VK_ERROR_DEVICE_LOST)
+
+ if (!hostSupportsVulkan) {
+ return vkstubhal::GetBufferCollectionPropertiesFUCHSIA(device, collection, pProperties);
+ }
+
+ VkResult res = goldfish_vk::ResourceTracker::get()->
+ on_vkGetBufferCollectionPropertiesFUCHSIA(
+ vkEnc, VK_SUCCESS, device, collection, pProperties);
+
+ return res;
+}
#endif
static PFN_vkVoidFunction GetDeviceProcAddr(VkDevice device, const char* name) {
@@ -473,6 +503,9 @@
if (!strcmp(name, "vkSetBufferCollectionConstraintsFUCHSIA")) {
return (PFN_vkVoidFunction)SetBufferCollectionConstraintsFUCHSIA;
}
+ if (!strcmp(name, "vkGetBufferCollectionPropertiesFUCHSIA")) {
+ return (PFN_vkVoidFunction)GetBufferCollectionPropertiesFUCHSIA;
+ }
#endif
if (!strcmp(name, "vkGetDeviceProcAddr")) {
return (PFN_vkVoidFunction)(GetDeviceProcAddr);
diff --git a/system/vulkan_enc/ResourceTracker.cpp b/system/vulkan_enc/ResourceTracker.cpp
index 01ad42b..36c2a6b 100644
--- a/system/vulkan_enc/ResourceTracker.cpp
+++ b/system/vulkan_enc/ResourceTracker.cpp
@@ -58,7 +58,6 @@
#ifdef VK_USE_PLATFORM_FUCHSIA
#include <cutils/native_handle.h>
-#include <fuchsia/hardware/goldfish/c/fidl.h>
#include <fuchsia/sysmem/cpp/fidl.h>
#include <lib/fdio/directory.h>
#include <lib/fdio/fd.h>
@@ -1210,7 +1209,7 @@
for (uint32_t i = 0; i < info.memProps.memoryTypeCount; ++i) {
if (info.memProps.memoryTypes[i].propertyFlags &
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
- pProperties->memoryTypeBits = 1ull << i;
+ pProperties->memoryTypeBits |= 1ull << i;
}
}
return VK_SUCCESS;
@@ -1364,6 +1363,45 @@
(*sysmem_collection)->SetConstraints(true, constraints);
return VK_SUCCESS;
}
+
+ VkResult on_vkGetBufferCollectionPropertiesFUCHSIA(
+ void*, VkResult,
+ VkDevice device,
+ VkBufferCollectionFUCHSIA collection,
+ VkBufferCollectionPropertiesFUCHSIA* pProperties) {
+ auto sysmem_collection = reinterpret_cast<fuchsia::sysmem::BufferCollectionSyncPtr*>(collection);
+ fuchsia::sysmem::BufferCollectionInfo_2 info;
+ zx_status_t status2;
+ zx_status_t status = (*sysmem_collection)->WaitForBuffersAllocated(&status2, &info);
+ if (status != ZX_OK || status2 != ZX_OK) {
+ ALOGE("Failed wait for allocation: %d %d", status, status2);
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+ if (!info.settings.has_image_format_constraints) {
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+ pProperties->count = info.buffer_count;
+
+ AutoLock lock(mLock);
+
+ auto deviceIt = info_VkDevice.find(device);
+
+ if (deviceIt == info_VkDevice.end()) {
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
+
+ auto& deviceInfo = deviceIt->second;
+
+ // Device local memory type supported.
+ pProperties->memoryTypeBits = 0;
+ for (uint32_t i = 0; i < deviceInfo.memProps.memoryTypeCount; ++i) {
+ if (deviceInfo.memProps.memoryTypes[i].propertyFlags &
+ VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) {
+ pProperties->memoryTypeBits |= 1ull << i;
+ }
+ }
+ return VK_SUCCESS;
+ }
#endif
HostMemBlockIndex getOrAllocateHostMemBlockLocked(
@@ -1698,10 +1736,17 @@
}
if (vmo_handle != ZX_HANDLE_INVALID) {
- uint64_t cb = 0;
+ uint32_t cb = 0;
#ifdef VK_USE_PLATFORM_FUCHSIA
- zx_object_get_cookie(vmo_handle, vmo_handle, &cb);
+ // TODO(reveman): Remove use of zx_vmo_read. Goldfish FIDL interface
+ // should provide a mechanism to query the color buffer ID associated
+ // with a VMO.
+ zx_status_t status = zx_vmo_read(vmo_handle, &cb, 0, sizeof(cb));
+ if (status != ZX_OK) {
+ ALOGE("failed to read color buffer name");
+ return VK_ERROR_INITIALIZATION_FAILED;
+ }
#endif
if (cb) {
@@ -2377,11 +2422,12 @@
abort();
}
}
- status = zx_object_set_cookie(memoryInfo.vmoHandle,
- memoryInfo.vmoHandle,
- imageInfo.cbHandle);
+ // TODO(reveman): Remove use of zx_vmo_write. Sysmem
+ // and goldfish pipe driver should manage this association.
+ status = zx_vmo_write(memoryInfo.vmoHandle, &imageInfo.cbHandle,
+ 0, sizeof(imageInfo.cbHandle));
if (status != ZX_OK) {
- ALOGE("%s: failed to set color buffer cookie", __func__);
+ ALOGE("%s: failed writing color buffer id to vmo", __func__);
abort();
}
// Color buffer backed images are already bound.
@@ -3692,6 +3738,15 @@
return mImpl->on_vkSetBufferCollectionConstraintsFUCHSIA(
context, input_result, device, collection, pImageInfo);
}
+
+VkResult ResourceTracker::on_vkGetBufferCollectionPropertiesFUCHSIA(
+ void* context, VkResult input_result,
+ VkDevice device,
+ VkBufferCollectionFUCHSIA collection,
+ VkBufferCollectionPropertiesFUCHSIA* pProperties) {
+ return mImpl->on_vkGetBufferCollectionPropertiesFUCHSIA(
+ context, input_result, device, collection, pProperties);
+}
#endif
VkResult ResourceTracker::on_vkGetAndroidHardwareBufferPropertiesANDROID(
diff --git a/system/vulkan_enc/ResourceTracker.h b/system/vulkan_enc/ResourceTracker.h
index 200bfb6..e3189e4 100644
--- a/system/vulkan_enc/ResourceTracker.h
+++ b/system/vulkan_enc/ResourceTracker.h
@@ -249,6 +249,11 @@
VkDevice device,
VkBufferCollectionFUCHSIA collection,
const VkImageCreateInfo* pImageInfo);
+ VkResult on_vkGetBufferCollectionPropertiesFUCHSIA(
+ void* context, VkResult input_result,
+ VkDevice device,
+ VkBufferCollectionFUCHSIA collection,
+ VkBufferCollectionPropertiesFUCHSIA* pProperties);
#endif
VkResult on_vkGetAndroidHardwareBufferPropertiesANDROID(