update Windows Vulkan implementation
This commit is contained in:
@@ -25,15 +25,18 @@ add_library(${PROJECT_NAME} SHARED
|
||||
"utils.cpp"
|
||||
"d3d_texture.cpp"
|
||||
"vulkan_texture.cpp"
|
||||
"vulkan_platform.cpp"
|
||||
)
|
||||
|
||||
target_compile_features(${PROJECT_NAME} PUBLIC cxx_std_20)
|
||||
include_directories(${PROJECT_NAME} INTERFACE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../include"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../../include"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../../include/windows/vulkan"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../../include/filament/"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/"
|
||||
)
|
||||
target_link_directories(${PROJECT_NAME} PRIVATE
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../../../.dart_tool/thermion_dart/lib/v1.51.2/windows/debug
|
||||
"C:\\Users\\nickh\\Documents\\thermion\\thermion_dart\\.dart_tool\\thermion_dart\\lib\\v1.58.0\\windows\\debug"
|
||||
)
|
||||
|
||||
target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
@@ -44,24 +47,18 @@ target_link_libraries(${PROJECT_NAME} PRIVATE
|
||||
vulkan-1
|
||||
)
|
||||
|
||||
#add_executable(${PROJECT_NAME}_test
|
||||
# "main.cpp"
|
||||
#)
|
||||
add_executable(${PROJECT_NAME}_test
|
||||
"main.cpp"
|
||||
)
|
||||
|
||||
#target_compile_features(${PROJECT_NAME}_test PUBLIC cxx_std_20)
|
||||
target_compile_features(${PROJECT_NAME}_test PUBLIC cxx_std_20)
|
||||
|
||||
#target_include_directories(${PROJECT_NAME}_test PRIVATE
|
||||
# E:\\thermion\\thermion_dart\\native\\include\\vulkan
|
||||
## E:\\thermion\\thermion_dart\\native\\include
|
||||
# E:\\thermion\\thermion_dart\\native\\include\\filament
|
||||
#)
|
||||
#target_link_directories(${PROJECT_NAME}_test PRIVATE
|
||||
# E:\\thermion\\thermion_dart\\.dart_tool\\thermion_dart\\lib\\v1.51.2\\windows\\debug
|
||||
# E:\\VulkanSDK\\1.3.296.0\\Lib
|
||||
#)
|
||||
target_link_directories(${PROJECT_NAME}_test PRIVATE
|
||||
"C:\\Users\\nickh\\Documents\\thermion\\thermion_dart\\.dart_tool\\thermion_dart\\lib\\v1.58.0\\windows\\debug"
|
||||
)
|
||||
|
||||
#target_link_libraries(${PROJECT_NAME}_test PRIVATE
|
||||
# ${PROJECT_NAME}
|
||||
#)
|
||||
target_link_libraries(${PROJECT_NAME}_test PRIVATE
|
||||
${PROJECT_NAME}
|
||||
)
|
||||
|
||||
#add_dependencies(${PROJECT_NAME}_test ${PROJECT_NAME})
|
||||
add_dependencies(${PROJECT_NAME}_test ${PROJECT_NAME})
|
||||
@@ -75,6 +75,7 @@ namespace thermion::windows::d3d
|
||||
if (_D3D11Device) {
|
||||
_D3D11Device->Release();
|
||||
}
|
||||
std::cerr << "D3DContext destroyed" << std::endl;
|
||||
}
|
||||
|
||||
std::unique_ptr<D3DTexture> D3DContext::CreateTexture(uint32_t width, uint32_t height)
|
||||
@@ -128,24 +129,22 @@ namespace thermion::windows::d3d
|
||||
auto texture = std::make_unique<D3DTexture>(_d3dTexture2D, _d3dTexture2DHandle, width, height);
|
||||
|
||||
ID3D11RenderTargetView* rtv = nullptr;
|
||||
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc = {};
|
||||
rtvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||
rtvDesc.Texture2D.MipSlice = 0;
|
||||
D3D11_RENDER_TARGET_VIEW_DESC rtvDesc = {};
|
||||
rtvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
|
||||
rtvDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
|
||||
rtvDesc.Texture2D.MipSlice = 0;
|
||||
|
||||
hr = _D3D11Device->CreateRenderTargetView(_d3dTexture2D.Get(), &rtvDesc, &rtv);
|
||||
if (FAILED(hr)) {
|
||||
std::cout << "Failed to create render target view" << std::endl;
|
||||
// return;
|
||||
}
|
||||
hr = _D3D11Device->CreateRenderTargetView(_d3dTexture2D.Get(), &rtvDesc, &rtv);
|
||||
if (FAILED(hr)) {
|
||||
std::cout << "Failed to create render target view" << std::endl;
|
||||
// return;
|
||||
}
|
||||
|
||||
std::cout << "Created render target view" << std::endl;
|
||||
// Clear the texture to blue
|
||||
float blueColor[4] = { 1.0f, 0.0f, 1.0f, 1.0f }; // RGBA
|
||||
_D3D11DeviceContext->ClearRenderTargetView(rtv, blueColor);
|
||||
|
||||
// Clear the texture to blue
|
||||
float blueColor[4] = { 1.0f, 0.0f, 1.0f, 1.0f }; // RGBA
|
||||
_D3D11DeviceContext->ClearRenderTargetView(rtv, blueColor);
|
||||
std::cout << "FLUSH RENDER TARGET" << std::endl;
|
||||
Flush();
|
||||
Flush();
|
||||
return texture;
|
||||
}
|
||||
|
||||
|
||||
@@ -32,64 +32,66 @@ int main()
|
||||
uint32_t width = 100;
|
||||
uint32_t height = 100;
|
||||
auto handle = ctx->CreateRenderingSurface(width, height, 0, 0);
|
||||
|
||||
auto *engine = filament::Engine::create(filament::Engine::Backend::VULKAN, ctx->GetPlatform(), nullptr, nullptr);
|
||||
auto *swapChain = engine->createSwapChain(width,height, filament::backend::SWAP_CHAIN_CONFIG_TRANSPARENT | filament::backend::SWAP_CHAIN_CONFIG_READABLE | filament::SwapChain::CONFIG_HAS_STENCIL_BUFFER);
|
||||
engine->flushAndWait();
|
||||
|
||||
if(engine->isValid(reinterpret_cast<filament::SwapChain*>(swapChain))) {
|
||||
std::cout << "VALID SWAPCHIAN" << std::endl;
|
||||
} else {
|
||||
std::cout << "INVALID SWAPCHIAN" << std::endl;
|
||||
}
|
||||
|
||||
auto renderer = engine->createRenderer();
|
||||
filament::Renderer::ClearOptions clearOptions;
|
||||
clearOptions.clear = true;
|
||||
clearOptions.clearColor = { 0.0f, 1.0f, 0.0f, 1.0f };
|
||||
renderer->setClearOptions(clearOptions);
|
||||
auto scene = engine->createScene();
|
||||
auto *view = engine->createView();
|
||||
view->setViewport(filament::Viewport {0,0, width,height});
|
||||
view->setBlendMode(filament::View::BlendMode::TRANSLUCENT);
|
||||
view->setScene(scene);
|
||||
|
||||
auto camera = engine->createCamera(utils::EntityManager::get().create());
|
||||
view->setCamera(camera);
|
||||
|
||||
engine->flushAndWait();
|
||||
size_t pixelBufferSize = width * height * 4;
|
||||
auto out = new uint8_t[pixelBufferSize];
|
||||
auto pbd = filament::Texture::PixelBufferDescriptor(
|
||||
out, pixelBufferSize,
|
||||
filament::Texture::Format::RGBA,
|
||||
filament::Texture::Type::UBYTE, nullptr, nullptr, nullptr);
|
||||
renderer->beginFrame(swapChain);
|
||||
renderer->render(view);
|
||||
renderer->readPixels(0, 0, width, height, std::move(pbd));
|
||||
renderer->endFrame();
|
||||
|
||||
engine->flushAndWait();
|
||||
std::cout << "FLUSHED" << std::endl;
|
||||
|
||||
if(!SavePixelsAsBMP(out, width, height, width, "savepixels.bmp")) {
|
||||
std::cout << "FAILED TO SAVE PIXELS" << std::endl;
|
||||
}
|
||||
|
||||
std::cout << "SAVED PIXELS" << std::endl;
|
||||
|
||||
// ctx->GetTexture()->Flush();
|
||||
ctx->BlitFromSwapchain();
|
||||
|
||||
std::vector<uint8_t> outPixels(width * height * 4);
|
||||
|
||||
ctx->readPixelsFromImage(width, height, outPixels);
|
||||
|
||||
std::cout << "READBACK FROM VULKAN COMPLETE " << std::endl;
|
||||
|
||||
SavePixelsAsBMP(outPixels.data(), width, height, width, "vulkan_readback.bmp");
|
||||
|
||||
std::cout << "CREATED" << std::endl;
|
||||
ctx->DestroyRenderingSurface(handle);
|
||||
std::cout << "FINISHED" << std::endl;
|
||||
|
||||
// auto *engine = filament::Engine::create(filament::Engine::Backend::VULKAN, ctx->GetPlatform(), nullptr, nullptr);
|
||||
// auto *swapChain = engine->createSwapChain(width,height, filament::backend::SWAP_CHAIN_CONFIG_TRANSPARENT | filament::backend::SWAP_CHAIN_CONFIG_READABLE | filament::SwapChain::CONFIG_HAS_STENCIL_BUFFER);
|
||||
// engine->flushAndWait();
|
||||
|
||||
// if(engine->isValid(reinterpret_cast<filament::SwapChain*>(swapChain))) {
|
||||
// std::cout << "VALID SWAPCHIAN" << std::endl;
|
||||
// } else {
|
||||
// std::cout << "INVALID SWAPCHIAN" << std::endl;
|
||||
// }
|
||||
|
||||
// auto renderer = engine->createRenderer();
|
||||
// filament::Renderer::ClearOptions clearOptions;
|
||||
// clearOptions.clear = true;
|
||||
// clearOptions.clearColor = { 1.0f, 0.0f, 0.5f, 1.0f };
|
||||
// renderer->setClearOptions(clearOptions);
|
||||
// auto scene = engine->createScene();
|
||||
// auto *view = engine->createView();
|
||||
// view->setViewport(filament::Viewport {0,0, width,height});
|
||||
// view->setBlendMode(filament::View::BlendMode::TRANSLUCENT);
|
||||
// view->setScene(scene);
|
||||
|
||||
// auto camera = engine->createCamera(utils::EntityManager::get().create());
|
||||
// view->setCamera(camera);
|
||||
|
||||
// engine->flushAndWait();
|
||||
// size_t pixelBufferSize = width * height * 4;
|
||||
// auto out = new uint8_t[pixelBufferSize];
|
||||
// auto pbd = filament::Texture::PixelBufferDescriptor(
|
||||
// out, pixelBufferSize,
|
||||
// filament::Texture::Format::RGBA,
|
||||
// filament::Texture::Type::UBYTE, nullptr, nullptr, nullptr);
|
||||
// renderer->beginFrame(swapChain);
|
||||
// renderer->render(view);
|
||||
// renderer->readPixels(0, 0, width, height, std::move(pbd));
|
||||
// renderer->endFrame();
|
||||
|
||||
// engine->flushAndWait();
|
||||
// std::cout << "FLUSHED" << std::endl;
|
||||
|
||||
// if(!SavePixelsAsBMP(out, width, height, width, "savepixels.bmp")) {
|
||||
// std::cout << "FAILED TO SAVE PIXELS" << std::endl;
|
||||
// }
|
||||
|
||||
// // ctx->GetTexture()->Flush();
|
||||
// ctx->BlitFromSwapchain(width,height);
|
||||
// ctx->GetTexture()->SaveToBMP("d3d_texture.bmp");
|
||||
|
||||
// std::vector<uint8_t> outPixels(width * height * 4);
|
||||
|
||||
// ctx->readPixelsFromImage(width, height, outPixels);
|
||||
|
||||
// std::cout << "READBACK FROM VULKAN COMPLETE " << std::endl;
|
||||
|
||||
// thermion::windows::d3d::D3DTexture::SavePixelsAsBMP(outPixels.data(), width, height, width, "vulkan_readback.bmp");
|
||||
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
58
thermion_dart/native/src/windows/vulkan/vulkan_platform.cpp
Normal file
58
thermion_dart/native/src/windows/vulkan/vulkan_platform.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
|
||||
#include "vulkan_context.h"
|
||||
#include "ThermionWin32.h"
|
||||
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#include <chrono>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <memory>
|
||||
#include <thread>
|
||||
|
||||
#include "filament/backend/platforms/VulkanPlatform.h"
|
||||
#include "filament/Engine.h"
|
||||
#include "filament/Renderer.h"
|
||||
#include "filament/View.h"
|
||||
#include "filament/Viewport.h"
|
||||
#include "filament/Scene.h"
|
||||
#include "filament/SwapChain.h"
|
||||
#include "filament/Texture.h"
|
||||
#include "Log.hpp"
|
||||
|
||||
namespace thermion::windows::vulkan {
|
||||
|
||||
TVulkanPlatform::TVulkanPlatform() {
|
||||
_customization.gpu.index = 0;
|
||||
}
|
||||
|
||||
TVulkanPlatform::~TVulkanPlatform() {
|
||||
std::cerr << "Destroyed Vulkan platform" << std::endl;
|
||||
}
|
||||
|
||||
filament::backend::VulkanPlatform::Customization TVulkanPlatform::getCustomization() const noexcept {
|
||||
return _customization;
|
||||
}
|
||||
|
||||
filament::backend::VulkanPlatform::SwapChainPtr TVulkanPlatform::createSwapChain(void* nativeWindow, uint64_t flags,
|
||||
VkExtent2D extent) {
|
||||
std::lock_guard lock(mutex);
|
||||
current = filament::backend::VulkanPlatform::createSwapChain(nativeWindow, flags, extent);
|
||||
std::cerr << "Created swap chain with flags " << flags << std::endl;
|
||||
return current;
|
||||
}
|
||||
|
||||
void TVulkanPlatform::destroy(filament::backend::VulkanPlatform::SwapChainPtr handle) {
|
||||
std::lock_guard lock(mutex);
|
||||
current = nullptr;
|
||||
std::cerr << "Destroyed swap chain" << std::endl;
|
||||
}
|
||||
|
||||
VkResult TVulkanPlatform::present(SwapChainPtr handle, uint32_t index, VkSemaphore finishedDrawing) {
|
||||
auto result = filament::backend::VulkanPlatform::present(handle, index, finishedDrawing);
|
||||
currentColorIndex = index;
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user