finish of renderer refactor
This commit is contained in:
@@ -19,9 +19,9 @@ DynPipCore::DynPipCore() {}
|
||||
|
||||
DynPipCore::~DynPipCore() {}
|
||||
|
||||
void DynPipCore::init(RendererCore* t_core, const u32& t_packetSize) {
|
||||
void DynPipCore::init(RendererCore* t_core) {
|
||||
rendererCore = t_core;
|
||||
qbufferRenderer.init(t_core, &repository, t_packetSize);
|
||||
qbufferRenderer.init(t_core, &repository);
|
||||
}
|
||||
|
||||
void DynPipCore::reinitVU1Programs() { qbufferRenderer.reinitVU1(); }
|
||||
|
||||
@@ -18,23 +18,34 @@ DynPipRenderer::DynPipRenderer() {
|
||||
context = 0;
|
||||
bufferSize = 0;
|
||||
lastProgramName = DynPipProgramName::DynPipUndefinedProgram;
|
||||
staticDataPacket = packet2_create(3, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
objectDataPacket = packet2_create(16, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
programsPacket = nullptr;
|
||||
}
|
||||
|
||||
DynPipRenderer::~DynPipRenderer() {
|
||||
packet2_free(packets[0]);
|
||||
packet2_free(packets[1]);
|
||||
packet2_free(staticDataPacket);
|
||||
packet2_free(objectDataPacket);
|
||||
|
||||
if (programsPacket) packet2_free(programsPacket);
|
||||
}
|
||||
|
||||
void DynPipRenderer::allocateOnUse(const u32& t_packetSize) {
|
||||
staticDataPacket = packet2_create(3, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
objectDataPacket = packet2_create(16, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
for (u16 i = 0; i < 2; i++)
|
||||
packets[i] =
|
||||
packet2_create(t_packetSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
sendStaticData();
|
||||
}
|
||||
|
||||
void DynPipRenderer::deallocateOnUse() {
|
||||
packet2_free(staticDataPacket);
|
||||
packet2_free(objectDataPacket);
|
||||
|
||||
for (u16 i = 0; i < 2; i++) packet2_free(packets[i]);
|
||||
}
|
||||
|
||||
void DynPipRenderer::init(RendererCore* t_core,
|
||||
DynPipProgramsRepository* t_programRepo,
|
||||
const u32& t_packetSize) {
|
||||
DynPipProgramsRepository* t_programRepo) {
|
||||
path1 = t_core->getPath1();
|
||||
rendererCore = t_core;
|
||||
programsRepo = t_programRepo;
|
||||
@@ -42,12 +53,6 @@ void DynPipRenderer::init(RendererCore* t_core,
|
||||
dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0);
|
||||
dma_channel_fast_waits(DMA_CHANNEL_VIF1);
|
||||
|
||||
packets[0] =
|
||||
packet2_create(t_packetSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
packets[1] =
|
||||
packet2_create(t_packetSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
setProgramsCache();
|
||||
|
||||
reinitVU1();
|
||||
@@ -56,7 +61,6 @@ void DynPipRenderer::init(RendererCore* t_core,
|
||||
}
|
||||
|
||||
void DynPipRenderer::reinitVU1() {
|
||||
sendStaticData();
|
||||
uploadPrograms();
|
||||
setDoubleBuffer();
|
||||
}
|
||||
|
||||
@@ -15,25 +15,36 @@ namespace Tyra {
|
||||
const u32 DynamicPipeline::buffersCount = 64;
|
||||
const u32 DynamicPipeline::halfBuffersCount = buffersCount / 2;
|
||||
|
||||
DynamicPipeline::DynamicPipeline() {
|
||||
colorsCache = new Vec4[4];
|
||||
buffers = new DynPipBag[buffersCount];
|
||||
}
|
||||
DynamicPipeline::DynamicPipeline() {}
|
||||
|
||||
DynamicPipeline::~DynamicPipeline() {
|
||||
delete[] colorsCache;
|
||||
for (u32 i = 0; i < buffersCount; i++) freeBuffer(&buffers[i]);
|
||||
delete[] buffers;
|
||||
}
|
||||
DynamicPipeline::~DynamicPipeline() {}
|
||||
|
||||
void DynamicPipeline::init(RendererCore* t_core) {
|
||||
void DynamicPipeline::setRenderer(RendererCore* t_core) {
|
||||
rendererCore = t_core;
|
||||
|
||||
core.init(t_core);
|
||||
}
|
||||
|
||||
void DynamicPipeline::onUse() {
|
||||
colorsCache = new Vec4[4];
|
||||
|
||||
buffers = new DynPipBag[buffersCount];
|
||||
|
||||
auto packetSize =
|
||||
buffersCount * 5.1F; // 5.1 = packet2_get_qw_count / buffersCount
|
||||
core.init(t_core, static_cast<u32>(packetSize));
|
||||
|
||||
core.allocateOnUse(static_cast<u32>(packetSize));
|
||||
core.reinitVU1Programs();
|
||||
}
|
||||
|
||||
void DynamicPipeline::onUse() { core.reinitVU1Programs(); }
|
||||
void DynamicPipeline::onUseEnd() {
|
||||
delete[] colorsCache;
|
||||
|
||||
for (u32 i = 0; i < buffersCount; i++) freeBuffer(&buffers[i]);
|
||||
delete[] buffers;
|
||||
|
||||
core.deallocateOnUse();
|
||||
}
|
||||
|
||||
void DynamicPipeline::render(DynamicMesh* mesh, const DynPipOptions* options) {
|
||||
auto model = mesh->getModelMatrix();
|
||||
|
||||
@@ -17,8 +17,6 @@ namespace Tyra {
|
||||
MinecraftPipeline::MinecraftPipeline() {
|
||||
latestMode = UndefinedMcpipProgram;
|
||||
spamBuffersCount = 4;
|
||||
spamBuffers = new McpipBlock**[spamBuffersCount];
|
||||
spamCounts = new u32[spamBuffersCount];
|
||||
spammerIndex = 0;
|
||||
}
|
||||
|
||||
@@ -26,11 +24,9 @@ MinecraftPipeline::~MinecraftPipeline() {
|
||||
if (bbox) {
|
||||
delete bbox;
|
||||
}
|
||||
delete[] spamBuffers;
|
||||
delete[] spamCounts;
|
||||
}
|
||||
|
||||
void MinecraftPipeline::init(RendererCore* core) {
|
||||
void MinecraftPipeline::setRenderer(RendererCore* core) {
|
||||
rendererCore = core;
|
||||
manager.init(core);
|
||||
|
||||
@@ -38,11 +34,21 @@ void MinecraftPipeline::init(RendererCore* core) {
|
||||
}
|
||||
|
||||
void MinecraftPipeline::onUse() {
|
||||
spamBuffers = new McpipBlock**[spamBuffersCount];
|
||||
spamCounts = new u32[spamBuffersCount];
|
||||
manager.allocateOnUse();
|
||||
|
||||
manager.uploadVU1Programs();
|
||||
|
||||
changeMode(McPipCull, true);
|
||||
}
|
||||
|
||||
void MinecraftPipeline::onUseEnd() {
|
||||
delete[] spamBuffers;
|
||||
delete[] spamCounts;
|
||||
manager.deallocateOnUse();
|
||||
}
|
||||
|
||||
void MinecraftPipeline::initBBox() {
|
||||
const auto& block = manager.getBlockData();
|
||||
bbox = new RenderBBox(block.vertices, block.count);
|
||||
|
||||
@@ -16,16 +16,23 @@ BlockizerProgramsManager::BlockizerProgramsManager() {
|
||||
lastProgramName = UndefinedMcpipProgram;
|
||||
context = 0;
|
||||
vu1BlockData = BlockNotUploaded;
|
||||
dynamicPackets[0] = packet2_create(300, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
dynamicPackets[1] = packet2_create(300, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
staticPacket = packet2_create(2, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
setProgramsCache();
|
||||
}
|
||||
|
||||
BlockizerProgramsManager::~BlockizerProgramsManager() {
|
||||
void BlockizerProgramsManager::allocateOnUse() {
|
||||
dynamicPackets[0] = packet2_create(300, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
dynamicPackets[1] = packet2_create(300, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
staticPacket = packet2_create(2, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
}
|
||||
|
||||
void BlockizerProgramsManager::deallocateOnUse() {
|
||||
packet2_free(dynamicPackets[0]);
|
||||
packet2_free(dynamicPackets[1]);
|
||||
packet2_free(staticPacket);
|
||||
}
|
||||
|
||||
BlockizerProgramsManager::~BlockizerProgramsManager() {
|
||||
packet2_free(programsPacket);
|
||||
}
|
||||
|
||||
|
||||
@@ -42,38 +42,43 @@ StaPipQBufferRenderer::StaPipQBufferRenderer() {
|
||||
context = 0;
|
||||
lastProgramName = StaPipUndefinedProgram;
|
||||
|
||||
u32 qbuffersPacketSize = 4 * buffersCount;
|
||||
|
||||
packets = new packet2_t*[buffersCount];
|
||||
packets[0] =
|
||||
packet2_create(qbuffersPacketSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
packets[1] =
|
||||
packet2_create(qbuffersPacketSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
qbuffersPacketSize = 4 * buffersCount;
|
||||
programsPacket = nullptr;
|
||||
}
|
||||
|
||||
void StaPipQBufferRenderer::allocateOnUse() {
|
||||
staticDataPacket = packet2_create(3, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
objectDataPacket = packet2_create(16, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
programsPacket = nullptr;
|
||||
packets = new packet2_t*[buffersCount];
|
||||
for (u16 i = 0; i < 2; i++)
|
||||
packets[i] =
|
||||
packet2_create(qbuffersPacketSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, true);
|
||||
|
||||
buffers = new StaPipQBuffer*[buffersCount];
|
||||
programs = new StaPipVU1Program*[buffersCount];
|
||||
for (u16 i = 0; i < buffersCount; i++) {
|
||||
buffers[i] = new StaPipQBuffer();
|
||||
}
|
||||
|
||||
dBufferPrograms = new StaPipVU1Program*[buffersCount];
|
||||
|
||||
sendStaticData();
|
||||
}
|
||||
StaPipQBufferRenderer::~StaPipQBufferRenderer() {
|
||||
|
||||
void StaPipQBufferRenderer::deallocateOnUse() {
|
||||
packet2_free(staticDataPacket);
|
||||
packet2_free(objectDataPacket);
|
||||
packet2_free(packets[0]);
|
||||
packet2_free(packets[1]);
|
||||
|
||||
for (u16 i = 0; i < buffersCount; i++) {
|
||||
delete buffers[i];
|
||||
}
|
||||
|
||||
for (u16 i = 0; i < 2; i++) packet2_free(packets[i]);
|
||||
delete[] packets;
|
||||
|
||||
for (u16 i = 0; i < buffersCount; i++) delete buffers[i];
|
||||
delete[] buffers;
|
||||
|
||||
delete[] dBufferPrograms;
|
||||
}
|
||||
|
||||
StaPipQBufferRenderer::~StaPipQBufferRenderer() {
|
||||
if (programsPacket) packet2_free(programsPacket);
|
||||
}
|
||||
|
||||
@@ -93,7 +98,6 @@ void StaPipQBufferRenderer::init(RendererCore* t_core) {
|
||||
}
|
||||
|
||||
void StaPipQBufferRenderer::reinitVU1() {
|
||||
sendStaticData();
|
||||
uploadPrograms();
|
||||
setDoubleBuffer();
|
||||
}
|
||||
@@ -239,7 +243,7 @@ void StaPipQBufferRenderer::cull(StaPipQBuffer* buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
programs[getQBufferIndex(buffer)] = getCullProgramByBag(buffer->bag);
|
||||
dBufferPrograms[getQBufferIndex(buffer)] = getCullProgramByBag(buffer->bag);
|
||||
|
||||
auto is1stDBuffer = is1stDBufferFlushTime();
|
||||
auto is2ndDBuffer = is2ndDBufferFlushTime();
|
||||
@@ -256,7 +260,7 @@ void StaPipQBufferRenderer::clip(StaPipQBuffer* buffer) {
|
||||
return;
|
||||
}
|
||||
|
||||
programs[getQBufferIndex(buffer)] = getAsIsProgramByBag(buffer->bag);
|
||||
dBufferPrograms[getQBufferIndex(buffer)] = getAsIsProgramByBag(buffer->bag);
|
||||
|
||||
clipper.clip(buffer);
|
||||
|
||||
@@ -282,13 +286,13 @@ void StaPipQBufferRenderer::addBufferDataToPacket(StaPipQBuffer** buffers,
|
||||
for (u32 i = 0; i < count; i++) {
|
||||
if (!buffers[i]->any()) continue;
|
||||
|
||||
programs[i]->addBufferDataToPacket(currentPacket, buffers[i],
|
||||
&rendererCore->gs.prim);
|
||||
dBufferPrograms[i]->addBufferDataToPacket(currentPacket, buffers[i],
|
||||
&rendererCore->gs.prim);
|
||||
|
||||
if (lastProgramName != programs[i]->getName()) {
|
||||
packet2_utils_vu_add_start_program(currentPacket,
|
||||
programs[i]->getDestinationAddress());
|
||||
lastProgramName = programs[i]->getName();
|
||||
if (lastProgramName != dBufferPrograms[i]->getName()) {
|
||||
packet2_utils_vu_add_start_program(
|
||||
currentPacket, dBufferPrograms[i]->getDestinationAddress());
|
||||
lastProgramName = dBufferPrograms[i]->getName();
|
||||
} else {
|
||||
packet2_utils_vu_add_continue_program(currentPacket);
|
||||
}
|
||||
|
||||
@@ -13,16 +13,26 @@
|
||||
|
||||
namespace Tyra {
|
||||
|
||||
StaticPipeline::StaticPipeline() { colorsCache = new Vec4[4]; }
|
||||
StaticPipeline::StaticPipeline() {}
|
||||
|
||||
StaticPipeline::~StaticPipeline() { delete[] colorsCache; }
|
||||
StaticPipeline::~StaticPipeline() {}
|
||||
|
||||
void StaticPipeline::init(RendererCore* t_core) {
|
||||
void StaticPipeline::setRenderer(RendererCore* t_core) {
|
||||
rendererCore = t_core;
|
||||
core.init(t_core);
|
||||
}
|
||||
|
||||
void StaticPipeline::onUse() { core.reinitVU1Programs(); }
|
||||
void StaticPipeline::onUse() {
|
||||
colorsCache = new Vec4[4];
|
||||
core.allocateOnUse();
|
||||
core.reinitVU1Programs();
|
||||
}
|
||||
|
||||
void StaticPipeline::onUseEnd() {
|
||||
delete[] colorsCache;
|
||||
|
||||
core.deallocateOnUse();
|
||||
}
|
||||
|
||||
void StaticPipeline::render(StaticMesh* mesh, const StaPipOptions* options) {
|
||||
auto model = mesh->getModelMatrix();
|
||||
|
||||
@@ -19,6 +19,7 @@ Renderer3D::~Renderer3D() {}
|
||||
|
||||
void Renderer3D::usePipeline(Renderer3DPipeline* pipeline) {
|
||||
if (currentPipeline != pipeline) {
|
||||
if (currentPipeline) currentPipeline->onUseEnd();
|
||||
currentPipeline = pipeline;
|
||||
currentPipeline->onUse();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user