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:
@@ -12,8 +12,6 @@
|
||||
#include "vk_common.hh"
|
||||
#include "vk_context.hh"
|
||||
|
||||
#include "vk_mem_alloc.h"
|
||||
|
||||
namespace blender::gpu {
|
||||
|
||||
/**
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
# include <vulkan/vulkan.h>
|
||||
#endif
|
||||
|
||||
#include "vk_mem_alloc.h"
|
||||
|
||||
#include "gpu_texture_private.hh"
|
||||
|
||||
namespace blender::gpu {
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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*/)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user