feat(gx): clean up draw calls across gll and d3d backends

This commit is contained in:
fallenoak 2023-03-10 11:29:00 -06:00 committed by GitHub
parent d869c6d898
commit 02ddaa106f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 20 additions and 20 deletions

View File

@ -111,7 +111,7 @@ class CGxDevice {
virtual void SceneClear(uint32_t, CImVector) {}; virtual void SceneClear(uint32_t, CImVector) {};
virtual void XformSetProjection(const C44Matrix&); virtual void XformSetProjection(const C44Matrix&);
virtual void XformSetView(const C44Matrix&); virtual void XformSetView(const C44Matrix&);
virtual void Draw(CGxBatch*, int32_t) {}; virtual void Draw(CGxBatch* batch, int32_t indexed) {};
virtual void ValidateDraw(CGxBatch*, int32_t); virtual void ValidateDraw(CGxBatch*, int32_t);
virtual void MasterEnableSet(EGxMasterEnables, int32_t); virtual void MasterEnableSet(EGxMasterEnables, int32_t);
virtual void PoolSizeSet(CGxPool*, uint32_t) = 0; virtual void PoolSizeSet(CGxPool*, uint32_t) = 0;

View File

@ -1,8 +1,8 @@
#include "gx/Draw.hpp" #include "gx/Draw.hpp"
#include "gx/Device.hpp" #include "gx/Device.hpp"
void GxDraw(CGxBatch* batches, int32_t count) { void GxDraw(CGxBatch* batch, int32_t indexed) {
g_theGxDevicePtr->Draw(batches, count); g_theGxDevicePtr->Draw(batch, indexed);
} }
void GxSceneClear(uint32_t mask, CImVector color) { void GxSceneClear(uint32_t mask, CImVector color) {

View File

@ -8,7 +8,7 @@
class C3Vector; class C3Vector;
class CImVector; class CImVector;
void GxDraw(CGxBatch*, int32_t); void GxDraw(CGxBatch* batch, int32_t indexed);
void GxSceneClear(uint32_t, CImVector); void GxSceneClear(uint32_t, CImVector);

View File

@ -357,7 +357,7 @@ void CGxDeviceD3d::DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2) {
// TODO // TODO
} }
void CGxDeviceD3d::Draw(CGxBatch* batch, int32_t count) { void CGxDeviceD3d::Draw(CGxBatch* batch, int32_t indexed) {
if (!this->m_context || this->intF5C) { if (!this->m_context || this->intF5C) {
return; return;
} }
@ -369,7 +369,7 @@ void CGxDeviceD3d::Draw(CGxBatch* batch, int32_t count) {
baseIndex = this->m_primVertexFormatBuf[0]->m_index / this->m_primVertexFormatBuf[0]->m_itemSize; baseIndex = this->m_primVertexFormatBuf[0]->m_index / this->m_primVertexFormatBuf[0]->m_itemSize;
} }
if (count) { if (indexed) {
this->m_d3dDevice->DrawIndexedPrimitive( this->m_d3dDevice->DrawIndexedPrimitive(
CGxDeviceD3d::s_primitiveConversion[batch->m_primType], CGxDeviceD3d::s_primitiveConversion[batch->m_primType],
baseIndex, baseIndex,

View File

@ -230,7 +230,7 @@ class CGxDeviceD3d : public CGxDevice {
virtual void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2); virtual void DeviceWM(EGxWM wm, uintptr_t param1, uintptr_t param2);
virtual void CapsWindowSize(CRect& dst); virtual void CapsWindowSize(CRect& dst);
virtual void CapsWindowSizeInScreenCoords(CRect& dst); virtual void CapsWindowSizeInScreenCoords(CRect& dst);
virtual void Draw(CGxBatch* batch, int32_t count); virtual void Draw(CGxBatch* batch, int32_t indexed);
virtual void PoolSizeSet(CGxPool* pool, uint32_t size); virtual void PoolSizeSet(CGxPool* pool, uint32_t size);
virtual char* BufLock(CGxBuf* buf); virtual char* BufLock(CGxBuf* buf);
virtual int32_t BufUnlock(CGxBuf* buf, uint32_t size); virtual int32_t BufUnlock(CGxBuf* buf, uint32_t size);

View File

@ -334,7 +334,7 @@ int32_t CGxDeviceGLL::DeviceSetFormat(const CGxFormat& format) {
return 1; return 1;
} }
void CGxDeviceGLL::Draw(CGxBatch* batch, int32_t count) { void CGxDeviceGLL::Draw(CGxBatch* batch, int32_t indexed) {
if (!this->m_context) { if (!this->m_context) {
return; return;
} }
@ -343,28 +343,26 @@ void CGxDeviceGLL::Draw(CGxBatch* batch, int32_t count) {
// unk conditional check early return // unk conditional check early return
this->IStateSync(); this->IStateSync();
this->ValidateDraw(batch, count); this->ValidateDraw(batch, indexed);
int32_t v4 = 0; uint32_t baseIndex = 0;
if (!this->m_caps.int10) {
baseIndex = this->m_primVertexFormatBuf[0]->m_index / this->m_primVertexFormatBuf[0]->m_itemSize;
}
// TODO if (indexed) {
// if (!this->unk0[154]) {
// v4 = (this->unk6[56] + 24) / (this->unk6[56] + 12);
// }
if (count) {
this->m_glDevice.DrawIndexed( this->m_glDevice.DrawIndexed(
CGxDeviceGLL::s_primitiveConversion[batch->m_primType], CGxDeviceGLL::s_primitiveConversion[batch->m_primType],
batch->m_minIndex, batch->m_minIndex,
batch->m_maxIndex, batch->m_maxIndex,
v4, baseIndex,
batch->m_start + (this->m_primIndexBuf->m_index >> 1), batch->m_start + (this->m_primIndexBuf->m_index / 2),
batch->m_count batch->m_count
); );
} else { } else {
this->m_glDevice.Draw( this->m_glDevice.Draw(
CGxDeviceGLL::s_primitiveConversion[batch->m_primType], CGxDeviceGLL::s_primitiveConversion[batch->m_primType],
v4, baseIndex,
batch->m_count batch->m_count
); );
} }
@ -672,6 +670,8 @@ void CGxDeviceGLL::ISetCaps(const CGxFormat& format) {
this->m_caps.m_generateMipMaps = 1; this->m_caps.m_generateMipMaps = 1;
this->m_caps.int10 = 1;
this->m_caps.m_texFmt[GxTex_Dxt1] = 1; this->m_caps.m_texFmt[GxTex_Dxt1] = 1;
this->m_caps.m_texFmt[GxTex_Dxt3] = 1; this->m_caps.m_texFmt[GxTex_Dxt3] = 1;
this->m_caps.m_texFmt[GxTex_Dxt5] = 1; this->m_caps.m_texFmt[GxTex_Dxt5] = 1;

View File

@ -38,7 +38,7 @@ class CGxDeviceGLL : public CGxDevice {
virtual void SceneClear(uint32_t, CImVector); virtual void SceneClear(uint32_t, CImVector);
virtual void XformSetProjection(const C44Matrix&); virtual void XformSetProjection(const C44Matrix&);
virtual void XformSetView(const C44Matrix&); virtual void XformSetView(const C44Matrix&);
virtual void Draw(CGxBatch*, int32_t); virtual void Draw(CGxBatch* batch, int32_t indexed);
virtual void PoolSizeSet(CGxPool*, uint32_t); virtual void PoolSizeSet(CGxPool*, uint32_t);
virtual char* BufLock(CGxBuf*); virtual char* BufLock(CGxBuf*);
virtual int32_t BufUnlock(CGxBuf*, uint32_t); virtual int32_t BufUnlock(CGxBuf*, uint32_t);