Commit 4bc9f6e5 by Jason Macnak

Update SwiftShader VK AHB to support generic gralloc

... by only using the AHardwareBuffer_* functions which will use the device's gralloc implementation. Note: this change does not fix the 5 existing deqp failures in the suballocated.* tests that are mentioned in b/169796031. Note: ANGLE doesn't seem to have support for VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM yet: b/171302758. Bug: b/141698760 Bug: b/147316305 Test: launch_cvd && cts -m CtsDeqpTestCases dEQP-VK.api.external.memory.android_hardware_buffer.* Change-Id: Ia551e78198c20d6c40ffa9448418f73829da1880 Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/49248 Kokoro-Result: kokoro <noreply+kokoro@google.com> Tested-by: 's avatarJason Macnak <natsu@google.com> Reviewed-by: 's avatarTrevor Black <vantablack@google.com> Reviewed-by: 's avatarNicolas Capens <nicolascapens@google.com>
parent ec526abc
...@@ -56,7 +56,6 @@ cc_defaults { ...@@ -56,7 +56,6 @@ cc_defaults {
shared_libs: [ shared_libs: [
"android.hardware.graphics.mapper@3.0", "android.hardware.graphics.mapper@3.0",
"android.hardware.graphics.mapper@4.0", "android.hardware.graphics.mapper@4.0",
"libdrm",
"libnativewindow", "libnativewindow",
"libhardware", "libhardware",
"libhidlbase", "libhidlbase",
...@@ -591,7 +590,6 @@ cc_defaults { ...@@ -591,7 +590,6 @@ cc_defaults {
shared_libs: [ shared_libs: [
"android.hardware.graphics.mapper@3.0", "android.hardware.graphics.mapper@3.0",
"android.hardware.graphics.mapper@4.0", "android.hardware.graphics.mapper@4.0",
"libdrm",
"libnativewindow", "libnativewindow",
"libhardware", "libhardware",
"libhidlbase", "libhidlbase",
...@@ -664,8 +662,6 @@ cc_defaults { ...@@ -664,8 +662,6 @@ cc_defaults {
include_dirs: [ include_dirs: [
"external/swiftshader/third_party/SPIRV-Headers/include", "external/swiftshader/third_party/SPIRV-Headers/include",
"external/swiftshader/include", "external/swiftshader/include",
"external/minigbm",
"external/libdrm"
], ],
} }
......
...@@ -41,6 +41,9 @@ public: ...@@ -41,6 +41,9 @@ public:
uint8_t *end() const; uint8_t *end() const;
bool canBindToMemory(DeviceMemory *pDeviceMemory) const; bool canBindToMemory(DeviceMemory *pDeviceMemory) const;
VkBufferUsageFlags getUsage() const { return usage; }
VkBufferCreateFlags getFlags() const { return flags; }
private: private:
void *memory = nullptr; void *memory = nullptr;
VkBufferCreateFlags flags = 0; VkBufferCreateFlags flags = 0;
......
...@@ -146,10 +146,6 @@ Device::Device(const VkDeviceCreateInfo *pCreateInfo, void *mem, PhysicalDevice ...@@ -146,10 +146,6 @@ Device::Device(const VkDeviceCreateInfo *pCreateInfo, void *mem, PhysicalDevice
debugger.server = vk::dbg::Server::create(debugger.context, atoi(port)); debugger.server = vk::dbg::Server::create(debugger.context, atoi(port));
} }
#endif // ENABLE_VK_DEBUGGER #endif // ENABLE_VK_DEBUGGER
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
ahbAddressMap.reset(new AHBAddressMap());
#endif
} }
void Device::destroy(const VkAllocationCallbacks *pAllocator) void Device::destroy(const VkAllocationCallbacks *pAllocator)
...@@ -379,60 +375,4 @@ void Device::contentsChanged(ImageView *imageView) ...@@ -379,60 +375,4 @@ void Device::contentsChanged(ImageView *imageView)
} }
} }
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
Device::AHBAddressMap *Device::getAHBAddressMap() const
{
return ahbAddressMap.get();
}
void *Device::AHBAddressMap::query(const uint32_t key)
{
std::unique_lock<std::mutex> lock(addressMapMutex);
if(addressMap.find(key) == addressMap.end())
return nullptr;
return addressMap[key].address;
}
void Device::AHBAddressMap::add(const uint32_t key, void *value)
{
std::unique_lock<std::mutex> lock(addressMapMutex);
auto it = addressMap.find(key);
if(it == addressMap.end())
{
MapValue mv;
mv.refCount = 1;
mv.address = value;
addressMap[key] = mv;
}
else
{
it->second.address = value;
it->second.refCount++;
}
}
int Device::AHBAddressMap::incrementReference(const uint32_t key)
{
std::unique_lock<std::mutex> lock(addressMapMutex);
auto it = addressMap.find(key);
if(it == addressMap.end())
return -1;
it->second.refCount++;
return it->second.refCount;
}
int Device::AHBAddressMap::decrementReference(const uint32_t key)
{
std::unique_lock<std::mutex> lock(addressMapMutex);
auto it = addressMap.find(key);
if(it == addressMap.end())
return -1;
it->second.refCount--;
return it->second.refCount;
}
#endif // SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
} // namespace vk } // namespace vk
...@@ -193,41 +193,6 @@ private: ...@@ -193,41 +193,6 @@ private:
std::shared_ptr<vk::dbg::Server> server; std::shared_ptr<vk::dbg::Server> server;
} debugger; } debugger;
#endif // ENABLE_VK_DEBUGGER #endif // ENABLE_VK_DEBUGGER
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
public:
class AHBAddressMap
{
public:
AHBAddressMap() {}
~AHBAddressMap() {}
struct MapValue
{
MapValue()
: refCount(0)
, address(nullptr)
{
}
int refCount;
void *address;
};
void *query(const uint32_t key);
int incrementReference(const uint32_t key);
int decrementReference(const uint32_t key);
void add(const uint32_t key, void *value);
private:
std::map<uint32_t, MapValue> addressMap;
std::mutex addressMapMutex;
};
AHBAddressMap *getAHBAddressMap() const;
private:
std::unique_ptr<AHBAddressMap> ahbAddressMap;
#endif
}; };
using DispatchableDevice = DispatchableObject<Device, VkDevice>; using DispatchableDevice = DispatchableObject<Device, VkDevice>;
......
...@@ -17,29 +17,14 @@ ...@@ -17,29 +17,14 @@
#if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER #if SWIFTSHADER_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER
# include "VkBuffer.hpp"
# include "VkDevice.hpp" # include "VkDevice.hpp"
# include "VkDeviceMemory.hpp" # include "VkDeviceMemory.hpp"
# include "VkDeviceMemoryExternalBase.hpp" # include "VkDeviceMemoryExternalBase.hpp"
# include "VkBuffer.hpp"
# include "VkDeviceMemory.hpp"
# include "VkImage.hpp" # include "VkImage.hpp"
# include "VkStringify.hpp"
# include "System/Debug.hpp"
# include "System/Linux/MemFd.hpp"
# include <android/hardware_buffer.h> # include <android/hardware_buffer.h>
# include <cros_gralloc/cros_gralloc_handle.h>
# include <unistd.h>
# include <virtgpu_drm.h>
# include <xf86drm.h>
# include <errno.h>
# include <string.h>
# include <map>
class AHardwareBufferExternalMemory : public vk::DeviceMemory::ExternalBase class AHardwareBufferExternalMemory : public vk::DeviceMemory::ExternalBase
{ {
public: public:
...@@ -68,49 +53,29 @@ public: ...@@ -68,49 +53,29 @@ public:
return (info.importAhb || info.exportAhb) && (info.bufferHandle || info.imageHandle); return (info.importAhb || info.exportAhb) && (info.bufferHandle || info.imageHandle);
} }
explicit AHardwareBufferExternalMemory(const VkMemoryAllocateInfo *pAllocateInfo) explicit AHardwareBufferExternalMemory(const VkMemoryAllocateInfo *pAllocateInfo);
: allocateInfo(pAllocateInfo)
{
}
~AHardwareBufferExternalMemory(); ~AHardwareBufferExternalMemory();
VkResult allocate(size_t size, void **pBuffer) override; VkResult allocate(size_t size, void **pBuffer) override;
void deallocate(void *buffer, size_t size) override; void deallocate(void *buffer, size_t size) override;
VkResult allocateAndroidHardwareBuffer(size_t size, void **pBuffer);
VkExternalMemoryHandleTypeFlagBits getFlagBit() const override VkExternalMemoryHandleTypeFlagBits getFlagBit() const override { return typeFlagBit; }
{
return typeFlagBit;
}
VkResult exportAndroidHardwareBuffer(struct AHardwareBuffer **pAhb) const override; VkResult exportAndroidHardwareBuffer(struct AHardwareBuffer **pAhb) const override;
void setDevicePtr(vk::Device *pDevice) override void setDevicePtr(vk::Device *pDevice) override { device = pDevice; }
{ bool isAndroidHardwareBuffer() override { return true; }
device = pDevice;
}
bool isAndroidHardwareBuffer() override
{
return true;
}
static uint32_t GetAndroidHardwareBufferDescFormat(VkFormat format);
static VkFormat GetVkFormat(uint32_t ahbFormat);
static VkFormatFeatureFlags GetVkFormatFeatures(VkFormat format);
static VkResult GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat); static VkResult GetAndroidHardwareBufferFormatProperties(const AHardwareBuffer_Desc &ahbDesc, VkAndroidHardwareBufferFormatPropertiesANDROID *pFormat);
static VkResult GetAndroidHardwareBufferProperties(VkDevice &device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties); static VkResult GetAndroidHardwareBufferProperties(VkDevice &device, const struct AHardwareBuffer *buffer, VkAndroidHardwareBufferPropertiesANDROID *pProperties);
static VkResult GetAndroidHardwareBufferUsageFromVkUsage(const VkImageCreateFlags createFlags, const VkImageUsageFlags usageFlags, uint64_t &ahbDescUsage);
// All reliance on minigbm and DRM is contained in these functions
VkResult getPrimeHandle(const native_handle_t *h, uint32_t &primeHandle);
void createRenderNodeFD();
VkResult mapMemory(uint32_t &primeHandle, void **ptr);
VkResult closeMemory(uint32_t &primeHandle);
private: private:
VkResult importAndroidHardwareBuffer(struct AHardwareBuffer *buffer, void **pBuffer);
VkResult allocateAndroidHardwareBuffer(void **pBuffer);
VkResult lockAndroidHardwareBuffer(void **pBuffer);
VkResult unlockAndroidHardwareBuffer();
struct AHardwareBuffer *ahb = nullptr; struct AHardwareBuffer *ahb = nullptr;
int rendernodeFD;
vk::Device *device = nullptr; vk::Device *device = nullptr;
AllocateInfo allocateInfo; AllocateInfo allocateInfo;
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment