- convert triangle fan to triangle list on macOS

This commit is contained in:
Magnus Norddahl 2019-03-08 21:34:21 +01:00
parent 4668d0b1de
commit aa1ff58353
4 changed files with 64 additions and 1 deletions

View file

@ -614,3 +614,34 @@ void VkRenderState::EndFrame()
mStreamDataOffset = 0;
mDataIndex = -1;
}
/////////////////////////////////////////////////////////////////////////////
void VkRenderStateMolten::Draw(int dt, int index, int count, bool apply)
{
if (dt == DT_TriangleFan)
{
IIndexBuffer *oldIndexBuffer = mIndexBuffer;
mIndexBuffer = GetVulkanFrameBuffer()->FanToTrisIndexBuffer.get();
if (apply || mNeedApply)
Apply(DT_Triangles);
else
ApplyVertexBuffers();
drawcalls.Clock();
mCommandBuffer->drawIndexed((count - 2) * 3, 1, 0, index, 0);
drawcalls.Unclock();
mIndexBuffer = oldIndexBuffer;
}
else
{
if (apply || mNeedApply)
Apply(dt);
drawcalls.Clock();
mCommandBuffer->draw(count, 1, index, 0);
drawcalls.Unclock();
}
}

View file

@ -17,6 +17,7 @@ class VkRenderState : public FRenderState
{
public:
VkRenderState();
virtual ~VkRenderState() = default;
// Draw commands
void ClearScreen() override;
@ -45,7 +46,7 @@ public:
void EndRenderPass();
void EndFrame();
private:
protected:
void Apply(int dt);
void ApplyRenderPass(int dt);
void ApplyStencilRef();
@ -106,3 +107,11 @@ private:
bool mLastModelMatrixEnabled = true;
bool mLastTextureMatrixEnabled = true;
};
class VkRenderStateMolten : public VkRenderState
{
public:
using VkRenderState::VkRenderState;
void Draw(int dt, int index, int count, bool apply = true) override;
};

View file

@ -120,6 +120,8 @@ void VulkanFrameBuffer::InitializeState()
mViewpoints = new GLViewpointBuffer;
mLights = new FLightBuffer();
CreateFanToTrisIndexBuffer();
// To do: move this to HW renderer interface maybe?
MatricesUBO = (VKDataBuffer*)CreateDataBuffer(-1, false);
StreamUBO = (VKDataBuffer*)CreateDataBuffer(-1, false);
@ -129,7 +131,11 @@ void VulkanFrameBuffer::InitializeState()
mShaderManager.reset(new VkShaderManager(device));
mSamplerManager.reset(new VkSamplerManager(device));
mRenderPassManager->Init();
#ifdef __APPLE__
mRenderState.reset(new VkRenderStateMolten());
#else
mRenderState.reset(new VkRenderState());
#endif
}
void VulkanFrameBuffer::Update()
@ -621,3 +627,17 @@ void VulkanFrameBuffer::PrintStartupLog()
Printf("Max. uniform buffer range: %d\n", limits.maxUniformBufferRange);
Printf("Min. uniform buffer offset alignment: %d\n", limits.minUniformBufferOffsetAlignment);
}
void VulkanFrameBuffer::CreateFanToTrisIndexBuffer()
{
TArray<uint32_t> data;
for (int i = 2; i < 1000; i++)
{
data.Push(0);
data.Push(i - 1);
data.Push(i);
}
FanToTrisIndexBuffer.reset(CreateIndexBuffer());
FanToTrisIndexBuffer->SetData(sizeof(uint32_t) * data.Size(), data.Data());
}

View file

@ -42,6 +42,8 @@ public:
VKDataBuffer *MatricesUBO = nullptr;
VKDataBuffer *StreamUBO = nullptr;
std::unique_ptr<IIndexBuffer> FanToTrisIndexBuffer;
std::vector<std::unique_ptr<VulkanBuffer>> mFrameDeleteList;
std::unique_ptr<SWSceneDrawer> swdrawer;
@ -86,6 +88,7 @@ private:
sector_t *RenderViewpoint(FRenderViewpoint &mainvp, AActor * camera, IntRect * bounds, float fov, float ratio, float fovratio, bool mainview, bool toscreen);
void DrawScene(HWDrawInfo *di, int drawmode);
void PrintStartupLog();
void CreateFanToTrisIndexBuffer();
std::unique_ptr<VkShaderManager> mShaderManager;
std::unique_ptr<VkSamplerManager> mSamplerManager;