Vulkan: Add Initial VKFrameBuffer.

This was backported from tmp-vulkan. When disabling the fence check
in ghost it is able to start blender. It will show a black screen
so not usable for users.
This commit is contained in:
Jeroen Bakker
2023-02-28 06:13:57 +01:00
parent c2df623e86
commit 3cba2911e0
7 changed files with 88 additions and 9 deletions
-2
View File
@@ -12,8 +12,6 @@
#include "vk_common.hh"
#include "vk_context.hh"
#include "vk_mem_alloc.h"
namespace blender::gpu {
/**
+2
View File
@@ -13,6 +13,8 @@
# include <vulkan/vulkan.h>
#endif
#include "vk_mem_alloc.h"
#include "gpu_texture_private.hh"
namespace blender::gpu {
+20
View File
@@ -8,6 +8,7 @@
#include "vk_context.hh"
#include "vk_backend.hh"
#include "vk_framebuffer.hh"
#include "vk_memory.hh"
#include "vk_state_manager.hh"
@@ -48,6 +49,9 @@ VKContext::VKContext(void *ghost_window, void *ghost_context)
state_manager = new VKStateManager();
VKBackend::capabilities_init(*this);
/* For offscreen contexts. Default framebuffer is empty. */
active_fb = back_left = new VKFrameBuffer("back_left");
}
VKContext::~VKContext()
@@ -65,6 +69,22 @@ void VKContext::init_physical_device_limits()
void VKContext::activate()
{
if (ghost_window_) {
VkImage image; /* TODO will be used for reading later... */
VkFramebuffer framebuffer;
VkRenderPass render_pass;
VkExtent2D extent;
uint32_t fb_id;
GHOST_GetVulkanBackbuffer(
(GHOST_WindowHandle)ghost_window_, &image, &framebuffer, &render_pass, &extent, &fb_id);
/* Recreate the gpu::VKFrameBuffer wrapper after every swap. */
delete back_left;
back_left = new VKFrameBuffer("back_left", framebuffer, render_pass, extent);
active_fb = back_left;
}
}
void VKContext::deactivate()
-2
View File
@@ -12,8 +12,6 @@
#include "vk_command_buffer.hh"
#include "vk_descriptor_pools.hh"
#include "vk_mem_alloc.h"
namespace blender::gpu {
class VKContext : public Context {
@@ -9,6 +9,43 @@
namespace blender::gpu {
/* -------------------------------------------------------------------- */
/** \name Creation & Deletion
* \{ */
VKFrameBuffer::VKFrameBuffer(const char *name) : FrameBuffer(name)
{
immutable_ = false;
}
VKFrameBuffer::VKFrameBuffer(const char *name,
VkFramebuffer vk_framebuffer,
VkRenderPass /*vk_render_pass*/,
VkExtent2D vk_extent)
: FrameBuffer(name)
{
immutable_ = true;
/* Never update an internal frame-buffer. */
dirty_attachments_ = false;
width_ = vk_extent.width;
height_ = vk_extent.height;
vk_framebuffer_ = vk_framebuffer;
viewport_[0] = scissor_[0] = 0;
viewport_[1] = scissor_[1] = 0;
viewport_[2] = scissor_[2] = width_;
viewport_[3] = scissor_[3] = height_;
}
VKFrameBuffer::~VKFrameBuffer()
{
if (!immutable_ && vk_framebuffer_ != VK_NULL_HANDLE) {
vkDestroyFramebuffer(vk_device_, vk_framebuffer_, NULL);
}
}
/** \} */
void VKFrameBuffer::bind(bool /*enabled_srgb*/)
{
}
+29 -3
View File
@@ -9,13 +9,39 @@
#include "gpu_framebuffer_private.hh"
#include "vk_common.hh"
namespace blender::gpu {
class VKFrameBuffer : public FrameBuffer {
private:
/* Vulkan object handle. */
VkFramebuffer vk_framebuffer_ = VK_NULL_HANDLE;
/* Vulkan device who created the handle. */
VkDevice vk_device_ = VK_NULL_HANDLE;
/* Base render pass used for framebuffer creation. */
VkRenderPass render_pass_ = VK_NULL_HANDLE;
/* Number of layers if the attachments are layered textures. */
int depth_ = 1;
/** Internal frame-buffers are immutable. */
bool immutable_;
public:
VKFrameBuffer(const char *name) : FrameBuffer(name)
{
}
/**
* Create a conventional framebuffer to attach texture to.
**/
VKFrameBuffer(const char *name);
/**
* Special frame-buffer encapsulating internal window frame-buffer.
* This just act as a wrapper, the actual allocations are done by GHOST_ContextVK.
**/
VKFrameBuffer(const char *name,
VkFramebuffer vk_framebuffer,
VkRenderPass vk_render_pass,
VkExtent2D vk_extent);
~VKFrameBuffer();
void bind(bool enabled_srgb) override;
bool check(char err_out[256]) override;
-2
View File
@@ -10,8 +10,6 @@
#include "gpu_texture_private.hh"
#include "vk_context.hh"
#include "vk_mem_alloc.h"
namespace blender::gpu {
class VKTexture : public Texture {