GPU: Add placeholder for Vulkan backend.

This patch adds a placeholder for the vulkan backend.
When activated (`WITH_VULKAN_BACKEND=On` and `--gpu-backend vulkan`)
it might open a blender screen, but nothing should be visible as
none of the functions are implemented or otherwise crash on a nullptr.

This is expected as this is just a placeholder. The goal is to add shader compilation
+validation to this backend as one of the next steps so we can validate
changes to existing shaders on OpenGL, Metal and Vulkan at the same time.

Reviewed By: fclem

Differential Revision: https://developer.blender.org/D16338
This commit is contained in:
Jeroen Bakker 2022-10-31 16:01:02 +01:00 committed by Jeroen Bakker
parent c2e36c09b9
commit 0e6f2d9fe0
31 changed files with 1088 additions and 1 deletions

View File

@ -569,6 +569,12 @@ mark_as_advanced(
WITH_GPU_BUILDTIME_SHADER_BUILDER
)
# Vulkan
option(WITH_VULKAN_BACKEND "Enable Vulkan as graphics backend (only for development)" OFF)
mark_as_advanced(
WITH_VULKAN_BACKEND
)
# Metal
if(APPLE)
@ -1222,6 +1228,13 @@ if(WITH_OPENGL)
endif()
# -----------------------------------------------------------------------------
# Configure Vulkan.
if(WITH_VULKAN_BACKEND)
add_definitions(-DWITH_VULKAN_BACKEND)
endif()
# -----------------------------------------------------------------------------
# Configure Metal

View File

