migrated gif_sender to spacket

This commit is contained in:
h4570
2020-11-16 23:15:07 +01:00
parent 7e442bcf5c
commit 00c171d6b9
4 changed files with 51 additions and 73 deletions
+2 -5
View File
@@ -16,7 +16,6 @@
#include <draw_types.h> #include <draw_types.h>
#include <draw_primitives.h> #include <draw_primitives.h>
#include <math3d.h> #include <math3d.h>
#include <packet.h>
#include <spacket.h> #include <spacket.h>
#include "../models/mesh.hpp" #include "../models/mesh.hpp"
#include "../models/math/matrix.hpp" #include "../models/math/matrix.hpp"
@@ -46,10 +45,8 @@ private:
texel_t *st; texel_t *st;
u8 isAnyObjectAdded; u8 isAnyObjectAdded;
ScreenSettings *screen; ScreenSettings *screen;
u64 *dw; spacket_t *packets[2];
qword_t *q, *dmatag; spacket_t *currentPacket;
packet_t *packets[2];
packet_t *currentPacket;
u8 packetsCount; u8 packetsCount;
int packetSize; int packetSize;
float halfScreenW, halfScreenH; float halfScreenW, halfScreenH;
-1
View File
@@ -13,7 +13,6 @@
#include <draw_buffers.h> #include <draw_buffers.h>
#include <draw_primitives.h> #include <draw_primitives.h>
#include <packet.h>
#include <spacket.h> #include <spacket.h>
#include "gif_sender.hpp" #include "gif_sender.hpp"
#include "vif_sender.hpp" #include "vif_sender.hpp"
+26 -44
View File
@@ -32,16 +32,16 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre
{ {
PRINT_LOG("Initializing GifSender"); PRINT_LOG("Initializing GifSender");
packetSize = t_packetSize; packetSize = t_packetSize;
packets[0] = packet_init(t_packetSize, PACKET_NORMAL); packets[0] = spacket_create(t_packetSize, SPACKET_NORMAL);
packets[1] = packet_init(t_packetSize, PACKET_NORMAL); packets[1] = spacket_create(t_packetSize, SPACKET_NORMAL);
PRINT_LOG("GifSender initialized!"); PRINT_LOG("GifSender initialized!");
} }
/** Releases packets memory */ /** Releases packets memory */
GifSender::~GifSender() GifSender::~GifSender()
{ {
packet_free(packets[0]); spacket_free(packets[0]);
packet_free(packets[1]); spacket_free(packets[1]);
} }
// ---- // ----
@@ -94,12 +94,8 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer)
void GifSender::initPacket(u8 t_context) void GifSender::initPacket(u8 t_context)
{ {
currentPacket = packets[t_context]; currentPacket = packets[t_context];
if (currentPacket->qwords > (u32)packetSize || currentPacket->qwords < 0) spacket_reset(currentPacket, false);
PRINT_ERR("GifSender packet size error. Please consider to change packet size!\n"); isAnyObjectAdded = false;
q = currentPacket->data;
dmatag = q;
q++;
isAnyObjectAdded = 0;
} }
/** Sends packet to GIF. */ /** Sends packet to GIF. */
@@ -107,25 +103,24 @@ void GifSender::sendPacket()
{ {
if (isAnyObjectAdded) if (isAnyObjectAdded)
{ {
dmatag = q; spacket_chain_open_end(currentPacket, 0, 0);
q++; spacket_update(currentPacket, draw_finish(currentPacket->next));
spacket_chain_close_tag(currentPacket);
} }
q = draw_finish(q); spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true);
DMATAG_END(dmatag, q - dmatag - 1, 0, 0, 0);
FlushCache(0);
dma_channel_send_chain(DMA_CHANNEL_GIF, currentPacket->data, q - currentPacket->data, 0, 0);
dma_wait_fast();
} }
/** Adds clear screen to current packet */ /** Adds clear screen to current packet */
void GifSender::addClear(zbuffer_t *t_zBuffer) void GifSender::addClear(zbuffer_t *t_zBuffer)
{ {
q = draw_disable_tests(q, 0, t_zBuffer); spacket_chain_open_cnt(currentPacket, 0, 0, 0);
q = draw_clear(q, 0, spacket_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer));
spacket_update(currentPacket, draw_clear(currentPacket->next, 0,
2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2),
screen->width, screen->height, screen->width, screen->height,
0x10, 0x10, 0x10); 0x10, 0x10, 0x10));
q = draw_enable_tests(q, 0, t_zBuffer); spacket_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer));
spacket_chain_close_tag(currentPacket);
} }
/** Adds 3D objects to current packet /** Adds 3D objects to current packet
@@ -136,19 +131,10 @@ void GifSender::addClear(zbuffer_t *t_zBuffer)
*/ */
void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCount, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer)
{ {
if (!isAnyObjectAdded) spacket_chain_open_cnt(currentPacket, 0, 0, 0);
{ spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod));
isAnyObjectAdded = true; spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut));
DMATAG_CNT(dmatag, q - dmatag - 1, 0, 0, 0); // init tag (before first 3d obj) spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color));
}
qword_t *tempDMATag;
tempDMATag = q;
q++;
q = draw_texture_sampling(q, 0, &t_mesh.lod);
q = draw_texturebuffer(q, 0, textureBuffer, &t_mesh.clut);
dw = (u64 *)draw_prim_start(q, 0, t_renderData->prim, &t_mesh.color);
xyz = new xyz_t[vertexCount]; xyz = new xyz_t[vertexCount];
rgbaq = new color_t[vertexCount]; rgbaq = new color_t[vertexCount];
st = new texel_t[vertexCount]; st = new texel_t[vertexCount];
@@ -157,13 +143,8 @@ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCoun
delete[] xyz; delete[] xyz;
delete[] rgbaq; delete[] rgbaq;
delete[] st; delete[] st;
spacket_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST));
if ((u32)dw % 16) // if we are in the middle of qw, switch packet spacket_chain_close_tag(currentPacket);
*dw++ = 0;
q = draw_prim_end((qword_t *)dw, 3, DRAW_STQ_REGLIST);
DMATAG_CNT(tempDMATag, q - tempDMATag - 1, 0, 0, 0);
} }
/** Calculates 3D object data into xyz, rgbq, st /** Calculates 3D object data into xyz, rgbq, st
@@ -267,8 +248,9 @@ void GifSender::addCurrentCalcs(u32 &t_vertexCount)
{ {
for (u32 i = 0; i < t_vertexCount; i++) for (u32 i = 0; i < t_vertexCount; i++)
{ {
*dw++ = rgbaq[i].rgbaq; spacket_add_dword(currentPacket, rgbaq[i].rgbaq);
*dw++ = st[i].uv; spacket_add_dword(currentPacket, st[i].uv);
*dw++ = xyz[i].xyz; spacket_add_dword(currentPacket, xyz[i].xyz);
} }
spacket_align_to_qw(currentPacket);
} }
+21 -21
View File
@@ -33,7 +33,7 @@ Ari::~Ari() {}
void Ari::onInit() void Ari::onInit()
{ {
engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes); engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes);
engine->audio.setSongVolume(60); engine->audio.setSongVolume(40);
engine->audio.loadSong("MOV-CIRC.WAV"); engine->audio.loadSong("MOV-CIRC.WAV");
adpcm = engine->audio.loadADPCM("ziobro.adpcm"); adpcm = engine->audio.loadADPCM("ziobro.adpcm");
texRepo = engine->renderer->getTextureRepository(); texRepo = engine->renderer->getTextureRepository();
@@ -52,23 +52,23 @@ void Ari::onInit()
// skybox.loadObj("skybox/", "skybox", 100.0F, false); // skybox.loadObj("skybox/", "skybox", 100.0F, false);
// skybox.shouldBeFrustumCulled = false; // skybox.shouldBeFrustumCulled = false;
// waterFloors[0].loadObj("water/", "water", 5.0F, false); waterFloors[0].loadObj("water/", "water", 5.0F, false);
// waterFloors[0].position.set(0.0F, 8.0F, 0.0F); waterFloors[0].position.set(0.0F, 8.0F, 0.0F);
// texRepo->addByMesh("water/", waterFloors[0]); texRepo->addByMesh("water/", waterFloors[0]);
// for (u8 i = 0; i < WATER_TILES_COUNT; i++) for (u8 i = 0; i < WATER_TILES_COUNT; i++)
// { {
// spirals[i].x = 1.0F; spirals[i].x = 1.0F;
// spirals[i].y = 2.0F; spirals[i].y = 2.0F;
// } }
// u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT); u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT);
// calcSpiral(spiralOffset, spiralOffset); calcSpiral(spiralOffset, spiralOffset);
// for (u8 i = 1; i < WATER_TILES_COUNT; i++) for (u8 i = 1; i < WATER_TILES_COUNT; i++)
// { {
// waterFloors[i].loadFrom(waterFloors[0]); waterFloors[i].loadFrom(waterFloors[0]);
// waterFloors[i].position.set(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y); waterFloors[i].position.set(10.0F * spirals[i].x, 8.0F, 10.0F * spirals[i].y);
// texRepo->getByMesh(waterFloors[0].getId(), waterFloors[0].getMaterial(0).getId()) texRepo->getByMesh(waterFloors[0].getId(), waterFloors[0].getMaterial(0).getId())
// ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId()); ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId());
// } }
texRepo->addByMesh("sunnyisl/", island); texRepo->addByMesh("sunnyisl/", island);
// texRepo->addByMesh("sunnyisl/", islandAddons); // texRepo->addByMesh("sunnyisl/", islandAddons);
@@ -91,7 +91,7 @@ void Ari::onUpdate()
if (engine->pad.isCrossClicked) if (engine->pad.isCrossClicked)
{ {
engine->audio.loadSong("nob-else.wav"); engine->audio.loadSong("nob-else.wav");
engine->audio.playADPCM(adpcm); // engine->audio.playADPCM(adpcm);
printf("FPS:%f\n", engine->fps); printf("FPS:%f\n", engine->fps);
} }
camera.update(engine->pad, player.mesh); camera.update(engine->pad, player.mesh);
@@ -99,8 +99,8 @@ void Ari::onUpdate()
engine->renderer->draw(island); engine->renderer->draw(island);
// engine->renderer->draw(islandAddons); // engine->renderer->draw(islandAddons);
// engine->renderer->draw(player.mesh); // engine->renderer->draw(player.mesh);
// for (u8 i = 0; i < WATER_TILES_COUNT; i++) for (u8 i = 0; i < WATER_TILES_COUNT; i++)
// engine->renderer->draw(waterFloors[i]); engine->renderer->drawByPath3(waterFloors[i]);
} }
void Ari::calcSpiral(int X, int Y) void Ari::calcSpiral(int X, int Y)