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:
parent
c2e36c09b9
commit
0e6f2d9fe0
|
@ -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
|
||||
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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:
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue