Commit 0eae0d6c by Mohan Maiya Committed by Commit Bot

Vulkan: Set external image's tiling mode based on AHB usage flags

For external images which can be accessed by CPU, the tiling mode should be linear. So, query the usage of the Android Hardware Buffer and derive the tiling mode based on AHB usage flags. Bug: angleproject:4735 Change-Id: I1b91c6800d414d73091032e40d8e4f1e8f6c101b Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2241780 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent c117e360
...@@ -14,9 +14,25 @@ ...@@ -14,9 +14,25 @@
#include "libANGLE/renderer/vulkan/DisplayVk.h" #include "libANGLE/renderer/vulkan/DisplayVk.h"
#include "libANGLE/renderer/vulkan/RendererVk.h" #include "libANGLE/renderer/vulkan/RendererVk.h"
#include <android/hardware_buffer.h>
namespace rx namespace rx
{ {
namespace
{
VkImageTiling AhbDescUsageToVkImageTiling(AHardwareBuffer_Desc *ahbDescription)
{
if ((ahbDescription->usage & AHARDWAREBUFFER_USAGE_CPU_READ_MASK) != 0 ||
(ahbDescription->usage & AHARDWAREBUFFER_USAGE_CPU_WRITE_MASK) != 0)
{
return VK_IMAGE_TILING_LINEAR;
}
return VK_IMAGE_TILING_OPTIMAL;
}
} // namespace
HardwareBufferImageSiblingVkAndroid::HardwareBufferImageSiblingVkAndroid(EGLClientBuffer buffer) HardwareBufferImageSiblingVkAndroid::HardwareBufferImageSiblingVkAndroid(EGLClientBuffer buffer)
: mBuffer(buffer), : mBuffer(buffer),
mFormat(GL_NONE), mFormat(GL_NONE),
...@@ -98,6 +114,10 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk ...@@ -98,6 +114,10 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
ANGLE_VK_TRY(displayVk, vkGetAndroidHardwareBufferPropertiesANDROID(device, hardwareBuffer, ANGLE_VK_TRY(displayVk, vkGetAndroidHardwareBufferPropertiesANDROID(device, hardwareBuffer,
&bufferProperties)); &bufferProperties));
AHardwareBuffer_Desc ahbDescription;
AHardwareBuffer_describe(hardwareBuffer, &ahbDescription);
VkImageTiling imageTilingMode = AhbDescUsageToVkImageTiling(&ahbDescription);
const vk::Format &vkFormat = renderer->getFormat(internalFormat); const vk::Format &vkFormat = renderer->getFormat(internalFormat);
const angle::Format &imageFormat = vkFormat.actualImageFormat(); const angle::Format &imageFormat = vkFormat.actualImageFormat();
bool isDepthOrStencilFormat = imageFormat.depthBits > 0 || imageFormat.stencilBits > 0; bool isDepthOrStencilFormat = imageFormat.depthBits > 0 || imageFormat.stencilBits > 0;
...@@ -126,6 +146,7 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk ...@@ -126,6 +146,7 @@ angle::Result HardwareBufferImageSiblingVkAndroid::initImpl(DisplayVk *displayVk
gl_vk::GetExtent(mSize, &vkExtents); gl_vk::GetExtent(mSize, &vkExtents);
mImage = new vk::ImageHelper(); mImage = new vk::ImageHelper();
mImage->setTilingMode(imageTilingMode);
ANGLE_TRY(mImage->initExternal( ANGLE_TRY(mImage->initExternal(
displayVk, gl::TextureType::_2D, vkExtents, vkFormat, 1, usage, vk::kVkImageCreateFlagsNone, displayVk, gl::TextureType::_2D, vkExtents, vkFormat, 1, usage, vk::kVkImageCreateFlagsNone,
vk::ImageLayout::ExternalPreInitialized, &externalMemoryImageCreateInfo, 0, 0, 1, 1)); vk::ImageLayout::ExternalPreInitialized, &externalMemoryImageCreateInfo, 0, 0, 1, 1));
......
...@@ -2451,6 +2451,7 @@ ImageHelper::ImageHelper(ImageHelper &&other) ...@@ -2451,6 +2451,7 @@ ImageHelper::ImageHelper(ImageHelper &&other)
: mImage(std::move(other.mImage)), : mImage(std::move(other.mImage)),
mDeviceMemory(std::move(other.mDeviceMemory)), mDeviceMemory(std::move(other.mDeviceMemory)),
mImageType(other.mImageType), mImageType(other.mImageType),
mTilingMode(other.mTilingMode),
mExtents(other.mExtents), mExtents(other.mExtents),
mFormat(other.mFormat), mFormat(other.mFormat),
mSamples(other.mSamples), mSamples(other.mSamples),
...@@ -2482,6 +2483,7 @@ void ImageHelper::resetCachedProperties() ...@@ -2482,6 +2483,7 @@ void ImageHelper::resetCachedProperties()
mFormat = nullptr; mFormat = nullptr;
mSamples = 1; mSamples = 1;
mSerial = rx::kZeroSerial; mSerial = rx::kZeroSerial;
mTilingMode = VK_IMAGE_TILING_OPTIMAL;
mCurrentLayout = ImageLayout::Undefined; mCurrentLayout = ImageLayout::Undefined;
mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max(); mCurrentQueueFamilyIndex = std::numeric_limits<uint32_t>::max();
mLastNonShaderReadOnlyLayout = ImageLayout::Undefined; mLastNonShaderReadOnlyLayout = ImageLayout::Undefined;
...@@ -2559,7 +2561,7 @@ angle::Result ImageHelper::initExternal(Context *context, ...@@ -2559,7 +2561,7 @@ angle::Result ImageHelper::initExternal(Context *context,
imageInfo.mipLevels = mipLevels; imageInfo.mipLevels = mipLevels;
imageInfo.arrayLayers = mLayerCount; imageInfo.arrayLayers = mLayerCount;
imageInfo.samples = gl_vk::GetSamples(samples); imageInfo.samples = gl_vk::GetSamples(samples);
imageInfo.tiling = VK_IMAGE_TILING_OPTIMAL; imageInfo.tiling = mTilingMode;
imageInfo.usage = usage; imageInfo.usage = usage;
imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE; imageInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
imageInfo.queueFamilyIndexCount = 0; imageInfo.queueFamilyIndexCount = 0;
......
...@@ -1123,6 +1123,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1123,6 +1123,7 @@ class ImageHelper final : public Resource, public angle::Subject
const Image &getImage() const { return mImage; } const Image &getImage() const { return mImage; }
const DeviceMemory &getDeviceMemory() const { return mDeviceMemory; } const DeviceMemory &getDeviceMemory() const { return mDeviceMemory; }
void setTilingMode(VkImageTiling tilingMode) { mTilingMode = tilingMode; }
VkImageType getType() const { return mImageType; } VkImageType getType() const { return mImageType; }
const VkExtent3D &getExtents() const { return mExtents; } const VkExtent3D &getExtents() const { return mExtents; }
uint32_t getLayerCount() const { return mLayerCount; } uint32_t getLayerCount() const { return mLayerCount; }
...@@ -1474,6 +1475,7 @@ class ImageHelper final : public Resource, public angle::Subject ...@@ -1474,6 +1475,7 @@ class ImageHelper final : public Resource, public angle::Subject
// Image properties. // Image properties.
VkImageType mImageType; VkImageType mImageType;
VkImageTiling mTilingMode;
VkExtent3D mExtents; VkExtent3D mExtents;
const Format *mFormat; const Format *mFormat;
GLint mSamples; GLint mSamples;
......
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