mirror of
https://github.com/libretro/parallel-gx1.git
synced 2026-11-10 03:11:35 -10:00
323 lines
9.5 KiB
C++
323 lines
9.5 KiB
C++
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
/* VertexManagerBase calls into the vertex manager of the backend in use
|
|
* (g_video_backend_kind); each backend's is final, so these are direct
|
|
* calls, and what a backend does not do itself falls to the defaults. */
|
|
|
|
#include "VideoCommon/VertexManagerBase.h"
|
|
|
|
#include "Common/CommonTypes.h"
|
|
#include "VideoCommon/DataReader.h"
|
|
#include "VideoCommon/VideoBackendKind.h"
|
|
|
|
#include "VideoBackends/Null/NullVertexManager.h"
|
|
#include "VideoBackends/Software/SWVertexLoader.h"
|
|
#ifdef HAS_OPENGL
|
|
#include "VideoBackends/OGL/OGLVertexManager.h"
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
#include "VideoBackends/Vulkan/VKVertexFormat.h"
|
|
#include "VideoBackends/Vulkan/VKVertexManager.h"
|
|
#endif
|
|
#ifdef _WIN32
|
|
#include "VideoBackends/D3D/D3DVertexManager.h"
|
|
#include "VideoBackends/D3D12/D3D12VertexManager.h"
|
|
#include "VideoBackends/D3D12/DX12VertexFormat.h"
|
|
#endif
|
|
|
|
void NativeVertexFormatDelete(NativeVertexFormat* object)
|
|
{
|
|
if (!object)
|
|
return;
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
delete static_cast<OGL::GLVertexFormat*>(object);
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
delete static_cast<Vulkan::VertexFormat*>(object);
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
delete static_cast<DX11::D3DVertexFormat*>(object);
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
delete static_cast<DX12::DXVertexFormat*>(object);
|
|
return;
|
|
#endif
|
|
default:
|
|
delete object;
|
|
return;
|
|
}
|
|
}
|
|
|
|
void VertexManagerBaseDelete(VertexManagerBase* object)
|
|
{
|
|
if (!object)
|
|
return;
|
|
switch (g_video_backend_kind)
|
|
{
|
|
case VIDEO_BACKEND_NULL:
|
|
delete static_cast<Null::VertexManager*>(object);
|
|
return;
|
|
case VIDEO_BACKEND_SOFTWARE:
|
|
delete static_cast<SWVertexLoader*>(object);
|
|
return;
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
delete static_cast<OGL::VertexManager*>(object);
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
delete static_cast<Vulkan::VertexManager*>(object);
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
delete static_cast<DX11::VertexManager*>(object);
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
delete static_cast<DX12::VertexManager*>(object);
|
|
return;
|
|
#endif
|
|
default:
|
|
delete object;
|
|
return;
|
|
}
|
|
}
|
|
|
|
bool VertexManagerBase::Initialize()
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
return static_cast<OGL::VertexManager*>(this)->Initialize();
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
return static_cast<Vulkan::VertexManager*>(this)->Initialize();
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
return static_cast<DX11::VertexManager*>(this)->Initialize();
|
|
case VIDEO_BACKEND_D3D12:
|
|
return static_cast<DX12::VertexManager*>(this)->Initialize();
|
|
#endif
|
|
default:
|
|
return BaseInitialize();
|
|
}
|
|
}
|
|
|
|
DataReader VertexManagerBase::PrepareForAdditionalData(OpcodeDecoder::Primitive primitive,
|
|
u32 count, u32 stride, bool cullall)
|
|
{
|
|
if (g_video_backend_kind == VIDEO_BACKEND_SOFTWARE)
|
|
{
|
|
return static_cast<SWVertexLoader*>(this)->PrepareForAdditionalData(primitive, count, stride,
|
|
cullall);
|
|
}
|
|
return BasePrepareForAdditionalData(primitive, count, stride, cullall);
|
|
}
|
|
|
|
void VertexManagerBase::UploadUtilityUniforms(const void* uniforms, u32 uniforms_size)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
static_cast<OGL::VertexManager*>(this)->UploadUtilityUniforms(uniforms, uniforms_size);
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
static_cast<Vulkan::VertexManager*>(this)->UploadUtilityUniforms(uniforms, uniforms_size);
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
static_cast<DX11::VertexManager*>(this)->UploadUtilityUniforms(uniforms, uniforms_size);
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
static_cast<DX12::VertexManager*>(this)->UploadUtilityUniforms(uniforms, uniforms_size);
|
|
return;
|
|
#endif
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
bool VertexManagerBase::UploadTexelBuffer(const void* data, u32 data_size,
|
|
TexelBufferFormat format, u32* out_offset)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
return static_cast<OGL::VertexManager*>(this)->UploadTexelBuffer(data, data_size, format,
|
|
out_offset);
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
return static_cast<Vulkan::VertexManager*>(this)->UploadTexelBuffer(data, data_size, format,
|
|
out_offset);
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
return static_cast<DX11::VertexManager*>(this)->UploadTexelBuffer(data, data_size, format,
|
|
out_offset);
|
|
case VIDEO_BACKEND_D3D12:
|
|
return static_cast<DX12::VertexManager*>(this)->UploadTexelBuffer(data, data_size, format,
|
|
out_offset);
|
|
#endif
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
bool VertexManagerBase::UploadTexelBuffer(const void* data, u32 data_size,
|
|
TexelBufferFormat format, u32* out_offset,
|
|
const void* palette_data, u32 palette_size,
|
|
TexelBufferFormat palette_format,
|
|
u32* out_palette_offset)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
return static_cast<OGL::VertexManager*>(this)->UploadTexelBuffer(
|
|
data, data_size, format, out_offset, palette_data, palette_size, palette_format,
|
|
out_palette_offset);
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
return static_cast<Vulkan::VertexManager*>(this)->UploadTexelBuffer(
|
|
data, data_size, format, out_offset, palette_data, palette_size, palette_format,
|
|
out_palette_offset);
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
return static_cast<DX11::VertexManager*>(this)->UploadTexelBuffer(
|
|
data, data_size, format, out_offset, palette_data, palette_size, palette_format,
|
|
out_palette_offset);
|
|
case VIDEO_BACKEND_D3D12:
|
|
return static_cast<DX12::VertexManager*>(this)->UploadTexelBuffer(
|
|
data, data_size, format, out_offset, palette_data, palette_size, palette_format,
|
|
out_palette_offset);
|
|
#endif
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
void VertexManagerBase::ResetBuffer(u32 vertex_stride)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
static_cast<OGL::VertexManager*>(this)->ResetBuffer(vertex_stride);
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
static_cast<Vulkan::VertexManager*>(this)->ResetBuffer(vertex_stride);
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
static_cast<DX11::VertexManager*>(this)->ResetBuffer(vertex_stride);
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
static_cast<DX12::VertexManager*>(this)->ResetBuffer(vertex_stride);
|
|
return;
|
|
#endif
|
|
default:
|
|
BaseResetBuffer(vertex_stride);
|
|
return;
|
|
}
|
|
}
|
|
|
|
void VertexManagerBase::CommitBuffer(u32 num_vertices, u32 vertex_stride, u32 num_indices,
|
|
u32* out_base_vertex, u32* out_base_index)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
static_cast<OGL::VertexManager*>(this)->CommitBuffer(num_vertices, vertex_stride, num_indices,
|
|
out_base_vertex, out_base_index);
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
static_cast<Vulkan::VertexManager*>(this)->CommitBuffer(
|
|
num_vertices, vertex_stride, num_indices, out_base_vertex, out_base_index);
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
static_cast<DX11::VertexManager*>(this)->CommitBuffer(num_vertices, vertex_stride, num_indices,
|
|
out_base_vertex, out_base_index);
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
static_cast<DX12::VertexManager*>(this)->CommitBuffer(num_vertices, vertex_stride, num_indices,
|
|
out_base_vertex, out_base_index);
|
|
return;
|
|
#endif
|
|
default:
|
|
*out_base_vertex = 0;
|
|
*out_base_index = 0;
|
|
return;
|
|
}
|
|
}
|
|
|
|
void VertexManagerBase::UploadUniforms()
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
#ifdef HAS_OPENGL
|
|
case VIDEO_BACKEND_OGL:
|
|
static_cast<OGL::VertexManager*>(this)->UploadUniforms();
|
|
return;
|
|
#endif
|
|
#ifdef HAS_VULKAN
|
|
case VIDEO_BACKEND_VULKAN:
|
|
static_cast<Vulkan::VertexManager*>(this)->UploadUniforms();
|
|
return;
|
|
#endif
|
|
#ifdef _WIN32
|
|
case VIDEO_BACKEND_D3D11:
|
|
static_cast<DX11::VertexManager*>(this)->UploadUniforms();
|
|
return;
|
|
case VIDEO_BACKEND_D3D12:
|
|
static_cast<DX12::VertexManager*>(this)->UploadUniforms();
|
|
return;
|
|
#endif
|
|
default:
|
|
return;
|
|
}
|
|
}
|
|
|
|
void VertexManagerBase::DrawCurrentBatch(u32 base_index, u32 num_indices, u32 base_vertex)
|
|
{
|
|
switch (g_video_backend_kind)
|
|
{
|
|
case VIDEO_BACKEND_NULL:
|
|
static_cast<Null::VertexManager*>(this)->DrawCurrentBatch(base_index, num_indices,
|
|
base_vertex);
|
|
return;
|
|
case VIDEO_BACKEND_SOFTWARE:
|
|
static_cast<SWVertexLoader*>(this)->DrawCurrentBatch(base_index, num_indices, base_vertex);
|
|
return;
|
|
default:
|
|
BaseDrawCurrentBatch(base_index, num_indices, base_vertex);
|
|
return;
|
|
}
|
|
}
|