android port
This commit is contained in:
@@ -33,7 +33,6 @@ CUtlVector<CUtlString> RenderContextVulkan_CompiledFiles = {
|
||||
"vulkan/commands/base.cpp",
|
||||
"vulkan/libraries/raster.cpp",
|
||||
EXTERNAL"volk/volk.c",
|
||||
"gamewindow_sdl.cpp",
|
||||
"stb.c",
|
||||
};
|
||||
|
||||
@@ -89,6 +88,16 @@ DECLARE_BUILD_STAGE(RenderSystemVulkan)
|
||||
|
||||
compileProject.m_szName = "RenderSystemVulkan";
|
||||
compileProject.files = RenderContextVulkan_CompiledFiles;
|
||||
if (Target_t::DefaultTarget().kernel == TARGET_KERNEL_ANDROID)
|
||||
{
|
||||
|
||||
compileProject.files.AppendTail("gamewindow_android.cpp");
|
||||
compileProject.macros = {
|
||||
(C_Macro_t){"VK_USE_PLATFORM_ANDROID_KHR"}
|
||||
};
|
||||
}
|
||||
else
|
||||
compileProject.files.AppendTail("gamewindow_sdl.cpp");
|
||||
compileProject.includeDirectories = {
|
||||
"../public",
|
||||
FUNNYSTDLIB"public",
|
||||
|
||||
@@ -0,0 +1,224 @@
|
||||
#include "android/android_native_app_glue.h"
|
||||
#include "materialsystem/igamewindow.h"
|
||||
#include "tier0/lib.h"
|
||||
#include "tier0/platform.h"
|
||||
#include "tier1/interface.h"
|
||||
#include "tier1/utlvector.h"
|
||||
|
||||
#include "volk.h"
|
||||
|
||||
extern struct android_app *g_android_app;
|
||||
class CAndroidGameWindow: public IGameWindow
|
||||
{
|
||||
public:
|
||||
virtual void Init() override;
|
||||
virtual void Shutdown() override;
|
||||
virtual void Frame( float fDelta ) override;
|
||||
|
||||
virtual uint32_t GetRenderWidth() override;
|
||||
virtual uint32_t GetRenderHeight() override;
|
||||
virtual bool BRenderSizeUpdated() override;
|
||||
|
||||
virtual void SetOutputImage( IImage *pImage ) override;
|
||||
virtual IImage *GetOutputImage() override;
|
||||
|
||||
virtual void SetKeyCallback( KeyCallbackFn fn ) override;
|
||||
virtual void SetAxisCallback( AxisCallbackFn fn ) override;
|
||||
|
||||
virtual void *CreateVulkanSurface( void *pInstance ) override;
|
||||
virtual void DestroyVulkanSurface( void *pInstance ) override;
|
||||
|
||||
virtual bool IsValid() override;
|
||||
|
||||
KeyCallbackFn m_fnKeyCallback = NULL;
|
||||
AxisCallbackFn m_fnAxisCallback = NULL;
|
||||
|
||||
bool m_bWindowSizeUpdated;
|
||||
uint32_t m_uRenderWidth;
|
||||
uint32_t m_uRenderHeight;
|
||||
|
||||
bool m_bIsValid = false;
|
||||
|
||||
private:
|
||||
|
||||
VkSurfaceKHR m_hSurface = NULL;
|
||||
IImage *m_pOutputImage = NULL;
|
||||
};
|
||||
void CAndroidGameWindow::Init()
|
||||
{
|
||||
m_uRenderWidth = 1280;
|
||||
m_uRenderHeight = 720;
|
||||
}
|
||||
|
||||
void CAndroidGameWindow::Shutdown()
|
||||
{
|
||||
}
|
||||
|
||||
void CAndroidGameWindow::Frame( float fDelta )
|
||||
{
|
||||
}
|
||||
|
||||
uint32_t CAndroidGameWindow::GetRenderWidth()
|
||||
{
|
||||
return m_uRenderWidth;
|
||||
}
|
||||
|
||||
uint32_t CAndroidGameWindow::GetRenderHeight()
|
||||
{
|
||||
return m_uRenderHeight;
|
||||
}
|
||||
|
||||
bool CAndroidGameWindow::BRenderSizeUpdated()
|
||||
{
|
||||
return m_bWindowSizeUpdated;
|
||||
}
|
||||
|
||||
void CAndroidGameWindow::SetOutputImage( IImage *pImage )
|
||||
{
|
||||
m_pOutputImage = pImage;
|
||||
}
|
||||
|
||||
IImage *CAndroidGameWindow::GetOutputImage()
|
||||
{
|
||||
return m_pOutputImage;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void CAndroidGameWindow::SetKeyCallback( KeyCallbackFn fn )
|
||||
{
|
||||
m_fnKeyCallback = fn;
|
||||
}
|
||||
|
||||
void CAndroidGameWindow::SetAxisCallback( AxisCallbackFn fn )
|
||||
{
|
||||
m_fnAxisCallback = fn;
|
||||
}
|
||||
|
||||
void *CAndroidGameWindow::CreateVulkanSurface( void *pInstance )
|
||||
{
|
||||
VkAndroidSurfaceCreateInfoKHR ci = {};
|
||||
ci.sType = VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR;
|
||||
ci.window = g_android_app->window;
|
||||
vkCreateAndroidSurfaceKHR((VkInstance)pInstance, &ci, NULL, &m_hSurface);
|
||||
return m_hSurface;
|
||||
}
|
||||
|
||||
void CAndroidGameWindow::DestroyVulkanSurface( void *pInstance )
|
||||
{
|
||||
vkDestroySurfaceKHR((VkInstance)pInstance, m_hSurface, NULL);
|
||||
}
|
||||
|
||||
bool CAndroidGameWindow::IsValid()
|
||||
{
|
||||
return m_bIsValid;
|
||||
}
|
||||
|
||||
class CAndroidGameWindowManager: public IGameWindowManager
|
||||
{
|
||||
public:
|
||||
virtual void Init() override;
|
||||
virtual void Frame( float fDelta ) override;
|
||||
virtual void Shutdown() override;
|
||||
|
||||
virtual IGameWindow *CreateWindow() override;
|
||||
virtual void DestroyWindow( IGameWindow* pWindow ) override;
|
||||
|
||||
virtual int GetVulkanInstanceExtensionCount() override;
|
||||
virtual const char **GetVulkanInstanceExtensions() override;
|
||||
CAndroidGameWindow m_window;
|
||||
private:
|
||||
};
|
||||
|
||||
IGameWindowManager *GameWindowManager()
|
||||
{
|
||||
static CAndroidGameWindowManager mgr;
|
||||
return &mgr;
|
||||
}
|
||||
EXPOSE_INTERFACE_FN(GameWindowManager, IGameWindowManager, GAME_WINDOW_MANAGER_INTERFACE_VERSION)
|
||||
|
||||
#include "android/log.h"
|
||||
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, "funnygame", __VA_ARGS__)
|
||||
static void HandleAndroidEvent(android_app* app, int32_t cmd) {
|
||||
CAndroidGameWindowManager *pMgr = (CAndroidGameWindowManager*)GameWindowManager();
|
||||
switch (cmd) {
|
||||
case APP_CMD_INIT_WINDOW:
|
||||
pMgr->m_window.m_bIsValid = true;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void CAndroidGameWindowManager::Init()
|
||||
{
|
||||
g_android_app->onAppCmd = HandleAndroidEvent;
|
||||
while (true)
|
||||
{
|
||||
int events;
|
||||
android_poll_source* source;
|
||||
while (ALooper_pollOnce(0, nullptr, &events, (void**)&source) >= 0) {
|
||||
if (source) source->process(g_android_app, source);
|
||||
}
|
||||
if (m_window.IsValid())
|
||||
break;
|
||||
}
|
||||
}
|
||||
/*
|
||||
static EInputButton GetKeyButton( Android_Keycode eCode )
|
||||
{
|
||||
|
||||
}
|
||||
*/
|
||||
|
||||
void CAndroidGameWindowManager::Frame( float fDelta )
|
||||
{
|
||||
m_window.m_bWindowSizeUpdated = false;
|
||||
int events;
|
||||
android_poll_source* source;
|
||||
while (ALooper_pollOnce(0, nullptr, &events, (void**)&source) >= 0) {
|
||||
if (source) source->process(g_android_app, source);
|
||||
}
|
||||
LOGI("%u %u", m_window.m_uRenderWidth, m_window.m_uRenderHeight);
|
||||
uint32_t uNewWidth = ANativeWindow_getWidth(g_android_app->window);
|
||||
uint32_t uNewHeight = ANativeWindow_getHeight(g_android_app->window);
|
||||
if (m_window.m_uRenderWidth != uNewWidth || m_window.m_uRenderHeight != uNewHeight)
|
||||
{
|
||||
m_window.m_bWindowSizeUpdated = true;
|
||||
}
|
||||
m_window.m_uRenderWidth = uNewWidth;
|
||||
m_window.m_uRenderHeight = uNewHeight;
|
||||
}
|
||||
|
||||
void CAndroidGameWindowManager::Shutdown()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
IGameWindow *CAndroidGameWindowManager::CreateWindow()
|
||||
{
|
||||
return &m_window;
|
||||
}
|
||||
|
||||
void CAndroidGameWindowManager::DestroyWindow( IGameWindow* pWindow )
|
||||
{
|
||||
pWindow->Shutdown();
|
||||
}
|
||||
|
||||
|
||||
int CAndroidGameWindowManager::GetVulkanInstanceExtensionCount()
|
||||
{
|
||||
|
||||
return 2;
|
||||
}
|
||||
|
||||
static const char *extensions[] = {
|
||||
VK_KHR_ANDROID_SURFACE_EXTENSION_NAME,
|
||||
VK_KHR_SURFACE_EXTENSION_NAME,
|
||||
};
|
||||
const char **CAndroidGameWindowManager::GetVulkanInstanceExtensions()
|
||||
{
|
||||
|
||||
return extensions;
|
||||
}
|
||||
@@ -23,6 +23,9 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
{
|
||||
if (vkCmdBeginRendering || vkCmdBeginRenderingKHR)
|
||||
{
|
||||
V_printf("USING DYNAMIC RENDERING\n");
|
||||
V_printf("%p\n", vkCmdBeginRendering);
|
||||
V_printf("%p\n", vkCmdBeginRenderingKHR);
|
||||
VkRenderingInfo stRenderingInfo = {};
|
||||
CUtlVector<VkRenderingAttachmentInfo> attachments = {};
|
||||
VkRenderingAttachmentInfo depthAttachment = {};
|
||||
@@ -75,6 +78,7 @@ DECLARE_VULKAN_COMMAND(Begin)
|
||||
}
|
||||
else
|
||||
{
|
||||
V_printf("USING RENDERPASS");
|
||||
CUtlVector<VkAttachmentDescription> attachments = {};
|
||||
CUtlVector<VkAttachmentReference> input_refs = {};
|
||||
CUtlVector<VkImageView> image_views = {};
|
||||
@@ -184,7 +188,10 @@ DECLARE_VULKAN_COMMAND(End)
|
||||
else if (vkCmdEndRenderingKHR)
|
||||
vkCmdEndRenderingKHR(hCommandBuffer);
|
||||
else
|
||||
{
|
||||
vkCmdEndRenderPass(hCommandBuffer);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
DECLARE_VULKAN_COMMAND(SetShader)
|
||||
|
||||
@@ -8,6 +8,7 @@ void CVkComputeShader::Build()
|
||||
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(s->m_nMetadataLump);
|
||||
VkPipelineLayoutCreateInfo stPipelineLayout = {};
|
||||
CUtlVector<CUtlVector<VkDescriptorSetLayoutBinding>> bindings = {};
|
||||
VkShaderModule sm;
|
||||
|
||||
for ( int u = 0; u < pMetaData->nDescriptorsCount; u++ )
|
||||
{
|
||||
@@ -45,8 +46,14 @@ void CVkComputeShader::Build()
|
||||
mod.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
mod.pCode = (uint32_t*)m_shader.GetLumpPtr(s->m_nDataLump);
|
||||
mod.codeSize = m_shader.GetLumpSize(s->m_nDataLump);
|
||||
if (g_vkAvailableExtensions.bIsSupported_VK_KHR_MAINTENANCE_5)
|
||||
stage.pNext = &mod;
|
||||
else
|
||||
{
|
||||
vkCreateShaderModule(m_hDevice, &mod, NULL, &sm);
|
||||
stage.module = sm;
|
||||
}
|
||||
stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
stage.pNext = &mod;
|
||||
stage.pName = "main";
|
||||
stage.stage = VK_SHADER_STAGE_COMPUTE_BIT;
|
||||
|
||||
|
||||
@@ -6,6 +6,7 @@ REQUIRED_EXTENSION(VK_EXT_DESCRIPTOR_INDEXING)
|
||||
REQUIRED_EXTENSION(VK_KHR_TIMELINE_SEMAPHORE )
|
||||
REQUIRED_EXTENSION(VK_KHR_SEPARATE_DEPTH_STENCIL_LAYOUTS)
|
||||
OPTIONAL_EXTENSION(VK_KHR_RAY_TRACING_PIPELINE)
|
||||
OPTIONAL_EXTENSION(VK_KHR_CREATE_RENDERPASS_2)
|
||||
OPTIONAL_EXTENSION(VK_KHR_ACCELERATION_STRUCTURE)
|
||||
OPTIONAL_EXTENSION(VK_KHR_DEFERRED_HOST_OPERATIONS)
|
||||
OPTIONAL_EXTENSION(VK_KHR_BUFFER_DEVICE_ADDRESS)
|
||||
@@ -14,4 +15,3 @@ OPTIONAL_EXTENSION(VK_KHR_MAINTENANCE_5)
|
||||
//OPTIONAL_EXTENSION(VK_KHR_DYNAMIC_RENDERING)
|
||||
//OPTIONAL_EXTENSION(VK_KHR_SYNCHRONIZATION2)
|
||||
//OPTIONAL_EXTENSION(VK_KHR_COPY_COMMANDS2)
|
||||
//OPTIONAL_EXTENSION(VK_KHR_DYNAMIC_RENDERING)
|
||||
|
||||
@@ -42,6 +42,7 @@ void CVkRenderCommandList::Begin( BeginInfo *pBegin )
|
||||
output.m_eLoadMode = pBegin->pDepth->eLoadMode;
|
||||
output.m_eStoreMode = pBegin->pDepth->eStoreMode;
|
||||
pBeginCommand->stDepthImage = output;
|
||||
pBeginCommand->bDepthEnabled = true;
|
||||
}
|
||||
m_pCurrentBegin = pBeginCommand;
|
||||
m_pCommandBuffer->AddCommand(pBeginCommand);
|
||||
|
||||
@@ -228,7 +228,7 @@ void CVkImage::SetDebugName( const char *szName )
|
||||
nameInfo.objectHandle = (uint64_t)m_image;
|
||||
nameInfo.pObjectName = szName;
|
||||
|
||||
vkSetDebugUtilsObjectNameEXT(s_vkDevice, &nameInfo);
|
||||
//vkSetDebugUtilsObjectNameEXT(s_vkDevice, &nameInfo);
|
||||
}
|
||||
|
||||
|
||||
@@ -807,7 +807,7 @@ void CVkRenderContext::Init()
|
||||
stInstanceCreateInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
|
||||
stInstanceCreateInfo.pApplicationInfo = &stApplicationInfo;
|
||||
enabledInstanceExtensions.AppendTail(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
|
||||
enabledInstanceExtensions.AppendTail(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
//enabledInstanceExtensions.AppendTail(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
|
||||
stInstanceCreateInfo.enabledExtensionCount = enabledInstanceExtensions.GetSize();
|
||||
stInstanceCreateInfo.ppEnabledExtensionNames = enabledInstanceExtensions.GetData();
|
||||
|
||||
@@ -898,12 +898,14 @@ void CVkRenderContext::Init()
|
||||
vkGetDeviceQueue(s_vkDevice, g_iDrawFamily, 0, &s_vkDrawQueue);
|
||||
vkGetDeviceQueue(s_vkDevice, g_iPresentFamily, 0, &s_vkPresentQueue);
|
||||
volkLoadDevice(s_vkDevice);
|
||||
vkCmdBeginRendering = NULL;
|
||||
vkCmdEndRendering = NULL;
|
||||
|
||||
VmaAllocatorCreateInfo stAllocatorInfo = {};
|
||||
stAllocatorInfo.flags = VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT
|
||||
| VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT
|
||||
;
|
||||
stAllocatorInfo.vulkanApiVersion = VK_API_VERSION_1_4;
|
||||
stAllocatorInfo.flags = VMA_ALLOCATOR_CREATE_BUFFER_DEVICE_ADDRESS_BIT;
|
||||
if (g_vkAvailableExtensions.bIsSupported_VK_KHR_MAINTENANCE_5)
|
||||
stAllocatorInfo.flags |= VMA_ALLOCATOR_CREATE_KHR_MAINTENANCE5_BIT;
|
||||
stAllocatorInfo.vulkanApiVersion = VK_API_VERSION_1_1;
|
||||
stAllocatorInfo.physicalDevice = s_vkPhysicalDevice;
|
||||
stAllocatorInfo.device = s_vkDevice;
|
||||
stAllocatorInfo.instance = s_vkInstance;
|
||||
@@ -946,7 +948,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
{
|
||||
uint32_t i;
|
||||
CUtlVector<VkSwapchainKHR> swapchains = {};
|
||||
CUtlVector<uint32_t> uImageIndexes = {};
|
||||
CUtlVector<uint32_t> uSwapchainImageIndexes = {};
|
||||
CUtlVector<VulkanWindow_t> recreatedWindows = {};
|
||||
|
||||
@@ -975,7 +976,6 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
for ( auto &s: m_renderWindows)
|
||||
{
|
||||
swapchains.AppendTail(s.m_swapchain);
|
||||
uImageIndexes.AppendTail(s.m_uCurrentFrame);
|
||||
}
|
||||
uSwapchainImageIndexes.Resize(m_renderWindows.GetSize());
|
||||
|
||||
@@ -1092,7 +1092,7 @@ void CVkRenderContext::Frame( float fDeltaTime )
|
||||
stPresentInfo.sType = VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||
stPresentInfo.swapchainCount = swapchains.GetSize();
|
||||
stPresentInfo.pSwapchains = swapchains.GetData();
|
||||
stPresentInfo.pImageIndices = uImageIndexes.GetData();
|
||||
stPresentInfo.pImageIndices = uSwapchainImageIndexes.GetData();
|
||||
|
||||
vkQueuePresentKHR(s_vkPresentQueue, &stPresentInfo);
|
||||
vkDeviceWaitIdle(s_vkDevice);
|
||||
|
||||
@@ -298,9 +298,9 @@ void CVkShaderLinker::Build()
|
||||
m_out.m_data = spv.data;
|
||||
m_out.m_size = spv.count;
|
||||
|
||||
IFileHandle *ph = filesystem->Open("a.txt", FILEMODE_WRITE);
|
||||
filesystem->Write(ph, spv.data, spv.count*4);
|
||||
filesystem->Close(ph);
|
||||
//IFileHandle *ph = filesystem->Open("a.txt", FILEMODE_WRITE);
|
||||
//filesystem->Write(ph, spv.data, spv.count*4);
|
||||
//filesystem->Close(ph);
|
||||
|
||||
|
||||
mspv_array_destroy(spv);
|
||||
|
||||
@@ -70,6 +70,7 @@ void CVkShader::Build()
|
||||
VkGraphicsPipelineCreateInfo createInfo = {};
|
||||
CUtlVector<VkPipelineShaderStageCreateInfo> stages = {};
|
||||
CUtlVector<VkShaderModuleCreateInfo> modules = {};
|
||||
CUtlVector<VkShaderModule> sms = {};
|
||||
VkPipelineVertexInputStateCreateInfo vertexInput = {};
|
||||
VkPipelineInputAssemblyStateCreateInfo inputAssembly = {};
|
||||
VkPipelineDynamicStateCreateInfo dynamicState = {};
|
||||
@@ -91,6 +92,7 @@ void CVkShader::Build()
|
||||
// TODO: Filter by vulkan shaders at some points
|
||||
stages.Resize(m_shader.m_objects.GetSize());
|
||||
modules.Resize(m_shader.m_objects.GetSize());
|
||||
sms.Resize(m_shader.m_objects.GetSize());
|
||||
for ( int i = 0; i < m_shader.m_objects.GetSize(); i++ )
|
||||
{
|
||||
VulkanInputMetaData_t *pMetaData = (VulkanInputMetaData_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nMetadataLump);
|
||||
@@ -127,11 +129,21 @@ void CVkShader::Build()
|
||||
bindings[stDescriptor.uSet].AppendTail(bind);
|
||||
m_bindings.AppendTail(stDescriptor);
|
||||
}
|
||||
modules[i] = {};
|
||||
modules[i].sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
|
||||
modules[i].pCode = (uint32_t*)m_shader.GetLumpPtr(m_shader.m_objects[i].m_nDataLump);
|
||||
modules[i].codeSize = m_shader.GetLumpSize(m_shader.m_objects[i].m_nDataLump);
|
||||
if (!g_vkAvailableExtensions.bIsSupported_VK_KHR_MAINTENANCE_5)
|
||||
{
|
||||
VkResult r = vkCreateShaderModule(m_hDevice, &modules[i], NULL, &sms[i]);
|
||||
VULKAN_RESULT_PRINT(r, vkCreateShaderModule);
|
||||
}
|
||||
stages[i] = {};
|
||||
stages[i].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
|
||||
stages[i].pNext = &modules[i];
|
||||
if (g_vkAvailableExtensions.bIsSupported_VK_KHR_MAINTENANCE_5)
|
||||
stages[i].pNext = &modules[i];
|
||||
else
|
||||
stages[i].module = sms[i];
|
||||
stages[i].pName = "main";
|
||||
stages[i].stage = VulkanGetShaderStage(m_shader.m_objects[i].m_eStage);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user