@ -12,6 +12,7 @@ endif()
set(INC
.
intern
vulkan
metal
opengl
../blenkernel
@ -184,6 +185,34 @@ set(OPENGL_SRC
opengl/gl_vertex_buffer.hh
)
set(VULKAN_SRC
vulkan/vk_backend.cc
vulkan/vk_batch.cc
vulkan/vk_context.cc
vulkan/vk_drawlist.cc
vulkan/vk_framebuffer.cc
vulkan/vk_index_buffer.cc
vulkan/vk_query.cc
vulkan/vk_shader.cc
vulkan/vk_storage_buffer.cc
vulkan/vk_texture.cc
vulkan/vk_uniform_buffer.cc
vulkan/vk_vertex_buffer.cc
vulkan/vk_backend.hh
vulkan/vk_batch.hh
vulkan/vk_context.hh
vulkan/vk_drawlist.hh
vulkan/vk_framebuffer.hh
vulkan/vk_index_buffer.hh
vulkan/vk_query.hh
vulkan/vk_shader.hh
vulkan/vk_storage_buffer.hh
vulkan/vk_texture.hh
vulkan/vk_uniform_buffer.hh
vulkan/vk_vertex_buffer.hh
)
set(METAL_SRC
metal/mtl_backend.mm
metal/mtl_batch.mm
@ -235,6 +264,10 @@ if(WITH_OPENGL)
list(APPEND SRC ${OPENGL_SRC})
endif()
if(WITH_VULKAN_BACKEND)
list(APPEND SRC ${VULKAN_SRC})
endif()
if(WITH_METAL_BACKEND)
list(APPEND SRC ${METAL_SRC})
endif()

View File

@ -16,6 +16,7 @@ typedef enum eGPUBackendType {
GPU_BACKEND_NONE = 0,
GPU_BACKEND_OPENGL = 1 << 0,
GPU_BACKEND_METAL = 1 << 1,
GPU_BACKEND_VULKAN = 1 << 3,
GPU_BACKEND_ANY = 0xFFFFFFFFu
} eGPUBackendType;

View File

@ -33,6 +33,9 @@
# include "gl_backend.hh"
# include "gl_context.hh"
#endif
#ifdef WITH_VULKAN_BACKEND
# include "vk_backend.hh"
#endif
#ifdef WITH_METAL_BACKEND
# include "mtl_backend.hh"
#endif
@ -244,6 +247,12 @@ bool GPU_backend_supported(void)
return true;
#else
return false;
#endif
case GPU_BACKEND_VULKAN:
#ifdef WITH_VULKAN_BACKEND
return true;
#else
return false;
#endif
case GPU_BACKEND_METAL:
#ifdef WITH_METAL_BACKEND
@ -268,6 +277,11 @@ static void gpu_backend_create()
g_backend = new GLBackend;
break;
#endif
#ifdef WITH_VULKAN_BACKEND
case GPU_BACKEND_VULKAN:
g_backend = new VKBackend;
break;
#endif
#ifdef WITH_METAL_BACKEND
case GPU_BACKEND_METAL:
g_backend = new MTLBackend;

View File

@ -0,0 +1,107 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_backend.hh"
#include "vk_batch.hh"
#include "vk_context.hh"
#include "vk_drawlist.hh"
#include "vk_framebuffer.hh"
#include "vk_index_buffer.hh"
#include "vk_query.hh"
#include "vk_shader.hh"
#include "vk_storage_buffer.hh"
#include "vk_texture.hh"
#include "vk_uniform_buffer.hh"
#include "vk_vertex_buffer.hh"
namespace blender::gpu {
void VKBackend::delete_resources()
{
}
void VKBackend::samplers_update()
{
}
void VKBackend::compute_dispatch(int /*groups_x_len*/, int /*groups_y_len*/, int /*groups_z_len*/)
{
}
void VKBackend::compute_dispatch_indirect(StorageBuf * /*indirect_buf*/)
{
}
Context *VKBackend::context_alloc(void * /*ghost_window*/, void * /*ghost_context*/)
{
return new VKContext();
}
Batch *VKBackend::batch_alloc()
{
return new VKBatch();
}
DrawList *VKBackend::drawlist_alloc(int /*list_length*/)
{
return new VKDrawList();
}
FrameBuffer *VKBackend::framebuffer_alloc(const char *name)
{
return new VKFrameBuffer(name);
}
IndexBuf *VKBackend::indexbuf_alloc()
{
return new VKIndexBuffer();
}
QueryPool *VKBackend::querypool_alloc()
{
return new VKQueryPool();
}
Shader *VKBackend::shader_alloc(const char *name)
{
return new VKShader(name);
}
Texture *VKBackend::texture_alloc(const char *name)
{
return new VKTexture(name);
}
UniformBuf *VKBackend::uniformbuf_alloc(int size, const char *name)
{
return new VKUniformBuffer(size, name);
}
StorageBuf *VKBackend::storagebuf_alloc(int size, GPUUsageType /*usage*/, const char *name)
{
return new VKStorageBuffer(size, name);
}
VertBuf *VKBackend::vertbuf_alloc()
{
return new VKVertexBuffer();
}
void VKBackend::render_begin()
{
}
void VKBackend::render_end()
{
}
void VKBackend::render_step()
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,42 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_backend.hh"
namespace blender::gpu {
class VKBackend : public GPUBackend {
public:
void delete_resources() override;
void samplers_update() override;
void compute_dispatch(int groups_x_len, int groups_y_len, int groups_z_len) override;
void compute_dispatch_indirect(StorageBuf *indirect_buf) override;
Context *context_alloc(void *ghost_window, void *ghost_context) override;
Batch *batch_alloc() override;
DrawList *drawlist_alloc(int list_length) override;
FrameBuffer *framebuffer_alloc(const char *name) override;
IndexBuf *indexbuf_alloc() override;
QueryPool *querypool_alloc() override;
Shader *shader_alloc(const char *name) override;
Texture *texture_alloc(const char *name) override;
UniformBuf *uniformbuf_alloc(int size, const char *name) override;
StorageBuf *storagebuf_alloc(int size, GPUUsageType usage, const char *name) override;
VertBuf *vertbuf_alloc() override;
/* Render Frame Coordination --
* Used for performing per-frame actions globally */
void render_begin() override;
void render_end() override;
void render_step() override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,27 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_batch.hh"
namespace blender::gpu {
void VKBatch::draw(int /*v_first*/, int /*v_count*/, int /*i_first*/, int /*i_count*/)
{
}
void VKBatch::draw_indirect(GPUStorageBuf * /*indirect_buf*/, intptr_t /*offset*/)
{
}
void VKBatch::multi_draw_indirect(GPUStorageBuf * /*indirect_buf*/,
int /*count*/,
intptr_t /*offset*/,
intptr_t /*stride*/)
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,24 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_batch_private.hh"
namespace blender::gpu {
class VKBatch : public Batch {
public:
void draw(int v_first, int v_count, int i_first, int i_count) override;
void draw_indirect(GPUStorageBuf *indirect_buf, intptr_t offset) override;
void multi_draw_indirect(GPUStorageBuf *indirect_buf,
int count,
intptr_t offset,
intptr_t stride) override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,48 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_context.hh"
namespace blender::gpu {
void VKContext::activate()
{
}
void VKContext::deactivate()
{
}
void VKContext::begin_frame()
{
}
void VKContext::end_frame()
{
}
void VKContext::flush()
{
}
void VKContext::finish()
{
}
void VKContext::memory_statistics_get(int * /*total_mem*/, int * /*free_mem*/)
{
}
void VKContext::debug_group_begin(const char *, int)
{
}
void VKContext::debug_group_end()
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,34 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_context_private.hh"
namespace blender::gpu {
class VKContext : public Context {
public:
VKContext()
{
}
void activate() override;
void deactivate() override;
void begin_frame() override;
void end_frame() override;
void flush() override;
void finish() override;
void memory_statistics_get(int *total_mem, int *free_mem) override;
void debug_group_begin(const char *, int) override;
void debug_group_end() override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,20 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_drawlist.hh"
namespace blender::gpu {
void VKDrawList::append(GPUBatch * /*batch*/, int /*i_first*/, int /*i_count*/)
{
}
void VKDrawList::submit()
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,20 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_drawlist_private.hh"
namespace blender::gpu {
class VKDrawList : public DrawList {
public:
void append(GPUBatch *batch, int i_first, int i_count) override;
void submit() override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,62 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_framebuffer.hh"
namespace blender::gpu {
void VKFrameBuffer::bind(bool /*enabled_srgb*/)
{
}
bool VKFrameBuffer::check(char /*err_out*/[256])
{
return false;
}
void VKFrameBuffer::clear(eGPUFrameBufferBits /*buffers*/,
const float /*clear_col*/[4],
float /*clear_depth*/,
uint /*clear_stencil*/)
{
}
void VKFrameBuffer::clear_multi(const float (* /*clear_col*/)[4])
{
}
void VKFrameBuffer::clear_attachment(GPUAttachmentType /*type*/,
eGPUDataFormat /*data_format*/,
const void * /*clear_value*/)
{
}
void VKFrameBuffer::attachment_set_loadstore_op(GPUAttachmentType /*type*/,
eGPULoadOp /*load_action*/,
eGPUStoreOp /*store_action*/)
{
}
void VKFrameBuffer::read(eGPUFrameBufferBits /*planes*/,
eGPUDataFormat /*format*/,
const int /*area*/[4],
int /*channel_len*/,
int /*slot*/,
void * /*r_data*/)
{
}
void VKFrameBuffer::blit_to(eGPUFrameBufferBits /*planes*/,
int /*src_slot*/,
FrameBuffer * /*dst*/,
int /*dst_slot*/,
int /*dst_offset_x*/,
int /*dst_offset_y*/)
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,50 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_framebuffer_private.hh"
namespace blender::gpu {
class VKFrameBuffer : public FrameBuffer {
public:
VKFrameBuffer(const char *name) : FrameBuffer(name)
{
}
void bind(bool enabled_srgb) override;
bool check(char err_out[256]) override;
void clear(eGPUFrameBufferBits buffers,
const float clear_col[4],
float clear_depth,
uint clear_stencil) override;
void clear_multi(const float (*clear_col)[4]) override;
void clear_attachment(GPUAttachmentType type,
eGPUDataFormat data_format,
const void *clear_value) override;
void attachment_set_loadstore_op(GPUAttachmentType type,
eGPULoadOp load_action,
eGPUStoreOp store_action) override;
void read(eGPUFrameBufferBits planes,
eGPUDataFormat format,
const int area[4],
int channel_len,
int slot,
void *r_data) override;
void blit_to(eGPUFrameBufferBits planes,
int src_slot,
FrameBuffer *dst,
int dst_slot,
int dst_offset_x,
int dst_offset_y) override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,33 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_index_buffer.hh"
namespace blender::gpu {
void VKIndexBuffer::upload_data()
{
}
void VKIndexBuffer::bind_as_ssbo(uint /*binding*/)
{
}
const uint32_t *VKIndexBuffer::read() const
{
return 0;
}
void VKIndexBuffer::update_sub(uint /*start*/, uint /*len*/, const void * /*data*/)
{
}
void VKIndexBuffer::strip_restart_indices()
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_index_buffer_private.hh"
namespace blender::gpu {
class VKIndexBuffer : public IndexBuf {
public:
void upload_data() override;
void bind_as_ssbo(uint binding) override;
const uint32_t *read() const override;
void update_sub(uint start, uint len, const void *data) override;
private:
void strip_restart_indices() override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,28 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_query.hh"
namespace blender::gpu {
void VKQueryPool::init(GPUQueryType /*type*/)
{
}
void VKQueryPool::begin_query()
{
}
void VKQueryPool::end_query()
{
}
void VKQueryPool::get_occlusion_result(MutableSpan<uint32_t> /*r_values*/)
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,22 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_query.hh"
namespace blender::gpu {
class VKQueryPool : public QueryPool {
public:
void init(GPUQueryType type) override;
void begin_query() override;
void end_query() override;
void get_occlusion_result(MutableSpan<uint32_t> r_values) override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,101 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_shader.hh"
namespace blender::gpu {
void VKShader::vertex_shader_from_glsl(MutableSpan<const char *> /*sources*/)
{
}
void VKShader::geometry_shader_from_glsl(MutableSpan<const char *> /*sources*/)
{
}
void VKShader::fragment_shader_from_glsl(MutableSpan<const char *> /*sources*/)
{
}
void VKShader::compute_shader_from_glsl(MutableSpan<const char *> /*sources*/)
{
}
bool VKShader::finalize(const shader::ShaderCreateInfo * /*info*/)
{
}
void VKShader::transform_feedback_names_set(Span<const char *> /*name_list*/,
eGPUShaderTFBType /*geom_type*/)
{
}
bool VKShader::transform_feedback_enable(GPUVertBuf *)
{
return false;
}
void VKShader::transform_feedback_disable()
{
}
void VKShader::bind()
{
}
void VKShader::unbind()
{
}
void VKShader::uniform_float(int /*location*/,
int /*comp_len*/,
int /*array_size*/,
const float * /*data*/)
{
}
void VKShader::uniform_int(int /*location*/,
int /*comp_len*/,
int /*array_size*/,
const int * /*data*/)
{
}
std::string VKShader::resources_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
std::string VKShader::vertex_interface_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
std::string VKShader::fragment_interface_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
std::string VKShader::geometry_interface_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
std::string VKShader::geometry_layout_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
std::string VKShader::compute_layout_declare(const shader::ShaderCreateInfo & /*info*/) const
{
return std::string();
}
int VKShader::program_handle_get() const
{
return -1;
}
} // namespace blender::gpu

View File

@ -0,0 +1,47 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_shader_private.hh"
namespace blender::gpu {
class VKShader : public Shader {
public:
VKShader(const char *name) : Shader(name)
{
}
void vertex_shader_from_glsl(MutableSpan<const char *> sources)override;
void geometry_shader_from_glsl(MutableSpan<const char *> sources)override;
void fragment_shader_from_glsl(MutableSpan<const char *> sources)override;
void compute_shader_from_glsl(MutableSpan<const char *> sources)override;
bool finalize(const shader::ShaderCreateInfo *info = nullptr)override;
void transform_feedback_names_set(Span<const char *> name_list, eGPUShaderTFBType geom_type)override;
bool transform_feedback_enable(GPUVertBuf *)override;
void transform_feedback_disable()override;
void bind()override;
void unbind()override;
void uniform_float(int location, int comp_len, int array_size, const float *data)override;
void uniform_int(int location, int comp_len, int array_size, const int *data)override;
std::string resources_declare(const shader::ShaderCreateInfo &info) const override;
std::string vertex_interface_declare(const shader::ShaderCreateInfo &info) const override;
std::string fragment_interface_declare(const shader::ShaderCreateInfo &info) const override;
std::string geometry_interface_declare(const shader::ShaderCreateInfo &info) const override;
std::string geometry_layout_declare(const shader::ShaderCreateInfo &info) const override;
std::string compute_layout_declare(const shader::ShaderCreateInfo &info) const override;
/* DEPRECATED: Kept only because of BGL API. */
int program_handle_get() const override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,42 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_vertex_buffer.hh"
#include "vk_storage_buffer.hh"
namespace blender::gpu {
void VKStorageBuffer::update(const void * /*data*/)
{
}
void VKStorageBuffer::bind(int /*slot*/)
{
}
void VKStorageBuffer::unbind()
{
}
void VKStorageBuffer::clear(eGPUTextureFormat /* internal_format*/,
eGPUDataFormat /*data_format*/,
void * /*data*/)
{
}
void VKStorageBuffer::copy_sub(VertBuf * /*src*/,
uint /*dst_offset*/,
uint /*src_offset*/,
uint /*copy_size*/)
{
}
void VKStorageBuffer::read(void * /*data*/)
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,30 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "GPU_texture.h"
#include "gpu_storage_buffer_private.hh"
namespace blender::gpu {
class VKStorageBuffer : public StorageBuf {
public:
VKStorageBuffer(int size, const char *name) : StorageBuf(size, name)
{
}
void update(const void *data) override;
void bind(int slot) override;
void unbind() override;
void clear(eGPUTextureFormat internal_format, eGPUDataFormat data_format, void *data) override;
void copy_sub(VertBuf *src, uint dst_offset, uint src_offset, uint copy_size) override;
void read(void *data) override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,70 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_texture.hh"
namespace blender::gpu {
void VKTexture::generate_mipmap()
{
}
void VKTexture::copy_to(Texture * /*tex*/)
{
}
void VKTexture::clear(eGPUDataFormat /*format*/, const void * /*data*/)
{
}
void VKTexture::swizzle_set(const char /*swizzle_mask*/[4])
{
}
void VKTexture::stencil_texture_mode_set(bool /*use_stencil*/)
{
}
void VKTexture::mip_range_set(int /*min*/, int /*max*/)
{
}
void *VKTexture::read(int /*mip*/, eGPUDataFormat /*format*/)
{
return nullptr;
}
void VKTexture::update_sub(int /*mip*/,
int /*offset*/[3],
int /*extent*/[3],
eGPUDataFormat /*format*/,
const void * /*data*/)
{
}
/* TODO(fclem): Legacy. Should be removed at some point. */
uint VKTexture::gl_bindcode_get() const
{
return 0;
}
bool VKTexture::init_internal()
{
return false;
}
bool VKTexture::init_internal(GPUVertBuf * /*vbo*/)
{
return false;
}
bool VKTexture::init_internal(const GPUTexture * /*src*/, int /*mip_offset*/, int /*layer_offset*/)
{
return false;
}
} // namespace blender::gpu

View File

@ -0,0 +1,39 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_texture_private.hh"
namespace blender::gpu {
class VKTexture : public Texture {
public:
VKTexture(const char *name) : Texture(name)
{
}
void generate_mipmap() override;
void copy_to(Texture *tex) override;
void clear(eGPUDataFormat format, const void *data) override;
void swizzle_set(const char swizzle_mask[4]) override;
void stencil_texture_mode_set(bool use_stencil) override;
void mip_range_set(int min, int max) override;
void *read(int mip, eGPUDataFormat format) override;
void update_sub(
int mip, int offset[3], int extent[3], eGPUDataFormat format, const void *data) override;
/* TODO(fclem): Legacy. Should be removed at some point. */
uint gl_bindcode_get() const override;
protected:
bool init_internal() override;
bool init_internal(GPUVertBuf *vbo) override;
bool init_internal(const GPUTexture *src, int mip_offset, int layer_offset) override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,24 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_uniform_buffer.hh"
namespace blender::gpu {
void VKUniformBuffer::update(const void * /*data*/)
{
}
void VKUniformBuffer::bind(int /*slot*/)
{
}
void VKUniformBuffer::unbind()
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,25 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_uniform_buffer_private.hh"
namespace blender::gpu {
class VKUniformBuffer : public UniformBuf {
public:
VKUniformBuffer(int size, const char *name) : UniformBuf(size, name)
{
}
void update(const void *data) override;
void bind(int slot) override;
void unbind() override;
};
} // namespace blender::gpu

View File

@ -0,0 +1,58 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#include "vk_vertex_buffer.hh"
namespace blender::gpu {
void VKVertexBuffer::bind_as_ssbo(uint /*binding*/)
{
}
void VKVertexBuffer::bind_as_texture(uint /*binding*/)
{
}
void VKVertexBuffer::wrap_handle(uint64_t /*handle*/)
{
}
void VKVertexBuffer::update_sub(uint /*start*/, uint /*len*/, const void * /*data*/)
{
}
const void *VKVertexBuffer::read() const
{
return nullptr;
}
void *VKVertexBuffer::unmap(const void * /*mapped_data*/) const
{
return nullptr;
}
void VKVertexBuffer::acquire_data()
{
}
void VKVertexBuffer::resize_data()
{
}
void VKVertexBuffer::release_data()
{
}
void VKVertexBuffer::upload_data()
{
}
void VKVertexBuffer::duplicate_data(VertBuf * /*dst*/)
{
}
} // namespace blender::gpu

View File

@ -0,0 +1,32 @@
/* SPDX-License-Identifier: GPL-2.0-or-later
* Copyright 2022 Blender Foundation. All rights reserved. */
/** \file
* \ingroup gpu
*/
#pragma once
#include "gpu_vertex_buffer_private.hh"
namespace blender::gpu {
class VKVertexBuffer : public VertBuf {
public:
void bind_as_ssbo(uint binding) override;
void bind_as_texture(uint binding) override;
void wrap_handle(uint64_t handle) override;
void update_sub(uint start, uint len, const void *data) override;
const void *read() const override;
void *unmap(const void *mapped_data) const override;
protected:
void acquire_data() override;
void resize_data() override;
void release_data() override;
void upload_data() override;
void duplicate_data(VertBuf *dst) override;
};
} // namespace blender::gpu

View File

@ -89,11 +89,13 @@ PyDoc_STRVAR(pygpu_platform_backend_type_get_doc,
"\n"
" Get actuve GPU backend.\n"
"\n"
" :return: Backend type ('OPENGL', 'METAL', 'NONE', 'UNKNOWN').\n"
" :return: Backend type ('OPENGL', 'VULKAN', 'METAL', 'NONE', 'UNKNOWN').\n"
" :rtype: str\n");
static PyObject *pygpu_platform_backend_type_get(PyObject *UNUSED(self))
{
switch (GPU_backend_get_type()) {
case GPU_BACKEND_VULKAN:
return PyUnicode_FromString("VULKAN");
case GPU_BACKEND_METAL:
return PyUnicode_FromString("METAL");
case GPU_BACKEND_NONE:

View File

@ -1625,6 +1625,9 @@ GHOST_TDrawingContextType wm_ghost_drawing_context_type(const eGPUBackendType gp
case GPU_BACKEND_ANY:
case GPU_BACKEND_OPENGL:
return GHOST_kDrawingContextTypeOpenGL;
case GPU_BACKEND_VULKAN:
BLI_assert_unreachable();
return GHOST_kDrawingContextTypeNone;
case GPU_BACKEND_METAL:
#ifdef WITH_METAL_BACKEND
return GHOST_kDrawingContextTypeMetal;

View File

@ -1116,6 +1116,9 @@ static int arg_handle_debug_gpu_set(int UNUSED(argc),
static const char arg_handle_gpu_backend_set_doc[] =
"\n"
"\tForce to use a specific GPU backend. Valid options: "
# ifdef WITH_VULKAN_BACKEND
"'vulkan', "
# endif
# ifdef WITH_METAL_BACKEND
"'metal', "
# endif
@ -1132,6 +1135,11 @@ static int arg_handle_gpu_backend_set(int argc, const char **argv, void *UNUSED(
if (STREQ(argv[1], "opengl")) {
gpu_backend = GPU_BACKEND_OPENGL;
}
# ifdef WITH_VULKAN_BACKEND
else if (STREQ(argv[1], "vulkan")) {
gpu_backend = GPU_BACKEND_VULKAN;
}
# endif
# ifdef WITH_METAL_BACKEND
else if (STREQ(argv[1], "metal")) {
gpu_backend = GPU_BACKEND_METAL;