blob: 773f9a7553220835bc935b126be11094d8e01c82 [file] [log] [blame]
/*
* Copyright 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 ANDROID_VULKANTESTHELPERS_H
#define ANDROID_VULKANTESTHELPERS_H
#include <vector>
#include <cstdlib>
#include <cstring>
#include <jni.h>
#include <vulkan/vulkan.h>
#include <vulkan/vulkan_android.h>
// Provides basic set-up of a Vulkan device and queue.
class VkInit {
public:
~VkInit();
bool init();
VkDevice device() { return mDevice; }
VkQueue queue() { return mQueue; }
VkPhysicalDevice gpu() { return mGpu; }
uint32_t queueFamilyIndex() { return mQueueFamilyIndex; }
uint32_t findMemoryType(uint32_t memoryTypeBitsRequirement,
VkFlags requirementsMask);
PFN_vkBindImageMemory2 mPfnBindImageMemory2 = nullptr;
PFN_vkGetImageMemoryRequirements2 mPfnGetImageMemoryRequirements2 = nullptr;
PFN_vkCreateSamplerYcbcrConversion mPfnCreateSamplerYcbcrConversion = nullptr;
PFN_vkDestroySamplerYcbcrConversion mPfnDestroySamplerYcbcrConversion = nullptr;
PFN_vkImportSemaphoreFdKHR mPfnImportSemaphoreFd = nullptr;
PFN_vkGetAndroidHardwareBufferPropertiesANDROID mPfnGetAndroidHardwareBufferProperties = nullptr;
private:
VkInstance mInstance = VK_NULL_HANDLE;
VkPhysicalDevice mGpu = VK_NULL_HANDLE;
VkDevice mDevice = VK_NULL_HANDLE;
VkQueue mQueue = VK_NULL_HANDLE;
uint32_t mQueueFamilyIndex = 0;
VkPhysicalDeviceMemoryProperties mMemoryProperties = {};
};
// Provides import of AHardwareBuffer.
class VkAHardwareBufferImage {
public:
VkAHardwareBufferImage(VkInit *init);
~VkAHardwareBufferImage();
bool init(AHardwareBuffer *buffer, bool useExternalFormat, int syncFd = -1);
VkImage image() { return mImage; }
VkSampler sampler() { return mSampler; }
VkImageView view() { return mView; }
VkSemaphore semaphore() { return mSemaphore; }
bool isSamplerImmutable() { return mConversion != VK_NULL_HANDLE; }
private:
VkInit *const mInit;
VkImage mImage = VK_NULL_HANDLE;
VkDeviceMemory mMemory = VK_NULL_HANDLE;
VkSampler mSampler = VK_NULL_HANDLE;
VkImageView mView = VK_NULL_HANDLE;
VkSamplerYcbcrConversion mConversion = VK_NULL_HANDLE;
VkSemaphore mSemaphore = VK_NULL_HANDLE;
};
// Renders a provided image to a new texture, then reads back that texture to
// disk.
class VkImageRenderer {
public:
VkImageRenderer(VkInit *init, uint32_t width, uint32_t height,
VkFormat format, uint32_t bytesPerPixel);
~VkImageRenderer();
bool init(JNIEnv *env, jobject assetMgr);
bool renderImageAndReadback(VkImage image, VkSampler sampler,
VkImageView view, VkSemaphore semaphore,
bool useImmutableSampler,
std::vector<uint8_t> *data);
bool renderImageAndReadback(VkImage image, VkSampler sampler,
VkImageView view, VkSemaphore semaphore,
bool useImmutableSampler,
std::vector<uint32_t> *data);
private:
// Cleans up the temporary renderImageAndReadback variables.
void cleanUpTemporaries();
VkInit *const mInit;
const uint32_t mWidth;
const uint32_t mHeight;
const VkFormat mFormat;
const VkDeviceSize mResultBufferSize;
VkImage mDestImage = VK_NULL_HANDLE;
VkDeviceMemory mDestImageMemory = VK_NULL_HANDLE;
VkImageView mDestImageView = VK_NULL_HANDLE;
VkBuffer mResultBuffer = VK_NULL_HANDLE;
VkDeviceMemory mResultBufferMemory = VK_NULL_HANDLE;
VkDescriptorPool mDescriptorPool = VK_NULL_HANDLE;
VkCommandPool mCmdPool = VK_NULL_HANDLE;
VkRenderPass mRenderPass = VK_NULL_HANDLE;
VkBuffer mVertexBuffer = VK_NULL_HANDLE;
VkDeviceMemory mVertexBufferMemory = VK_NULL_HANDLE;
VkFramebuffer mFramebuffer = VK_NULL_HANDLE;
VkShaderModule mVertModule = VK_NULL_HANDLE;
VkShaderModule mPixelModule = VK_NULL_HANDLE;
VkFence mFence = VK_NULL_HANDLE;
// Temporary values used during renderImageAndReadback.
VkCommandBuffer mCmdBuffer = VK_NULL_HANDLE;
VkDescriptorSet mDescriptorSet = VK_NULL_HANDLE;
VkPipelineCache mCache = VK_NULL_HANDLE;
VkPipeline mPipeline = VK_NULL_HANDLE;
VkDescriptorSetLayout mDescriptorLayout = VK_NULL_HANDLE;
VkPipelineLayout mLayout = VK_NULL_HANDLE;
};
#endif // ANDROID_VULKANTESTHELPERS_H