mirror of
https://github.com/AxioDL/boo.git
synced 2025-05-15 11:51:27 +00:00
Major Vulkan commit
This commit is contained in:
parent
8bfb883d59
commit
1037b37f9a
@ -16,7 +16,6 @@ include_directories(include ${LOG_VISOR_INCLUDE_DIR})
|
|||||||
if(NOT GEKKO AND NOT CAFE)
|
if(NOT GEKKO AND NOT CAFE)
|
||||||
list(APPEND PLAT_SRCS
|
list(APPEND PLAT_SRCS
|
||||||
lib/graphicsdev/GL.cpp
|
lib/graphicsdev/GL.cpp
|
||||||
lib/graphicsdev/Vulkan.cpp
|
|
||||||
lib/graphicsdev/glew.c)
|
lib/graphicsdev/glew.c)
|
||||||
|
|
||||||
list(APPEND PLAT_HDRS
|
list(APPEND PLAT_HDRS
|
||||||
@ -81,7 +80,6 @@ else(NOT GEKKO)
|
|||||||
lib/graphicsdev/GLX.cpp
|
lib/graphicsdev/GLX.cpp
|
||||||
lib/graphicsdev/glew.c
|
lib/graphicsdev/glew.c
|
||||||
lib/audiodev/ALSA.cpp)
|
lib/audiodev/ALSA.cpp)
|
||||||
# list(APPEND PLAT_HDRS )
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
find_package(PkgConfig)
|
||||||
if(PKG_CONFIG_FOUND)
|
if(PKG_CONFIG_FOUND)
|
||||||
@ -127,6 +125,14 @@ else(NOT GEKKO)
|
|||||||
include_directories(${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
|
include_directories(${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
|
||||||
list(APPEND _BOO_SYS_LIBS X11 Xi GL ${DBUS_LIBRARY} pthread)
|
list(APPEND _BOO_SYS_LIBS X11 Xi GL ${DBUS_LIBRARY} pthread)
|
||||||
|
|
||||||
|
find_library(VULKAN_LIBRARY vulkan)
|
||||||
|
if(NOT VULKAN_LIBRARY-NOTFOUND)
|
||||||
|
message(STATUS "Vulkan loader found; enabling Vulkan support")
|
||||||
|
list(APPEND _BOO_SYS_LIBS ${VULKAN_LIBRARY})
|
||||||
|
list(APPEND PLAT_SRCS
|
||||||
|
lib/graphicsdev/Vulkan.cpp)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
if(NOT ${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD")
|
||||||
list(APPEND PLAT_SRCS
|
list(APPEND PLAT_SRCS
|
||||||
lib/inputdev/HIDListenerUdev.cpp
|
lib/inputdev/HIDListenerUdev.cpp
|
||||||
|
@ -29,14 +29,13 @@ public:
|
|||||||
const SystemChar* platformName() const {return _S("OGL");}
|
const SystemChar* platformName() const {return _S("OGL");}
|
||||||
|
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count);
|
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
||||||
|
|
||||||
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
GraphicsDataToken
|
GraphicsDataToken
|
||||||
newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz, ITextureS** texOut);
|
const void* data, size_t sz, ITextureS*& texOut);
|
||||||
ITextureSA* newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
ITextureSA* newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
||||||
|
@ -7,11 +7,6 @@
|
|||||||
|
|
||||||
namespace boo
|
namespace boo
|
||||||
{
|
{
|
||||||
enum class Primitive
|
|
||||||
{
|
|
||||||
Triangles,
|
|
||||||
TriStrips
|
|
||||||
};
|
|
||||||
|
|
||||||
struct IGraphicsCommandQueue
|
struct IGraphicsCommandQueue
|
||||||
{
|
{
|
||||||
@ -32,7 +27,6 @@ struct IGraphicsCommandQueue
|
|||||||
virtual void setClearColor(const float rgba[4])=0;
|
virtual void setClearColor(const float rgba[4])=0;
|
||||||
virtual void clearTarget(bool render=true, bool depth=true)=0;
|
virtual void clearTarget(bool render=true, bool depth=true)=0;
|
||||||
|
|
||||||
virtual void setDrawPrimitive(Primitive prim)=0;
|
|
||||||
virtual void draw(size_t start, size_t count)=0;
|
virtual void draw(size_t start, size_t count)=0;
|
||||||
virtual void drawIndexed(size_t start, size_t count)=0;
|
virtual void drawIndexed(size_t start, size_t count)=0;
|
||||||
virtual void drawInstances(size_t start, size_t count, size_t instCount)=0;
|
virtual void drawInstances(size_t start, size_t count, size_t instCount)=0;
|
||||||
|
@ -193,8 +193,6 @@ struct IGraphicsDataFactory
|
|||||||
|
|
||||||
virtual IGraphicsBufferS*
|
virtual IGraphicsBufferS*
|
||||||
newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)=0;
|
newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count)=0;
|
||||||
virtual IGraphicsBufferS*
|
|
||||||
newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count)=0;
|
|
||||||
virtual IGraphicsBufferD*
|
virtual IGraphicsBufferD*
|
||||||
newDynamicBuffer(BufferUse use, size_t stride, size_t count)=0;
|
newDynamicBuffer(BufferUse use, size_t stride, size_t count)=0;
|
||||||
|
|
||||||
@ -203,7 +201,7 @@ struct IGraphicsDataFactory
|
|||||||
const void* data, size_t sz)=0;
|
const void* data, size_t sz)=0;
|
||||||
virtual GraphicsDataToken
|
virtual GraphicsDataToken
|
||||||
newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz, ITextureS** texOut)=0;
|
const void* data, size_t sz, ITextureS*& texOut)=0;
|
||||||
virtual ITextureSA*
|
virtual ITextureSA*
|
||||||
newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
||||||
const void* data, size_t sz)=0;
|
const void* data, size_t sz)=0;
|
||||||
@ -263,6 +261,7 @@ class GraphicsDataToken
|
|||||||
friend class D3D12DataFactory;
|
friend class D3D12DataFactory;
|
||||||
friend class D3D11DataFactory;
|
friend class D3D11DataFactory;
|
||||||
friend class MetalDataFactory;
|
friend class MetalDataFactory;
|
||||||
|
friend class VulkanDataFactory;
|
||||||
IGraphicsDataFactory* m_factory = nullptr;
|
IGraphicsDataFactory* m_factory = nullptr;
|
||||||
IGraphicsData* m_data = nullptr;
|
IGraphicsData* m_data = nullptr;
|
||||||
GraphicsDataToken(IGraphicsDataFactory* factory, IGraphicsData* data)
|
GraphicsDataToken(IGraphicsDataFactory* factory, IGraphicsData* data)
|
||||||
|
@ -38,7 +38,6 @@ public:
|
|||||||
const char* platformName() const {return "Metal";}
|
const char* platformName() const {return "Metal";}
|
||||||
|
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count);
|
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
||||||
|
|
||||||
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
|
@ -6,36 +6,68 @@
|
|||||||
#include "boo/IGraphicsContext.hpp"
|
#include "boo/IGraphicsContext.hpp"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
#include <unordered_map>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
|
#include <vulkan/vulkan.h>
|
||||||
|
|
||||||
namespace boo
|
namespace boo
|
||||||
{
|
{
|
||||||
|
|
||||||
|
struct VulkanContext
|
||||||
|
{
|
||||||
|
VkInstance m_instance;
|
||||||
|
VkPhysicalDevice m_adapter;
|
||||||
|
VkPhysicalDeviceProperties m_devProps;
|
||||||
|
VkPhysicalDeviceMemoryProperties m_memoryProperties;
|
||||||
|
VkDevice m_dev;
|
||||||
|
VkQueue m_queue;
|
||||||
|
VkDescriptorSetLayout m_descSetLayout;
|
||||||
|
VkPipelineLayout m_layout;
|
||||||
|
VkRenderPass m_pass;
|
||||||
|
VkCommandPool m_loadPool;
|
||||||
|
VkCommandBuffer m_loadCmdBuf;
|
||||||
|
VkFence m_loadFence;
|
||||||
|
VkSampler m_linearSampler;
|
||||||
|
struct Window
|
||||||
|
{
|
||||||
|
VkSwapchainKHR m_swapChain;
|
||||||
|
struct Buffer
|
||||||
|
{
|
||||||
|
VkImage m_image;
|
||||||
|
VkImageView m_view;
|
||||||
|
};
|
||||||
|
std::vector<Buffer> m_bufs;
|
||||||
|
uint32_t m_backBuf = 0;
|
||||||
|
size_t width, height;
|
||||||
|
};
|
||||||
|
std::unordered_map<const boo::IWindow*, Window> m_windows;
|
||||||
|
};
|
||||||
|
|
||||||
class VulkanDataFactory : public IGraphicsDataFactory
|
class VulkanDataFactory : public IGraphicsDataFactory
|
||||||
{
|
{
|
||||||
friend struct VulkanCommandQueue;
|
friend struct VulkanCommandQueue;
|
||||||
IGraphicsContext* m_parent;
|
IGraphicsContext* m_parent;
|
||||||
static ThreadLocalPtr<struct GLData> m_deferredData;
|
VulkanContext* m_ctx;
|
||||||
std::unordered_set<struct GLData*> m_committedData;
|
static ThreadLocalPtr<struct VulkanData> m_deferredData;
|
||||||
|
std::unordered_set<struct VulkanData*> m_committedData;
|
||||||
std::mutex m_committedMutex;
|
std::mutex m_committedMutex;
|
||||||
std::vector<int> m_texUnis;
|
std::vector<int> m_texUnis;
|
||||||
void destroyData(IGraphicsData*);
|
void destroyData(IGraphicsData*);
|
||||||
void destroyAllData();
|
void destroyAllData();
|
||||||
public:
|
public:
|
||||||
VulkanDataFactory(IGraphicsContext* parent);
|
VulkanDataFactory(IGraphicsContext* parent, VulkanContext* ctx);
|
||||||
~VulkanDataFactory() {destroyAllData();}
|
~VulkanDataFactory() {destroyAllData();}
|
||||||
|
|
||||||
Platform platform() const {return Platform::Vulkan;}
|
Platform platform() const {return Platform::Vulkan;}
|
||||||
const SystemChar* platformName() const {return _S("Vulkan");}
|
const SystemChar* platformName() const {return _S("Vulkan");}
|
||||||
|
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
IGraphicsBufferS* newStaticBuffer(BufferUse use, const void* data, size_t stride, size_t count);
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count);
|
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count);
|
||||||
|
|
||||||
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureS* newStaticTexture(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
GraphicsDataToken newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
std::unique_ptr<uint8_t[]>&& data, size_t sz);
|
const void *data, size_t sz, ITextureS*& texOut);
|
||||||
ITextureSA* newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
ITextureSA* newStaticArrayTexture(size_t width, size_t height, size_t layers, TextureFormat fmt,
|
||||||
const void* data, size_t sz);
|
const void* data, size_t sz);
|
||||||
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
ITextureD* newDynamicTexture(size_t width, size_t height, TextureFormat fmt);
|
||||||
@ -46,24 +78,19 @@ public:
|
|||||||
|
|
||||||
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
||||||
std::vector<unsigned int>& vertBlobOut, std::vector<unsigned int>& fragBlobOut,
|
std::vector<unsigned int>& vertBlobOut, std::vector<unsigned int>& fragBlobOut,
|
||||||
std::vector<unsigned int>& pipelineBlob,
|
std::vector<unsigned char>& pipelineBlob, IVertexFormat* vtxFmt,
|
||||||
size_t texCount, const char* texArrayName,
|
|
||||||
size_t uniformBlockCount, const char** uniformBlockNames,
|
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
bool depthTest, bool depthWrite, bool backfaceCulling);
|
bool depthTest, bool depthWrite, bool backfaceCulling);
|
||||||
|
|
||||||
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource,
|
IShaderPipeline* newShaderPipeline(const char* vertSource, const char* fragSource, IVertexFormat* vtxFmt,
|
||||||
size_t texCount, const char* texArrayName,
|
|
||||||
size_t uniformBlockCount, const char** uniformBlockNames,
|
|
||||||
BlendFactor srcFac, BlendFactor dstFac,
|
BlendFactor srcFac, BlendFactor dstFac,
|
||||||
bool depthTest, bool depthWrite, bool backfaceCulling)
|
bool depthTest, bool depthWrite, bool backfaceCulling)
|
||||||
{
|
{
|
||||||
std::vector<unsigned int> vertBlob;
|
std::vector<unsigned int> vertBlob;
|
||||||
std::vector<unsigned int> fragBlob;
|
std::vector<unsigned int> fragBlob;
|
||||||
std::vector<unsigned int> pipelineBlob;
|
std::vector<unsigned char> pipelineBlob;
|
||||||
return newShaderPipeline(vertSource, fragSource, vertBlob, fragBlob, pipelineBlob,
|
return newShaderPipeline(vertSource, fragSource, vertBlob, fragBlob, pipelineBlob,
|
||||||
texCount, texArrayName, uniformBlockCount, uniformBlockNames,
|
vtxFmt, srcFac, dstFac, depthTest, depthWrite, backfaceCulling);
|
||||||
srcFac, dstFac, depthTest, depthWrite, backfaceCulling);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
IShaderDataBinding*
|
IShaderDataBinding*
|
||||||
|
@ -1013,16 +1013,6 @@ public:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count)
|
|
||||||
{
|
|
||||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
|
||||||
D3D11GraphicsBufferS* retval = new D3D11GraphicsBufferS(use, m_ctx, d.get(), stride, count);
|
|
||||||
if (!m_deferredData)
|
|
||||||
m_deferredData = new struct D3D11Data();
|
|
||||||
static_cast<D3D11Data*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
D3D11CommandQueue* q = static_cast<D3D11CommandQueue*>(m_parent->getCommandQueue());
|
D3D11CommandQueue* q = static_cast<D3D11CommandQueue*>(m_parent->getCommandQueue());
|
||||||
|
@ -1369,16 +1369,6 @@ public:
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
IGraphicsBufferS* newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count)
|
|
||||||
{
|
|
||||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
|
||||||
D3D12GraphicsBufferS* retval = new D3D12GraphicsBufferS(use, m_ctx, d.get(), stride, count);
|
|
||||||
if (!m_deferredData)
|
|
||||||
m_deferredData = new struct D3D12Data();
|
|
||||||
static_cast<D3D12Data*>(m_deferredData)->m_SBufs.emplace_back(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
IGraphicsBufferD* newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
D3D12CommandQueue* q = static_cast<D3D12CommandQueue*>(m_parent->getCommandQueue());
|
D3D12CommandQueue* q = static_cast<D3D12CommandQueue*>(m_parent->getCommandQueue());
|
||||||
|
@ -104,17 +104,6 @@ GLDataFactory::newStaticBuffer(BufferUse use, const void* data, size_t stride, s
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
IGraphicsBufferS*
|
|
||||||
GLDataFactory::newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count)
|
|
||||||
{
|
|
||||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
|
||||||
GLGraphicsBufferS* retval = new GLGraphicsBufferS(use, d.get(), stride * count);
|
|
||||||
if (!m_deferredData.get())
|
|
||||||
m_deferredData.reset(new struct GLData());
|
|
||||||
m_deferredData->m_SBufs.emplace_back(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
class GLTextureS : public ITextureS
|
class GLTextureS : public ITextureS
|
||||||
{
|
{
|
||||||
friend class GLDataFactory;
|
friend class GLDataFactory;
|
||||||
@ -294,12 +283,12 @@ GLDataFactory::newStaticTexture(size_t width, size_t height, size_t mips, Textur
|
|||||||
|
|
||||||
GraphicsDataToken
|
GraphicsDataToken
|
||||||
GLDataFactory::newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
GLDataFactory::newStaticTextureNoContext(size_t width, size_t height, size_t mips, TextureFormat fmt,
|
||||||
const void* data, size_t sz, ITextureS** texOut)
|
const void* data, size_t sz, ITextureS*& texOut)
|
||||||
{
|
{
|
||||||
GLTextureS* retval = new GLTextureS(width, height, mips, fmt, data, sz);
|
GLTextureS* retval = new GLTextureS(width, height, mips, fmt, data, sz);
|
||||||
GLData* tokData = new struct GLData();
|
GLData* tokData = new struct GLData();
|
||||||
tokData->m_STexs.emplace_back(retval);
|
tokData->m_STexs.emplace_back(retval);
|
||||||
*texOut = retval;
|
texOut = retval;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_committedMutex);
|
std::unique_lock<std::mutex> lk(m_committedMutex);
|
||||||
m_committedData.insert(tokData);
|
m_committedData.insert(tokData);
|
||||||
@ -728,7 +717,6 @@ struct GLCommandQueue : IGraphicsCommandQueue
|
|||||||
SetScissor,
|
SetScissor,
|
||||||
SetClearColor,
|
SetClearColor,
|
||||||
ClearTarget,
|
ClearTarget,
|
||||||
SetDrawPrimitive,
|
|
||||||
Draw,
|
Draw,
|
||||||
DrawIndexed,
|
DrawIndexed,
|
||||||
DrawInstances,
|
DrawInstances,
|
||||||
@ -743,7 +731,6 @@ struct GLCommandQueue : IGraphicsCommandQueue
|
|||||||
SWindowRect rect;
|
SWindowRect rect;
|
||||||
float rgba[4];
|
float rgba[4];
|
||||||
GLbitfield flags;
|
GLbitfield flags;
|
||||||
GLenum prim;
|
|
||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
size_t start;
|
size_t start;
|
||||||
@ -911,7 +898,6 @@ struct GLCommandQueue : IGraphicsCommandQueue
|
|||||||
posts.swap(self->m_pendingPosts2);
|
posts.swap(self->m_pendingPosts2);
|
||||||
}
|
}
|
||||||
std::vector<Command>& cmds = self->m_cmdBufs[self->m_drawBuf];
|
std::vector<Command>& cmds = self->m_cmdBufs[self->m_drawBuf];
|
||||||
GLenum prim = GL_TRIANGLES;
|
|
||||||
for (const Command& cmd : cmds)
|
for (const Command& cmd : cmds)
|
||||||
{
|
{
|
||||||
switch (cmd.m_op)
|
switch (cmd.m_op)
|
||||||
@ -948,20 +934,17 @@ struct GLCommandQueue : IGraphicsCommandQueue
|
|||||||
case Command::Op::ClearTarget:
|
case Command::Op::ClearTarget:
|
||||||
glClear(cmd.flags);
|
glClear(cmd.flags);
|
||||||
break;
|
break;
|
||||||
case Command::Op::SetDrawPrimitive:
|
|
||||||
prim = cmd.prim;
|
|
||||||
break;
|
|
||||||
case Command::Op::Draw:
|
case Command::Op::Draw:
|
||||||
glDrawArrays(prim, cmd.start, cmd.count);
|
glDrawArrays(GL_TRIANGLE_STRIP, cmd.start, cmd.count);
|
||||||
break;
|
break;
|
||||||
case Command::Op::DrawIndexed:
|
case Command::Op::DrawIndexed:
|
||||||
glDrawElements(prim, cmd.count, GL_UNSIGNED_INT, (void*)cmd.start);
|
glDrawElements(GL_TRIANGLE_STRIP, cmd.count, GL_UNSIGNED_INT, (void*)cmd.start);
|
||||||
break;
|
break;
|
||||||
case Command::Op::DrawInstances:
|
case Command::Op::DrawInstances:
|
||||||
glDrawArraysInstanced(prim, cmd.start, cmd.count, cmd.instCount);
|
glDrawArraysInstanced(GL_TRIANGLE_STRIP, cmd.start, cmd.count, cmd.instCount);
|
||||||
break;
|
break;
|
||||||
case Command::Op::DrawInstancesIndexed:
|
case Command::Op::DrawInstancesIndexed:
|
||||||
glDrawElementsInstanced(prim, cmd.count, GL_UNSIGNED_INT, (void*)cmd.start, cmd.instCount);
|
glDrawElementsInstanced(GL_TRIANGLE_STRIP, cmd.count, GL_UNSIGNED_INT, (void*)cmd.start, cmd.instCount);
|
||||||
break;
|
break;
|
||||||
case Command::Op::Present:
|
case Command::Op::Present:
|
||||||
{
|
{
|
||||||
@ -1067,16 +1050,6 @@ struct GLCommandQueue : IGraphicsCommandQueue
|
|||||||
cmds.back().flags |= GL_DEPTH_BUFFER_BIT;
|
cmds.back().flags |= GL_DEPTH_BUFFER_BIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setDrawPrimitive(Primitive prim)
|
|
||||||
{
|
|
||||||
std::vector<Command>& cmds = m_cmdBufs[m_fillBuf];
|
|
||||||
cmds.emplace_back(Command::Op::SetDrawPrimitive);
|
|
||||||
if (prim == Primitive::Triangles)
|
|
||||||
cmds.back().prim = GL_TRIANGLES;
|
|
||||||
else if (prim == Primitive::TriStrips)
|
|
||||||
cmds.back().prim = GL_TRIANGLE_STRIP;
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw(size_t start, size_t count)
|
void draw(size_t start, size_t count)
|
||||||
{
|
{
|
||||||
std::vector<Command>& cmds = m_cmdBufs[m_fillBuf];
|
std::vector<Command>& cmds = m_cmdBufs[m_fillBuf];
|
||||||
|
@ -850,15 +850,6 @@ IGraphicsBufferS* MetalDataFactory::newStaticBuffer(BufferUse use, const void* d
|
|||||||
m_deferredData->m_SBufs.emplace_back(retval);
|
m_deferredData->m_SBufs.emplace_back(retval);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
IGraphicsBufferS* MetalDataFactory::newStaticBuffer(BufferUse use, std::unique_ptr<uint8_t[]>&& data, size_t stride, size_t count)
|
|
||||||
{
|
|
||||||
std::unique_ptr<uint8_t[]> d = std::move(data);
|
|
||||||
MetalGraphicsBufferS* retval = new MetalGraphicsBufferS(use, m_ctx, d.get(), stride, count);
|
|
||||||
if (!m_deferredData.get())
|
|
||||||
m_deferredData.reset(new struct MetalData());
|
|
||||||
m_deferredData->m_SBufs.emplace_back(retval);
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
IGraphicsBufferD* MetalDataFactory::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
IGraphicsBufferD* MetalDataFactory::newDynamicBuffer(BufferUse use, size_t stride, size_t count)
|
||||||
{
|
{
|
||||||
MetalCommandQueue* q = static_cast<MetalCommandQueue*>(m_parent->getCommandQueue());
|
MetalCommandQueue* q = static_cast<MetalCommandQueue*>(m_parent->getCommandQueue());
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -461,7 +461,7 @@ public:
|
|||||||
XLockDisplay(vsyncDisp);
|
XLockDisplay(vsyncDisp);
|
||||||
|
|
||||||
static int attributeList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, 0 };
|
static int attributeList[] = { GLX_RGBA, GLX_DOUBLEBUFFER, GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1, 0 };
|
||||||
XVisualInfo *vi = glXChooseVisual(vsyncDisp, DefaultScreen(vsyncDisp),attributeList);
|
XVisualInfo *vi = glXChooseVisual(vsyncDisp, DefaultScreen(vsyncDisp), attributeList);
|
||||||
|
|
||||||
vsyncCtx = glXCreateContext(vsyncDisp, vi, nullptr, True);
|
vsyncCtx = glXCreateContext(vsyncDisp, vi, nullptr, True);
|
||||||
if (!vsyncCtx)
|
if (!vsyncCtx)
|
||||||
|
@ -441,7 +441,6 @@ struct TestApplicationCallback : IApplicationCallback
|
|||||||
float rgba[] = {sinf(frameIdx / 60.0), cosf(frameIdx / 60.0), 0.0, 1.0};
|
float rgba[] = {sinf(frameIdx / 60.0), cosf(frameIdx / 60.0), 0.0, 1.0};
|
||||||
gfxQ->setClearColor(rgba);
|
gfxQ->setClearColor(rgba);
|
||||||
gfxQ->clearTarget();
|
gfxQ->clearTarget();
|
||||||
gfxQ->setDrawPrimitive(Primitive::TriStrips);
|
|
||||||
|
|
||||||
gfxQ->setShaderDataBinding(m_binding);
|
gfxQ->setShaderDataBinding(m_binding);
|
||||||
gfxQ->draw(0, 4);
|
gfxQ->draw(0, 4);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user