Skip to content

Commit a1c30c8

Browse files
committed
External Texture implementation for Vulkan
Add support for the new createTextureExternalImage2R API instead of createTextureExternalImageR. Add the support to import AHardwareBuffer objects into Vulkan in Android.
1 parent 0b5f95b commit a1c30c8

8 files changed

+238
-52
lines changed

filament/backend/CMakeLists.txt

+4-1
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,10 @@ if (FILAMENT_SUPPORTS_VULKAN)
233233
elseif (APPLE OR IOS)
234234
list(APPEND SRCS src/vulkan/platform/VulkanPlatformApple.mm)
235235
elseif (ANDROID)
236-
list(APPEND SRCS src/vulkan/platform/VulkanPlatformAndroid.cpp)
236+
list(APPEND SRCS
237+
include/backend/platforms/VulkanPlatformAndroid.h
238+
src/vulkan/platform/VulkanPlatformAndroid.cpp
239+
)
237240
endif()
238241
endif()
239242

filament/backend/include/backend/platforms/VulkanPlatform.h

+7-5
Original file line numberDiff line numberDiff line change
@@ -347,18 +347,20 @@ class VulkanPlatform : public Platform, utils::PrivateImplementation<VulkanPlatf
347347
*/
348348
uint32_t memoryTypeBits;
349349
};
350-
virtual ExternalImageMetadata getExternalImageMetadata(void* externalImage);
350+
virtual ExternalImageMetadata getExternalImageMetadata(ExternalImageHandleRef externalImage);
351351

352352
using ImageData = std::pair<VkImage, VkDeviceMemory>;
353-
virtual ImageData createExternalImage(void* externalImage,
353+
virtual ImageData createExternalImageData(ExternalImageHandleRef externalImage,
354354
const ExternalImageMetadata& metadata);
355355

356356
private:
357357
static ExtensionSet getSwapchainInstanceExtensions();
358-
static ExternalImageMetadata getExternalImageMetadataImpl(void* externalImage,
358+
359+
static ExternalImageMetadata getExternalImageMetadataImpl(ExternalImageHandleRef externalImage,
359360
VkDevice device);
360-
static ImageData createExternalImageImpl(void* externalImage, VkDevice device,
361-
const VkAllocationCallbacks* allocator, const ExternalImageMetadata& metadata);
361+
362+
static ImageData createExternalImageDataImpl(ExternalImageHandleRef externalImage,
363+
VkDevice device, const ExternalImageMetadata& metadata);
362364

363365
// Platform dependent helper methods
364366
using SurfaceBundle = std::tuple<VkSurfaceKHR, VkExtent2D>;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright (C) 2025 The Android Open Source Project
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
#ifndef TNT_FILAMENT_BACKEND_PLATFORMS_VULKAN_PLATFORM_ANDROID_H
18+
#define TNT_FILAMENT_BACKEND_PLATFORMS_VULKAN_PLATFORM_ANDROID_H
19+
20+
#include <backend/Platform.h>
21+
22+
#include <android/hardware_buffer.h>
23+
24+
namespace filament::backend::fvkandroid {
25+
26+
struct ExternalImageVulkanAndroid : public Platform::ExternalImage {
27+
AHardwareBuffer *aHardwareBuffer = nullptr;
28+
bool sRGB = false;
29+
unsigned int width; // Texture width
30+
unsigned int height; // Texture height
31+
TextureFormat format; // Texture format
32+
TextureUsage usage; // Texture usage flags
33+
34+
protected:
35+
~ExternalImageVulkanAndroid() override;
36+
};
37+
38+
Platform::ExternalImageHandle UTILS_PUBLIC createExternalImage(
39+
AHardwareBuffer const *buffer, bool sRGB) noexcept;
40+
41+
} // namespace filament::backend::fvkandroid
42+
43+
#endif // TNT_FILAMENT_BACKEND_PLATFORMS_VULKAN_PLATFORM_ANDROID_H

filament/backend/src/vulkan/VulkanDriver.cpp

+12-12
Original file line numberDiff line numberDiff line change
@@ -560,14 +560,6 @@ void VulkanDriver::createTextureExternalImage2R(Handle<HwTexture> th,
560560
Platform::ExternalImageHandleRef externalImage) {
561561
FVK_SYSTRACE_SCOPE();
562562

563-
// FIXME: implement createTextureExternalImage2R
564-
}
565-
566-
void VulkanDriver::createTextureExternalImageR(Handle<HwTexture> th, backend::SamplerType target,
567-
backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage,
568-
void* externalImage) {
569-
FVK_SYSTRACE_SCOPE();
570-
571563
const auto& metadata = mPlatform->getExternalImageMetadata(externalImage);
572564
if (metadata.isProtected) {
573565
usage |= backend::TextureUsage::PROTECTED;
@@ -577,15 +569,23 @@ void VulkanDriver::createTextureExternalImageR(Handle<HwTexture> th, backend::Sa
577569
assert_invariant(height == metadata.height);
578570
assert_invariant(fvkutils::getVkFormat(format) == metadata.format);
579571

580-
const auto& data = mPlatform->createExternalImage(externalImage, metadata);
572+
const auto& data = mPlatform->createExternalImageData(externalImage, metadata);
581573

582-
auto texture = resource_ptr<VulkanTexture>::make(&mResourceManager, th, mPlatform->getDevice(),
583-
mAllocator, &mResourceManager, &mCommands, data.first, data.second, metadata.format,
584-
1, metadata.width, metadata.height, /*depth=*/1, usage, mStagePool);
574+
auto texture = resource_ptr<VulkanTexture>::make(&mResourceManager, th,
575+
mPlatform->getDevice(), mAllocator, &mResourceManager, &mCommands, data.first, data.second, metadata.format,
576+
1, metadata.width, metadata.height, /*depth=*/1, usage, mStagePool);
585577

586578
texture.inc();
587579
}
588580

581+
void VulkanDriver::createTextureExternalImageR(Handle<HwTexture> th, backend::SamplerType target,
582+
backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage,
583+
void* externalImage) {
584+
FVK_SYSTRACE_SCOPE();
585+
586+
// not supported in this backend
587+
}
588+
589589
void VulkanDriver::createTextureExternalImagePlaneR(Handle<HwTexture> th,
590590
backend::TextureFormat format, uint32_t width, uint32_t height, backend::TextureUsage usage,
591591
void* image, uint32_t plane) {

filament/backend/src/vulkan/platform/VulkanPlatform.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -978,13 +978,13 @@ VkQueue VulkanPlatform::getProtectedGraphicsQueue() const noexcept {
978978
}
979979

980980
VulkanPlatform::ExternalImageMetadata VulkanPlatform::getExternalImageMetadata(
981-
void* externalImage) {
981+
ExternalImageHandleRef externalImage) {
982982
return getExternalImageMetadataImpl(externalImage, mImpl->mDevice);
983983
}
984984

985-
VulkanPlatform::ImageData VulkanPlatform::createExternalImage(void* externalImage,
986-
const ExternalImageMetadata& metadata) {
987-
return createExternalImageImpl(externalImage, mImpl->mDevice, nullptr, metadata);
985+
VulkanPlatform::ImageData VulkanPlatform::createExternalImageData(
986+
ExternalImageHandleRef externalImage, const ExternalImageMetadata& metadata) {
987+
return createExternalImageDataImpl(externalImage, mImpl->mDevice, metadata);
988988
}
989989

990990
#undef SWAPCHAIN_RET_FUNC

0 commit comments

Comments
 (0)