From c1ad6effbdce25700f86fc30deba809973881f3a Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 16 Nov 2020 18:48:09 +0100 Subject: [PATCH 01/15] migrated renderer to libspacket --- src/engine/include/modules/renderer.hpp | 3 ++- src/engine/modules/renderer.cpp | 25 ++++++++++--------------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/src/engine/include/modules/renderer.hpp b/src/engine/include/modules/renderer.hpp index cdeee7c..b435524 100644 --- a/src/engine/include/modules/renderer.hpp +++ b/src/engine/include/modules/renderer.hpp @@ -14,6 +14,7 @@ #include #include #include +#include #include "gif_sender.hpp" #include "vif_sender.hpp" #include "../models/math/plane.hpp" @@ -118,7 +119,7 @@ private: TextureRepository textureRepo; GifSender *gifSender; VifSender *vifSender; - packet_t *flipPacket; + spacket_t *flipPacket; void allocateBuffers(float t_screenW, float t_screenH); void initDrawingEnv(float t_screenW, float t_screenH); void setPrim(); diff --git a/src/engine/modules/renderer.cpp b/src/engine/modules/renderer.cpp index 31af989..72e30ff 100644 --- a/src/engine/modules/renderer.cpp +++ b/src/engine/modules/renderer.cpp @@ -40,7 +40,7 @@ Renderer::Renderer(u32 t_packetSize, ScreenSettings *t_screen) isVSyncEnabled = true; isFrameEmpty = false; lastTextureId = 0; - flipPacket = packet_init(3, PACKET_UCAB); // Uncached accelerated + flipPacket = spacket_create(4, SPACKET_UNCACHED_ACCL); allocateBuffers(t_screen->width, t_screen->height); initDrawingEnv(t_screen->width, t_screen->height); setPrim(); @@ -104,17 +104,14 @@ void Renderer::changeTexture(const Mesh &t_mesh, u32 t_materialId) void Renderer::initDrawingEnv(float t_screenW, float t_screenH) { PRINT_LOG("Initializing drawing environment"); - packet_t *packet = packet_init(20, PACKET_NORMAL); u16 halfW = (u16)t_screenW / 2; u16 halfH = (u16)t_screenH / 2; - qword_t *q = packet->data; // Generic qword pointer. - q = draw_setup_environment(q, 0, frameBuffers, &(zBuffer)); - q = draw_primitive_xyoffset(q, 0, (2048 - halfW), (2048 - halfH)); - q = draw_finish(q); - // Now send the packet, no need to wait since it's the first. - dma_channel_send_normal(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); - dma_wait_fast(); - packet_free(packet); + spacket_t *spacket = spacket_create(20, SPACKET_NORMAL); + spacket_update(spacket, draw_setup_environment(spacket->base, 0, frameBuffers, &(zBuffer))); + spacket_update(spacket, draw_primitive_xyoffset(spacket->next, 0, (2048 - halfW), (2048 - halfH))); + spacket_update(spacket, draw_finish(spacket->next)); + spacket_send(spacket, DMA_CHANNEL_GIF, true); + spacket_free(spacket); PRINT_LOG("Drawing environment initialized!"); } @@ -277,10 +274,8 @@ void Renderer::flipBuffers() 0); context ^= 1; isFrameEmpty = 1; - qword_t *q = flipPacket->data; - q = draw_framebuffer(q, 0, &frameBuffers[context]); - q = draw_finish(q); - dma_wait_fast(); - dma_channel_send_normal_ucab(DMA_CHANNEL_GIF, flipPacket->data, q - flipPacket->data, 0); + spacket_update(flipPacket, draw_framebuffer(flipPacket->base, 0, &frameBuffers[context])); + spacket_update(flipPacket, draw_finish(flipPacket->next)); + spacket_send(flipPacket, DMA_CHANNEL_GIF, false); draw_wait_finish(); } From 7e442bcf5c4070a7040e95f93dda8adb348422c0 Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 16 Nov 2020 18:48:36 +0100 Subject: [PATCH 02/15] gif_sender migration #1 (libspacket) --- src/engine/include/modules/gif_sender.hpp | 1 + src/engine/modules/gif_sender.cpp | 55 ++++++++++++----------- 2 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/engine/include/modules/gif_sender.hpp b/src/engine/include/modules/gif_sender.hpp index e773c64..7b6f661 100644 --- a/src/engine/include/modules/gif_sender.hpp +++ b/src/engine/include/modules/gif_sender.hpp @@ -17,6 +17,7 @@ #include #include #include +#include #include "../models/mesh.hpp" #include "../models/math/matrix.hpp" #include "../models/screen_settings.hpp" diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 229c30d..2833573 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -54,37 +54,38 @@ GifSender::~GifSender() /** Send texture via GIF */ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) { - const u16 packetSize = 40; - packet_t *packet = packet_init(packetSize, PACKET_NORMAL); - qword_t *q = packet->data; - q = draw_texture_transfer(q, texture.getData(), texture.getWidth(), texture.getHeight(), GS_PSM_24, t_texBuffer->address, t_texBuffer->width); - DMATAG_CNT(q, 2, 0, 0, 0); - q++; - q = draw_texture_wrapping(q, 0, texture.getWrapSettings()); - q = draw_texture_flush(q); - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); - dma_wait_fast(); - packet_free(packet); + spacket_t *spacket = spacket_create(15, SPACKET_NORMAL); + spacket_update( + spacket, + draw_texture_transfer( + spacket->base, + texture.getData(), + texture.getWidth(), + texture.getHeight(), GS_PSM_24, + t_texBuffer->address, + t_texBuffer->width)); + spacket_chain_open_cnt(spacket, 0, 0, 0); + spacket_update(spacket, draw_texture_wrapping(spacket->next, 0, texture.getWrapSettings())); + spacket_chain_close_tag(spacket); + spacket_update(spacket, draw_texture_flush(spacket->next)); + spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true); + spacket_free(spacket); } void GifSender::sendClear(zbuffer_t *t_zBuffer) { - packet_t *packet = packet_init(100, PACKET_NORMAL); - qword_t *q = packet->data; - q++; - q = draw_disable_tests(q, 0, t_zBuffer); - q = draw_clear(q, 0, - 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), - screen->width, screen->height, - 0x10, 0x10, 0x10); - q = draw_enable_tests(q, 0, t_zBuffer); - q = draw_finish(q); - DMATAG_END(packet->data, q - packet->data - 1, 0, 0, 0); - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_GIF, packet->data, q - packet->data, 0, 0); - dma_wait_fast(); - packet_free(packet); + spacket_t *spacket = spacket_create(36, SPACKET_NORMAL); + spacket_chain_open_end(spacket, 0, 0); + spacket_update(spacket, draw_disable_tests(spacket->next, 0, t_zBuffer)); + spacket_update(spacket, draw_clear(spacket->next, 0, + 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), + screen->width, screen->height, + 0x10, 0x10, 0x10)); + spacket_update(spacket, draw_enable_tests(spacket->next, 0, t_zBuffer)); + spacket_update(spacket, draw_finish(spacket->next)); + spacket_chain_close_tag(spacket); + spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true); + spacket_free(spacket); } /** Used in game loop. From 00c171d6b9842cdcc5da1d1d91c1e3315aebb61b Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 16 Nov 2020 23:15:07 +0100 Subject: [PATCH 03/15] migrated gif_sender to spacket --- src/engine/include/modules/gif_sender.hpp | 7 +-- src/engine/include/modules/renderer.hpp | 1 - src/engine/modules/gif_sender.cpp | 74 +++++++++-------------- src/samples/ari/ari.cpp | 42 ++++++------- 4 files changed, 51 insertions(+), 73 deletions(-) diff --git a/src/engine/include/modules/gif_sender.hpp b/src/engine/include/modules/gif_sender.hpp index 7b6f661..7df673e 100644 --- a/src/engine/include/modules/gif_sender.hpp +++ b/src/engine/include/modules/gif_sender.hpp @@ -16,7 +16,6 @@ #include #include #include -#include #include #include "../models/mesh.hpp" #include "../models/math/matrix.hpp" @@ -46,10 +45,8 @@ private: texel_t *st; u8 isAnyObjectAdded; ScreenSettings *screen; - u64 *dw; - qword_t *q, *dmatag; - packet_t *packets[2]; - packet_t *currentPacket; + spacket_t *packets[2]; + spacket_t *currentPacket; u8 packetsCount; int packetSize; float halfScreenW, halfScreenH; diff --git a/src/engine/include/modules/renderer.hpp b/src/engine/include/modules/renderer.hpp index b435524..e7b62e7 100644 --- a/src/engine/include/modules/renderer.hpp +++ b/src/engine/include/modules/renderer.hpp @@ -13,7 +13,6 @@ #include #include -#include #include #include "gif_sender.hpp" #include "vif_sender.hpp" diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 2833573..531e0db 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -32,16 +32,16 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre { PRINT_LOG("Initializing GifSender"); packetSize = t_packetSize; - packets[0] = packet_init(t_packetSize, PACKET_NORMAL); - packets[1] = packet_init(t_packetSize, PACKET_NORMAL); + packets[0] = spacket_create(t_packetSize, SPACKET_NORMAL); + packets[1] = spacket_create(t_packetSize, SPACKET_NORMAL); PRINT_LOG("GifSender initialized!"); } /** Releases packets memory */ GifSender::~GifSender() { - packet_free(packets[0]); - packet_free(packets[1]); + spacket_free(packets[0]); + spacket_free(packets[1]); } // ---- @@ -94,12 +94,8 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer) void GifSender::initPacket(u8 t_context) { currentPacket = packets[t_context]; - if (currentPacket->qwords > (u32)packetSize || currentPacket->qwords < 0) - PRINT_ERR("GifSender packet size error. Please consider to change packet size!\n"); - q = currentPacket->data; - dmatag = q; - q++; - isAnyObjectAdded = 0; + spacket_reset(currentPacket, false); + isAnyObjectAdded = false; } /** Sends packet to GIF. */ @@ -107,25 +103,24 @@ void GifSender::sendPacket() { if (isAnyObjectAdded) { - dmatag = q; - q++; + spacket_chain_open_end(currentPacket, 0, 0); + spacket_update(currentPacket, draw_finish(currentPacket->next)); + spacket_chain_close_tag(currentPacket); } - q = draw_finish(q); - 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(); + spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true); } /** Adds clear screen to current packet */ void GifSender::addClear(zbuffer_t *t_zBuffer) { - q = draw_disable_tests(q, 0, t_zBuffer); - q = draw_clear(q, 0, - 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), - screen->width, screen->height, - 0x10, 0x10, 0x10); - q = draw_enable_tests(q, 0, t_zBuffer); + spacket_chain_open_cnt(currentPacket, 0, 0, 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), + screen->width, screen->height, + 0x10, 0x10, 0x10)); + spacket_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer)); + spacket_chain_close_tag(currentPacket); } /** 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) { - if (!isAnyObjectAdded) - { - isAnyObjectAdded = true; - DMATAG_CNT(dmatag, q - dmatag - 1, 0, 0, 0); // init tag (before first 3d obj) - } - 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); - + spacket_chain_open_cnt(currentPacket, 0, 0, 0); + spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); + spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); + spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); xyz = new xyz_t[vertexCount]; rgbaq = new color_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[] rgbaq; delete[] st; - - if ((u32)dw % 16) // if we are in the middle of qw, switch packet - *dw++ = 0; - - q = draw_prim_end((qword_t *)dw, 3, DRAW_STQ_REGLIST); - - DMATAG_CNT(tempDMATag, q - tempDMATag - 1, 0, 0, 0); + spacket_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST)); + spacket_chain_close_tag(currentPacket); } /** 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++) { - *dw++ = rgbaq[i].rgbaq; - *dw++ = st[i].uv; - *dw++ = xyz[i].xyz; + spacket_add_dword(currentPacket, rgbaq[i].rgbaq); + spacket_add_dword(currentPacket, st[i].uv); + spacket_add_dword(currentPacket, xyz[i].xyz); } + spacket_align_to_qw(currentPacket); } diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 3fbb597..3820215 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -33,7 +33,7 @@ Ari::~Ari() {} void Ari::onInit() { engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes); - engine->audio.setSongVolume(60); + engine->audio.setSongVolume(40); engine->audio.loadSong("MOV-CIRC.WAV"); adpcm = engine->audio.loadADPCM("ziobro.adpcm"); texRepo = engine->renderer->getTextureRepository(); @@ -52,23 +52,23 @@ void Ari::onInit() // skybox.loadObj("skybox/", "skybox", 100.0F, false); // skybox.shouldBeFrustumCulled = false; - // waterFloors[0].loadObj("water/", "water", 5.0F, false); - // waterFloors[0].position.set(0.0F, 8.0F, 0.0F); - // texRepo->addByMesh("water/", waterFloors[0]); - // for (u8 i = 0; i < WATER_TILES_COUNT; i++) - // { - // spirals[i].x = 1.0F; - // spirals[i].y = 2.0F; - // } - // u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT); - // calcSpiral(spiralOffset, spiralOffset); - // for (u8 i = 1; i < WATER_TILES_COUNT; i++) - // { - // waterFloors[i].loadFrom(waterFloors[0]); - // 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()) - // ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId()); - // } + waterFloors[0].loadObj("water/", "water", 5.0F, false); + waterFloors[0].position.set(0.0F, 8.0F, 0.0F); + texRepo->addByMesh("water/", waterFloors[0]); + for (u8 i = 0; i < WATER_TILES_COUNT; i++) + { + spirals[i].x = 1.0F; + spirals[i].y = 2.0F; + } + u32 spiralOffset = (u32)Math::sqrt(WATER_TILES_COUNT); + calcSpiral(spiralOffset, spiralOffset); + for (u8 i = 1; i < WATER_TILES_COUNT; i++) + { + waterFloors[i].loadFrom(waterFloors[0]); + 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()) + ->addLink(waterFloors[i].getId(), waterFloors[i].getMaterial(0).getId()); + } texRepo->addByMesh("sunnyisl/", island); // texRepo->addByMesh("sunnyisl/", islandAddons); @@ -91,7 +91,7 @@ void Ari::onUpdate() if (engine->pad.isCrossClicked) { engine->audio.loadSong("nob-else.wav"); - engine->audio.playADPCM(adpcm); + // engine->audio.playADPCM(adpcm); printf("FPS:%f\n", engine->fps); } camera.update(engine->pad, player.mesh); @@ -99,8 +99,8 @@ void Ari::onUpdate() engine->renderer->draw(island); // engine->renderer->draw(islandAddons); // engine->renderer->draw(player.mesh); - // for (u8 i = 0; i < WATER_TILES_COUNT; i++) - // engine->renderer->draw(waterFloors[i]); + for (u8 i = 0; i < WATER_TILES_COUNT; i++) + engine->renderer->drawByPath3(waterFloors[i]); } void Ari::calcSpiral(int X, int Y) From d2ce2eb7b2264a961ac1f05bcd3c88ca0409d815 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 12:58:13 +0100 Subject: [PATCH 04/15] migrated vu1 upload_prog into spacket --- src/engine/include/modules/vu1.hpp | 1 + src/engine/modules/gif_sender.cpp | 16 ++++++------ src/engine/modules/vif_sender.cpp | 3 +++ src/engine/modules/vu1.cpp | 42 +++++++++--------------------- src/samples/ari/ari.cpp | 2 +- 5 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp index 92d8d64..4773550 100644 --- a/src/engine/include/modules/vu1.hpp +++ b/src/engine/include/modules/vu1.hpp @@ -16,6 +16,7 @@ #include #include #include +#include #include const u32 VIF_BUFFER_SIZE = 48 * 1024; diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 531e0db..1cabe8a 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -64,18 +64,18 @@ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) texture.getHeight(), GS_PSM_24, t_texBuffer->address, t_texBuffer->width)); - spacket_chain_open_cnt(spacket, 0, 0, 0); + spacket_chain_open_cnt(spacket, 0, 0, 0, false); spacket_update(spacket, draw_texture_wrapping(spacket->next, 0, texture.getWrapSettings())); spacket_chain_close_tag(spacket); spacket_update(spacket, draw_texture_flush(spacket->next)); - spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true); + spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false); spacket_free(spacket); } void GifSender::sendClear(zbuffer_t *t_zBuffer) { spacket_t *spacket = spacket_create(36, SPACKET_NORMAL); - spacket_chain_open_end(spacket, 0, 0); + spacket_chain_open_end(spacket, 0, 0, false); spacket_update(spacket, draw_disable_tests(spacket->next, 0, t_zBuffer)); spacket_update(spacket, draw_clear(spacket->next, 0, 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), @@ -84,7 +84,7 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer) spacket_update(spacket, draw_enable_tests(spacket->next, 0, t_zBuffer)); spacket_update(spacket, draw_finish(spacket->next)); spacket_chain_close_tag(spacket); - spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true); + spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false); spacket_free(spacket); } @@ -103,17 +103,17 @@ void GifSender::sendPacket() { if (isAnyObjectAdded) { - spacket_chain_open_end(currentPacket, 0, 0); + spacket_chain_open_end(currentPacket, 0, 0, false); spacket_update(currentPacket, draw_finish(currentPacket->next)); spacket_chain_close_tag(currentPacket); } - spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true); + spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true, false); } /** Adds clear screen to current packet */ void GifSender::addClear(zbuffer_t *t_zBuffer) { - spacket_chain_open_cnt(currentPacket, 0, 0, 0); + spacket_chain_open_cnt(currentPacket, 0, 0, 0, false); 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), @@ -131,7 +131,7 @@ 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) { - spacket_chain_open_cnt(currentPacket, 0, 0, 0); + spacket_chain_open_cnt(currentPacket, 0, 0, 0, false); spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 2713d59..929808a 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -29,6 +29,9 @@ VifSender::VifSender() { PRINT_LOG("Initializing VifSender"); PRINT_LOG("VifSender initialized!"); + + dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); + dma_channel_fast_waits(DMA_CHANNEL_VIF1); } VifSender::~VifSender() {} diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index 18c3daa..fb7808d 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -163,7 +163,7 @@ void VU1::sendList() void VU1::addDoubleBufferSetting() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(8 >> 4); + *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_BASE, 0, 8); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_OFFSET, 0, 496); isDoubleBufferSet = 1; @@ -171,7 +171,7 @@ void VU1::addDoubleBufferSetting() void VU1::addFlush() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(8 >> 4); + *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); } @@ -227,44 +227,28 @@ void VU1::checkList() // Static // ---- -u8 IS_DMA_VIF1_INITIALIZED = 0; /** TODO */ void VU1::uploadProgram(int t_dest, u32 *t_start, u32 *t_end) { - if (!IS_DMA_VIF1_INITIALIZED) - { - IS_DMA_VIF1_INITIALIZED = 1; - dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); - dma_channel_fast_waits(DMA_CHANNEL_VIF1); - } - - int count = 0; - u8 tempBuffer[512] __attribute__((aligned(16))); - void *chain = (u64 *)&tempBuffer; // uncached - // get the size of the code as we can only send 256 instructions in each MPGtag - count = VU1::countProgramSize(t_start, t_end); + int count = VU1::countProgramSize(t_start, t_end); + spacket_t *spacket = spacket_create(20, SPACKET_NORMAL); + while (count > 0) { u32 currentCount = count > 256 ? 256 : count; - - *((u64 *)chain)++ = DMA_REF_TAG((u32)t_start, currentCount / 2); - *((u32 *)chain)++ = VIF_CODE(VIF_NOP, 0, 0); - *((u32 *)chain)++ = VIF_CODE(VIF_MPG, currentCount & 0xFF, t_dest); - + spacket_ref(spacket, t_start, currentCount / 2, 0, 0, 0, 1); + spacket_vif_nop(spacket, 0); + spacket_vif_mpg(spacket, currentCount & 0xFF, t_dest, 0); t_start += currentCount * 2; count -= currentCount; t_dest += currentCount; } - - *((u64 *)chain)++ = DMA_END_TAG(0); - *((u32 *)chain)++ = VIF_CODE(VIF_NOP, 0, 0); - *((u32 *)chain)++ = VIF_CODE(VIF_NOP, 0, 0); - - // Send it to vif1 - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_VIF1, tempBuffer, 0, DMA_FLAG_TRANSFERTAG, 0); - dma_channel_wait(DMA_CHANNEL_VIF1, VU1_DMA_CHAN_TIMEOUT); // synchronize immediately. + spacket_chain_open_end(spacket, 0, 0, true); + spacket_vif_nop(spacket, 0); + spacket_vif_nop(spacket, 0); + spacket_chain_close_tag(spacket); + spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true); } u32 VU1::countProgramSize(u32 *t_start, u32 *t_end) diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 3820215..6dff5c8 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -77,7 +77,7 @@ void Ari::onInit() // texRepo->addByMesh("ari/", player.mesh); - engine->audio.playSong(); + // engine->audio.playSong(); } void Ari::initBulb() From 4112e6d3278daf93c73ce668a43f4d97125b7436 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 13:20:18 +0100 Subject: [PATCH 05/15] migrated sendSingleRefList to spacket --- src/engine/include/modules/vu1.hpp | 2 +- src/engine/modules/vu1.cpp | 26 ++++++++++---------------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp index 4773550..2d64961 100644 --- a/src/engine/include/modules/vu1.hpp +++ b/src/engine/include/modules/vu1.hpp @@ -15,8 +15,8 @@ #include #include #include -#include #include +#include #include const u32 VIF_BUFFER_SIZE = 48 * 1024; diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index fb7808d..2153e03 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -52,22 +52,16 @@ void VU1::createList() */ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) { - checkDataAlignment(t_data); - - u8 tempBuffer[32] __attribute__((aligned(16))); - void *chain = (u64 *)&tempBuffer; // uncached - - *((u64 *)chain)++ = DMA_REF_TAG((u32)t_data, t_quadSize); - *((u32 *)chain)++ = VIF_CODE(VIF_STCYL, 0, 0x0101); - *((u32 *)chain)++ = VIF_CODE(VIF_UNPACK_V4_32, t_quadSize, t_destAddress); - - *((u64 *)chain)++ = DMA_END_TAG(0); - *((u32 *)chain)++ = VIF_CODE(VIF_NOP, 0, 0); - *((u32 *)chain)++ = VIF_CODE(VIF_NOP, 0, 0); - - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_VIF1, tempBuffer, 0, DMA_FLAG_TRANSFERTAG, 0); - dma_channel_wait(DMA_CHANNEL_VIF1, VU1_DMA_CHAN_TIMEOUT); + spacket_t *spacket = spacket_create(2, SPACKET_NORMAL); + spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true); + spacket_vif_stcycl(spacket, 0, 0x0101, 0); + spacket_open_unpack(spacket, VIF_UNPACK_V4_32, t_destAddress, 0, 0, 0, 0); + spacket_close_unpack(spacket, t_quadSize); + spacket_chain_close_tag(spacket); + spacket_chain_open_end(spacket, 0, 0, true); + spacket_vif_nop(spacket, 0); + spacket_vif_nop(spacket, 0); + spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true); } /** Add list beginning, set's double buffer if not set */ From 2b42bc53cbf46fbffe562394e09cd2f461a34c04 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 14:45:14 +0100 Subject: [PATCH 06/15] function name change (spacket) --- src/engine/modules/gif_sender.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 1cabe8a..7ca68c4 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -248,9 +248,9 @@ void GifSender::addCurrentCalcs(u32 &t_vertexCount) { for (u32 i = 0; i < t_vertexCount; i++) { - spacket_add_dword(currentPacket, rgbaq[i].rgbaq); - spacket_add_dword(currentPacket, st[i].uv); - spacket_add_dword(currentPacket, xyz[i].xyz); + spacket_add_u64(currentPacket, rgbaq[i].rgbaq); + spacket_add_u64(currentPacket, st[i].uv); + spacket_add_u64(currentPacket, xyz[i].xyz); } spacket_align_to_qw(currentPacket); } From 33d7f9648d74ea92eba6aa8abab564d882ddbae0 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 14:55:41 +0100 Subject: [PATCH 07/15] testing spacket on vu1 --- src/engine/include/modules/vu1.hpp | 7 +- src/engine/modules/vu1.cpp | 105 ++++++++++++++--------------- 2 files changed, 54 insertions(+), 58 deletions(-) diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp index 2d64961..3bb9407 100644 --- a/src/engine/include/modules/vu1.hpp +++ b/src/engine/include/modules/vu1.hpp @@ -60,10 +60,9 @@ private: u8 isDoubleBufferSet; void checkDataAlignment(void *data); VU1BuildList buildList; - char dmaBuffer1[VIF_BUFFER_SIZE] __attribute__((aligned(16))); - char dmaBuffer2[VIF_BUFFER_SIZE] __attribute__((aligned(16))); - void *currentBuffer; - u32 switchBuffer; + spacket_t *spackets[2] __attribute__((aligned(16))); + spacket_t *currPacket; + u8 switchPacket; static u32 countProgramSize(u32 *t_start, u32 *t_end); void checkList(); inline s32 AddUnpack(int format, int addr, int num, int usetops = 0, int nosign = 1, int masking = 0) diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index 2153e03..1aad7a6 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -22,8 +22,10 @@ VU1::VU1() { PRINT_LOG("Initializing VU1"); - currentBuffer = 0; - switchBuffer = 0; + currPacket = 0; + switchPacket = 0; + spackets[0] = spacket_create(3072, SPACKET_NORMAL); + spackets[1] = spacket_create(3072, SPACKET_NORMAL); PRINT_LOG("VU1 initialized!"); } @@ -36,14 +38,15 @@ VU1::~VU1() {} /** Create dynamic list */ void VU1::createList() { - switchBuffer = !switchBuffer; + switchPacket = !switchPacket; memset((char *)&buildList, 0, sizeof(buildList)); - if (switchBuffer) - currentBuffer = (char *)&dmaBuffer1; + if (switchPacket) + currPacket = spackets[0]; else - currentBuffer = (char *)&dmaBuffer2; - buildList.kickBuffer = currentBuffer; + currPacket = spackets[1]; + spacket_reset(currPacket, false); + buildList.kickBuffer = currPacket; } /** Add reference list and send via VIF1 @@ -57,10 +60,10 @@ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) spacket_vif_stcycl(spacket, 0, 0x0101, 0); spacket_open_unpack(spacket, VIF_UNPACK_V4_32, t_destAddress, 0, 0, 0, 0); spacket_close_unpack(spacket, t_quadSize); - spacket_chain_close_tag(spacket); spacket_chain_open_end(spacket, 0, 0, true); spacket_vif_nop(spacket, 0); spacket_vif_nop(spacket, 0); + spacket_chain_close_tag(spacket); spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true); } @@ -77,10 +80,10 @@ void VU1::addListBeginning() buildList.dmaSizeAll += buildList.dmaSize; buildList.dmaSize = 0; - buildList.offset = currentBuffer; - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); // placeholder - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_STCYL, 0, 0x0101); // placeholder - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_UNPACK_V4_32, 0, 0); // placeholder + buildList.offset = currPacket; + spacket_chain_open_cnt(currPacket, 0, 0, 0, true); + spacket_vif_stcycl(currPacket, 0, 0x0101, 0); + spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 0, 0); buildList.isBuilding = 1; } @@ -92,17 +95,9 @@ void VU1::addListEnding() PRINT_ERR("Please add list beginning first. Nothing to end!"); return; } - - while ((buildList.dmaSize & 0xF)) - { - *((u32 *)currentBuffer)++ = 0; - buildList.dmaSize += 4; - } - - *((u64 *)buildList.offset)++ = DMA_CNT_TAG(buildList.dmaSize >> 4); - *((u32 *)buildList.offset)++ = VIF_CODE(VIF_STCYL, 0, 0x0101); - *((u32 *)buildList.offset)++ = AddUnpack(V4_32, 0, buildList.dmaSize >> 4, 1); - + spacket_align_to_qw(currPacket); + spacket_chain_close_tag(currPacket); + spacket_close_unpack(currPacket, ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4); buildList.isBuilding = 0; } @@ -118,10 +113,10 @@ void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) checkDataAlignment(t_data); if (buildList.isBuilding == 1) PRINT_ERR("Please end current list list before adding new one!"); - *((u64 *)currentBuffer)++ = DMA_REF_TAG((u32)t_data, t_size); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_STCYL, 0, 0x0101); - *((u32 *)currentBuffer)++ = - AddUnpack(V4_32, t_useTops == 1 ? buildList.dmaSize >> 4 : t_offset >> 4, t_size, t_useTops); + spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1); + spacket_vif_stcycl(currPacket, 0, 0x0101, 0); + spacket_open_unpack(currPacket, V4_32, 0, t_useTops, 0, 0, 0); + spacket_close_unpack(currPacket, t_useTops ? ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4 : t_offset >> 4); buildList.dmaSize += t_size * 8; buildList.dmaSizeAll += buildList.dmaSize; } @@ -129,45 +124,47 @@ void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) /** Start VU1 program */ void VU1::addStartProgram() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_MSCAL, 0, 0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); - ; + spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); + spacket_vif_mscal(currPacket, 0, 0); + spacket_vif_flush(currPacket, 0); + spacket_chain_close_tag(currPacket); } /** Continue VU1 program from "--cont" line */ void VU1::addContinueProgram() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_MSCAL, 0, 0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); - ; + spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); + spacket_vif_mscnt(currPacket, 0); + spacket_vif_flush(currPacket, 0); + spacket_chain_close_tag(currPacket); } /** Add end tag and send packet via VIF1 */ void VU1::sendList() { - *((u64 *)currentBuffer)++ = DMA_END_TAG(0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); - FlushCache(0); - dma_channel_send_chain(DMA_CHANNEL_VIF1, buildList.kickBuffer, (u32 *)currentBuffer - (u32 *)buildList.kickBuffer, DMA_FLAG_TRANSFERTAG, 0); - dma_channel_wait(DMA_CHANNEL_VIF1, VU1_DMA_CHAN_TIMEOUT); + spacket_chain_open_end(currPacket, 0, 0, 1); + spacket_vif_nop(currPacket, 0); + spacket_vif_nop(currPacket, 0); + spacket_chain_close_tag(currPacket); + printf("QWS:%d\n", spacket_get_qw_count(currPacket)); + spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true); } void VU1::addDoubleBufferSetting() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_BASE, 0, 8); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_OFFSET, 0, 496); + spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); + spacket_vif_base(currPacket, 8, 0); + spacket_vif_offset(currPacket, 496, 0); isDoubleBufferSet = 1; + spacket_chain_close_tag(currPacket); } void VU1::addFlush() { - *((u64 *)currentBuffer)++ = DMA_CNT_TAG(0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_NOP, 0, 0); - *((u32 *)currentBuffer)++ = VIF_CODE(VIF_FLUSH, 0, 0); + spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); + spacket_vif_nop(currPacket, 0); + spacket_vif_flush(currPacket, 0); + spacket_chain_close_tag(currPacket); } void VU1::checkDataAlignment(void *t_data) @@ -183,29 +180,29 @@ void VU1::checkDataAlignment(void *t_data) void VU1::add128(u64 v1, u64 v2) { checkList(); - *((u64 *)currentBuffer)++ = v1; - *((u64 *)currentBuffer)++ = v2; + spacket_add_u64(currPacket, v1); + spacket_add_u64(currPacket, v2); buildList.dmaSize += 16; } void VU1::add64(u64 v) { checkList(); - *((u64 *)currentBuffer)++ = v; + spacket_add_u64(currPacket, v); buildList.dmaSize += 8; } void VU1::add32(u32 v) { checkList(); - *((u32 *)currentBuffer)++ = v; + spacket_add_u32(currPacket, v); buildList.dmaSize += 4; } void VU1::addFloat(float v) { checkList(); - *((float *)currentBuffer)++ = v; + spacket_add_float(currPacket, v); buildList.dmaSize += 4; } @@ -213,8 +210,8 @@ void VU1::checkList() { if (buildList.isBuilding == 0) PRINT_ERR("Please add list beginning before adding data!"); - if (buildList.dmaSizeAll > VIF_BUFFER_SIZE) - PRINT_ERR("Buffer size exceed!"); + // if (buildList.dmaSizeAll > VIF_BUFFER_SIZE) + // PRINT_ERR("Buffer size exceed!"); } // ---- From 8a3485e671c336183318745bbcfd327c77e3a727 Mon Sep 17 00:00:00 2001 From: h4570 Date: Tue, 17 Nov 2020 17:33:30 +0100 Subject: [PATCH 08/15] migrated VU1 into spacket --- src/engine/include/modules/vu1.hpp | 55 +++++--------------------- src/engine/modules/vif_sender.cpp | 6 +-- src/engine/modules/vu1.cpp | 63 +++++++++--------------------- 3 files changed, 31 insertions(+), 93 deletions(-) diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp index 3bb9407..3707f8b 100644 --- a/src/engine/include/modules/vu1.hpp +++ b/src/engine/include/modules/vu1.hpp @@ -19,17 +19,9 @@ #include #include -const u32 VIF_BUFFER_SIZE = 48 * 1024; - -typedef struct VU1BuildList -{ - u8 isBuilding; - void *offset; - void *kickBuffer; - u32 dmaSize; - u32 dmaSizeAll; - u32 dmaDestination; -} VU1BuildList; +#define V4_32 0xC +#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) (u128)(((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM))) +#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0)) /** Class responsible for managing VU1 micro programs */ class VU1 @@ -44,7 +36,7 @@ public: void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize); void addListBeginning(); void continueList(); - void addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops); + void addReferenceList(void *t_data, u32 t_size, u8 t_useTops); void addFloat(float v); void add32(u32 v); void add64(u64 v); @@ -56,43 +48,14 @@ public: void addDoubleBufferSetting(); void addFlush(); -private: - u8 isDoubleBufferSet; - void checkDataAlignment(void *data); - VU1BuildList buildList; - spacket_t *spackets[2] __attribute__((aligned(16))); spacket_t *currPacket; + +private: + u32 qwordsInsertedToVU1; + u8 isDoubleBufferSet, isBuilding; + spacket_t *spackets[2] __attribute__((aligned(16))); u8 switchPacket; static u32 countProgramSize(u32 *t_start, u32 *t_end); - void checkList(); - inline s32 AddUnpack(int format, int addr, int num, int usetops = 0, int nosign = 1, int masking = 0) - { - return (s32)((0x60 << 24) + (format << 24) + (masking << 28) + (usetops << 15) + - (nosign << 14) + (num << 16) + addr); - } }; -#define DMA_REF_TAG(ADDR, COUNT) ((((unsigned long)ADDR) << 32) | (0x3 << 28) | COUNT) -#define DMA_CNT_TAG(COUNT) (((unsigned long)(0x1) << 28) | COUNT) -#define DMA_END_TAG(COUNT) (((unsigned long)(0x7) << 28) | COUNT) -#define VIF_NOP 0x00 -#define VIF_STCYL 0x01 -#define VIF_OFFSET 0x02 -#define VIF_BASE 0x03 -#define VIF_FLUSH 0x11 -#define VIF_MSCAL 0x14 -#define VIF_MSCNT 0x17 -#define VIF_MPG 0x4A -#define V4_32 0xC -#define VIF_UNPACK 0x60 -#define U128(n) ((u128)(n)) -#define VIF_UNPACK_V4_32 (VIF_UNPACK | V4_32) -#define VIF_CODE(CMD, NUM, IMMEDIATE) ((((unsigned int)(CMD)) << 24) | \ - (((unsigned int)(NUM)) << 16) | \ - ((unsigned int)(IMMEDIATE))) -#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) U128((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM)) -#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0)) -#define VU1_DMA_CHAN_TIMEOUT -1 -#define GS_GIFTAG_PACKED 0 - #endif diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 929808a..67e6772 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -130,7 +130,7 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR t_prim->mapping_type, 0, // context t_prim->colorfix), - GS_GIFTAG_PACKED, + 0, // GIFTAG_PACKED 3), // STQ + RGBA + XYZ DRAW_R_STQ_REGLIST); @@ -180,7 +180,7 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR //// Clipping tests end vu1.addListEnding(); - vu1.addReferenceList(0, t_vertices + t_start, 2 * vertCount, 1); - vu1.addReferenceList(0, t_coordinates + t_start, 2 * vertCount, 1); + vu1.addReferenceList(t_vertices + t_start, 2 * vertCount, 1); + vu1.addReferenceList(t_coordinates + t_start, 2 * vertCount, 1); vu1.addStartProgram(); } diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp index 1aad7a6..1254065 100644 --- a/src/engine/modules/vu1.cpp +++ b/src/engine/modules/vu1.cpp @@ -39,14 +39,12 @@ VU1::~VU1() {} void VU1::createList() { switchPacket = !switchPacket; - memset((char *)&buildList, 0, sizeof(buildList)); - + qwordsInsertedToVU1 = 0; if (switchPacket) currPacket = spackets[0]; else currPacket = spackets[1]; spacket_reset(currPacket, false); - buildList.kickBuffer = currPacket; } /** Add reference list and send via VIF1 @@ -58,7 +56,7 @@ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) spacket_t *spacket = spacket_create(2, SPACKET_NORMAL); spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true); spacket_vif_stcycl(spacket, 0, 0x0101, 0); - spacket_open_unpack(spacket, VIF_UNPACK_V4_32, t_destAddress, 0, 0, 0, 0); + spacket_open_unpack(spacket, V4_32, t_destAddress, 0, 0, 0, 0); spacket_close_unpack(spacket, t_quadSize); spacket_chain_open_end(spacket, 0, 0, true); spacket_vif_nop(spacket, 0); @@ -70,7 +68,7 @@ void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) /** Add list beginning, set's double buffer if not set */ void VU1::addListBeginning() { - if (buildList.isBuilding == 1) + if (isBuilding) PRINT_ERR("Please end current list list before adding new one!"); if (isDoubleBufferSet == 0) @@ -78,47 +76,43 @@ void VU1::addListBeginning() else addFlush(); - buildList.dmaSizeAll += buildList.dmaSize; - buildList.dmaSize = 0; - buildList.offset = currPacket; + qwordsInsertedToVU1 = 0; spacket_chain_open_cnt(currPacket, 0, 0, 0, true); spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 0, 0); - buildList.isBuilding = 1; + spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 1, 0); + isBuilding = true; } /** Add list ending and fix unpack size */ void VU1::addListEnding() { - if (buildList.isBuilding == 0) + if (!isBuilding) { PRINT_ERR("Please add list beginning first. Nothing to end!"); return; } spacket_align_to_qw(currPacket); spacket_chain_close_tag(currPacket); - spacket_close_unpack(currPacket, ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4); - buildList.isBuilding = 0; + spacket_close_unpack(currPacket, qwordsInsertedToVU1 >> 4); + isBuilding = 0; } /** Add list which will load data from given pointer * A lot faster than standard list. - * @param offset offset before data in quadwords + * @param offset offset before data in quadwords. * @param data data pointer * @param size in quadwords * @param useTops when true, data will be loaded at the beginning of buffer (BASE+OFFSET) */ -void VU1::addReferenceList(u32 t_offset, void *t_data, u32 t_size, u8 t_useTops) +void VU1::addReferenceList(void *t_data, u32 t_size, u8 t_useTops) { - checkDataAlignment(t_data); - if (buildList.isBuilding == 1) + if (isBuilding) PRINT_ERR("Please end current list list before adding new one!"); spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1); spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, 0, t_useTops, 0, 0, 0); - spacket_close_unpack(currPacket, t_useTops ? ((u32)currPacket->next - (u32)currPacket->unpackOpenedAt) >> 4 : t_offset >> 4); - buildList.dmaSize += t_size * 8; - buildList.dmaSizeAll += buildList.dmaSize; + spacket_open_unpack(currPacket, V4_32, qwordsInsertedToVU1 >> 4, t_useTops, 0, 1, 0); + spacket_close_unpack(currPacket, t_size); + qwordsInsertedToVU1 += t_size * 8; } /** Start VU1 program */ @@ -146,7 +140,6 @@ void VU1::sendList() spacket_vif_nop(currPacket, 0); spacket_vif_nop(currPacket, 0); spacket_chain_close_tag(currPacket); - printf("QWS:%d\n", spacket_get_qw_count(currPacket)); spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true); } @@ -167,51 +160,33 @@ void VU1::addFlush() spacket_chain_close_tag(currPacket); } -void VU1::checkDataAlignment(void *t_data) -{ - if (((u32)t_data & 0xF)) - PRINT_ERR("data is not 16 byte aligned!"); -} - // ---- // List adding // ---- void VU1::add128(u64 v1, u64 v2) { - checkList(); spacket_add_u64(currPacket, v1); spacket_add_u64(currPacket, v2); - buildList.dmaSize += 16; + qwordsInsertedToVU1 += 16; } void VU1::add64(u64 v) { - checkList(); spacket_add_u64(currPacket, v); - buildList.dmaSize += 8; + qwordsInsertedToVU1 += 8; } void VU1::add32(u32 v) { - checkList(); spacket_add_u32(currPacket, v); - buildList.dmaSize += 4; + qwordsInsertedToVU1 += 4; } void VU1::addFloat(float v) { - checkList(); spacket_add_float(currPacket, v); - buildList.dmaSize += 4; -} - -void VU1::checkList() -{ - if (buildList.isBuilding == 0) - PRINT_ERR("Please add list beginning before adding data!"); - // if (buildList.dmaSizeAll > VIF_BUFFER_SIZE) - // PRINT_ERR("Buffer size exceed!"); + qwordsInsertedToVU1 += 4; } // ---- From 6b821afd869249475e64114e126d5a114f7c453f Mon Sep 17 00:00:00 2001 From: h4570 Date: Thu, 19 Nov 2020 19:59:24 +0100 Subject: [PATCH 09/15] fixes to match latest libpacket2 commit --- src/engine/engine.cpp | 8 +- src/engine/include/modules/gif_sender.hpp | 6 +- src/engine/include/modules/renderer.hpp | 4 +- src/engine/include/modules/vif_sender.hpp | 12 +- src/engine/include/modules/vu1.hpp | 61 ------ src/engine/modules/gif_sender.cpp | 89 +++++---- src/engine/modules/renderer.cpp | 21 +- src/engine/modules/vif_sender.cpp | 129 ++++++------ src/engine/modules/vu1.cpp | 226 ---------------------- src/samples/ari/Makefile | 3 +- src/samples/ari/ari.cpp | 22 +-- src/samples/ari/objects/player.cpp | 20 +- src/samples/floors/Makefile | 3 +- 13 files changed, 152 insertions(+), 452 deletions(-) delete mode 100644 src/engine/include/modules/vu1.hpp delete mode 100644 src/engine/modules/vu1.cpp diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index 15fbd94..e5fddc0 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -15,8 +15,8 @@ #include #include #include - -#include "include/modules/vu1.hpp" +#include +#include #include "include/utils/debug.hpp" // VU1 micro program @@ -84,7 +84,9 @@ void Engine::firePS2() { SifInitRpc(0); srand(time(NULL)); - VU1::uploadProgram(0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd); + dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); + dma_channel_fast_waits(DMA_CHANNEL_VIF1); + vu_upload_program(0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd, DMA_CHANNEL_VIF1); fileService.startThread(); audio.startThread(&fileService); isInitialized = 0; diff --git a/src/engine/include/modules/gif_sender.hpp b/src/engine/include/modules/gif_sender.hpp index 7df673e..4a0ac37 100644 --- a/src/engine/include/modules/gif_sender.hpp +++ b/src/engine/include/modules/gif_sender.hpp @@ -16,7 +16,7 @@ #include #include #include -#include +#include #include "../models/mesh.hpp" #include "../models/math/matrix.hpp" #include "../models/screen_settings.hpp" @@ -45,8 +45,8 @@ private: texel_t *st; u8 isAnyObjectAdded; ScreenSettings *screen; - spacket_t *packets[2]; - spacket_t *currentPacket; + packet2_t *packets[2]; + packet2_t *currentPacket; u8 packetsCount; int packetSize; float halfScreenW, halfScreenH; diff --git a/src/engine/include/modules/renderer.hpp b/src/engine/include/modules/renderer.hpp index e7b62e7..b6332f7 100644 --- a/src/engine/include/modules/renderer.hpp +++ b/src/engine/include/modules/renderer.hpp @@ -13,7 +13,7 @@ #include #include -#include +#include #include "gif_sender.hpp" #include "vif_sender.hpp" #include "../models/math/plane.hpp" @@ -118,7 +118,7 @@ private: TextureRepository textureRepo; GifSender *gifSender; VifSender *vifSender; - spacket_t *flipPacket; + packet2_t *flipPacket; void allocateBuffers(float t_screenW, float t_screenH); void initDrawingEnv(float t_screenW, float t_screenH); void setPrim(); diff --git a/src/engine/include/modules/vif_sender.hpp b/src/engine/include/modules/vif_sender.hpp index bb765c9..9924a1b 100644 --- a/src/engine/include/modules/vif_sender.hpp +++ b/src/engine/include/modules/vif_sender.hpp @@ -12,12 +12,12 @@ #define _TYRA_VIF_SENDER_ #include +#include #include "../models/render_data.hpp" #include "../models/light_bulb.hpp" #include "../models/mesh.hpp" #include "../models/math/matrix.hpp" #include "../models/math/vector3.hpp" -#include "vu1.hpp" /** Class responsible for sending 3D objects via VIF (PATH 1) */ class VifSender @@ -28,12 +28,16 @@ public: ~VifSender(); // TODO refactor - void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, const Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer); + void drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer); void sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation); private: - void drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer); - VU1 vu1; // TODO + void setDoubleBuffer(); + void drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer); + packet2_t *packets[2] __attribute__((aligned(64))); + packet2_t *currPacket; + u8 context; + packet2_t *matricesPacket __attribute__((aligned(64))); MATRIX localWorld, localScreen; VECTOR position, rotation; u32 vertCount; diff --git a/src/engine/include/modules/vu1.hpp b/src/engine/include/modules/vu1.hpp deleted file mode 100644 index 3707f8b..0000000 --- a/src/engine/include/modules/vu1.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/* -# ______ ____ ___ -# | \/ ____| |___| -# | | | \ | | -#----------------------------------------------------------------------- -# Copyright 2020, tyra - https://github.com/h4570/tyra -# Licenced under Apache License 2.0 -# Sandro Sobczyński -*/ - -#ifndef _TYRA_VU1_ -#define _TYRA_VU1_ - -#include "../models/math/matrix.hpp" -#include -#include -#include -#include -#include -#include - -#define V4_32 0xC -#define GS_PRIM(PRIM, IIP, TME, FGE, ABE, AA1, FST, CTXT, FIX) (u128)(((FIX << 10) | (CTXT << 9) | (FST << 8) | (AA1 << 7) | (ABE << 6) | (FGE << 5) | (TME << 4) | (IIP << 3) | (PRIM))) -#define GS_GIFTAG(NLOOP, EOP, PRE, PRIM, FLG, NREG) (((u64)(NREG) << 60) | ((u64)(FLG) << 58) | ((u64)(PRIM) << 47) | ((u64)(PRE) << 46) | (EOP << 15) | (NLOOP << 0)) - -/** Class responsible for managing VU1 micro programs */ -class VU1 -{ - -public: - VU1(); - ~VU1(); - - static void uploadProgram(int t_dest, u32 *t_start, u32 *t_end); - void createList(); - void sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize); - void addListBeginning(); - void continueList(); - void addReferenceList(void *t_data, u32 t_size, u8 t_useTops); - void addFloat(float v); - void add32(u32 v); - void add64(u64 v); - void add128(u64 v1, u64 v2); - void addListEnding(); - void addStartProgram(); - void addContinueProgram(); - void sendList(); - void addDoubleBufferSetting(); - void addFlush(); - - spacket_t *currPacket; - -private: - u32 qwordsInsertedToVU1; - u8 isDoubleBufferSet, isBuilding; - spacket_t *spackets[2] __attribute__((aligned(16))); - u8 switchPacket; - static u32 countProgramSize(u32 *t_start, u32 *t_end); -}; - -#endif diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 7ca68c4..785c183 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -32,16 +32,16 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre { PRINT_LOG("Initializing GifSender"); packetSize = t_packetSize; - packets[0] = spacket_create(t_packetSize, SPACKET_NORMAL); - packets[1] = spacket_create(t_packetSize, SPACKET_NORMAL); + packets[0] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false); + packets[1] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false); PRINT_LOG("GifSender initialized!"); } /** Releases packets memory */ GifSender::~GifSender() { - spacket_free(packets[0]); - spacket_free(packets[1]); + packet2_free(packets[0]); + packet2_free(packets[1]); } // ---- @@ -54,38 +54,40 @@ GifSender::~GifSender() /** Send texture via GIF */ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) { - spacket_t *spacket = spacket_create(15, SPACKET_NORMAL); - spacket_update( - spacket, + packet2_t *packet2 = packet2_create_chain(15, P2_TYPE_NORMAL, false); + packet2_update( + packet2, draw_texture_transfer( - spacket->base, + packet2->base, texture.getData(), texture.getWidth(), texture.getHeight(), GS_PSM_24, t_texBuffer->address, t_texBuffer->width)); - spacket_chain_open_cnt(spacket, 0, 0, 0, false); - spacket_update(spacket, draw_texture_wrapping(spacket->next, 0, texture.getWrapSettings())); - spacket_chain_close_tag(spacket); - spacket_update(spacket, draw_texture_flush(spacket->next)); - spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false); - spacket_free(spacket); + packet2_chain_open_cnt(packet2, 0, 0, 0); + packet2_update(packet2, draw_texture_wrapping(packet2->next, 0, texture.getWrapSettings())); + packet2_chain_close_tag(packet2); + packet2_update(packet2, draw_texture_flush(packet2->next)); + dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true); + dma_channel_wait(DMA_CHANNEL_GIF, 0); + packet2_free(packet2); } void GifSender::sendClear(zbuffer_t *t_zBuffer) { - spacket_t *spacket = spacket_create(36, SPACKET_NORMAL); - spacket_chain_open_end(spacket, 0, 0, false); - spacket_update(spacket, draw_disable_tests(spacket->next, 0, t_zBuffer)); - spacket_update(spacket, draw_clear(spacket->next, 0, + packet2_t *packet2 = packet2_create_chain(36, P2_TYPE_NORMAL, false); + packet2_chain_open_end(packet2, 0, 0); + packet2_update(packet2, draw_disable_tests(packet2->next, 0, t_zBuffer)); + packet2_update(packet2, draw_clear(packet2->next, 0, 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), screen->width, screen->height, 0x10, 0x10, 0x10)); - spacket_update(spacket, draw_enable_tests(spacket->next, 0, t_zBuffer)); - spacket_update(spacket, draw_finish(spacket->next)); - spacket_chain_close_tag(spacket); - spacket_send_chain(spacket, DMA_CHANNEL_GIF, true, true, false); - spacket_free(spacket); + packet2_update(packet2, draw_enable_tests(packet2->next, 0, t_zBuffer)); + packet2_update(packet2, draw_finish(packet2->next)); + packet2_chain_close_tag(packet2); + dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true); + dma_channel_wait(DMA_CHANNEL_GIF, 0); + packet2_free(packet2); } /** Used in game loop. @@ -94,7 +96,7 @@ void GifSender::sendClear(zbuffer_t *t_zBuffer) void GifSender::initPacket(u8 t_context) { currentPacket = packets[t_context]; - spacket_reset(currentPacket, false); + packet2_reset(currentPacket, false); isAnyObjectAdded = false; } @@ -103,24 +105,25 @@ void GifSender::sendPacket() { if (isAnyObjectAdded) { - spacket_chain_open_end(currentPacket, 0, 0, false); - spacket_update(currentPacket, draw_finish(currentPacket->next)); - spacket_chain_close_tag(currentPacket); + packet2_chain_open_end(currentPacket, 0, 0); + packet2_update(currentPacket, draw_finish(currentPacket->next)); + packet2_chain_close_tag(currentPacket); } - spacket_send_chain(currentPacket, DMA_CHANNEL_GIF, true, true, false); + dma_channel_send_packet2(currentPacket, DMA_CHANNEL_GIF, true); + dma_channel_wait(DMA_CHANNEL_GIF, 0); } /** Adds clear screen to current packet */ void GifSender::addClear(zbuffer_t *t_zBuffer) { - spacket_chain_open_cnt(currentPacket, 0, 0, 0, false); - spacket_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer)); - spacket_update(currentPacket, draw_clear(currentPacket->next, 0, + packet2_chain_open_cnt(currentPacket, 0, 0, 0); + packet2_update(currentPacket, draw_disable_tests(currentPacket->next, 0, t_zBuffer)); + packet2_update(currentPacket, draw_clear(currentPacket->next, 0, 2048.0F - (screen->width / 2), 2048.0F - (screen->height / 2), screen->width, screen->height, 0x10, 0x10, 0x10)); - spacket_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer)); - spacket_chain_close_tag(currentPacket); + packet2_update(currentPacket, draw_enable_tests(currentPacket->next, 0, t_zBuffer)); + packet2_chain_close_tag(currentPacket); } /** Adds 3D objects to current packet @@ -131,10 +134,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) { - spacket_chain_open_cnt(currentPacket, 0, 0, 0, false); - spacket_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); - spacket_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); - spacket_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); + packet2_chain_open_cnt(currentPacket, 0, 0, 0); + packet2_update(currentPacket, draw_texture_sampling(currentPacket->next, 0, &t_mesh.lod)); + packet2_update(currentPacket, draw_texturebuffer(currentPacket->next, 0, textureBuffer, &t_mesh.clut)); + packet2_update(currentPacket, draw_prim_start(currentPacket->next, 0, t_renderData->prim, &t_mesh.color)); xyz = new xyz_t[vertexCount]; rgbaq = new color_t[vertexCount]; st = new texel_t[vertexCount]; @@ -143,8 +146,8 @@ void GifSender::addObject(RenderData *t_renderData, Mesh &t_mesh, u32 vertexCoun delete[] xyz; delete[] rgbaq; delete[] st; - spacket_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST)); - spacket_chain_close_tag(currentPacket); + packet2_update(currentPacket, draw_prim_end(currentPacket->next, 3, DRAW_STQ_REGLIST)); + packet2_chain_close_tag(currentPacket); } /** Calculates 3D object data into xyz, rgbq, st @@ -248,9 +251,9 @@ void GifSender::addCurrentCalcs(u32 &t_vertexCount) { for (u32 i = 0; i < t_vertexCount; i++) { - spacket_add_u64(currentPacket, rgbaq[i].rgbaq); - spacket_add_u64(currentPacket, st[i].uv); - spacket_add_u64(currentPacket, xyz[i].xyz); + packet2_add_u64(currentPacket, rgbaq[i].rgbaq); + packet2_add_u64(currentPacket, st[i].uv); + packet2_add_u64(currentPacket, xyz[i].xyz); } - spacket_align_to_qw(currentPacket); + packet2_align_to_qword(currentPacket); } diff --git a/src/engine/modules/renderer.cpp b/src/engine/modules/renderer.cpp index 72e30ff..2c38304 100644 --- a/src/engine/modules/renderer.cpp +++ b/src/engine/modules/renderer.cpp @@ -40,7 +40,7 @@ Renderer::Renderer(u32 t_packetSize, ScreenSettings *t_screen) isVSyncEnabled = true; isFrameEmpty = false; lastTextureId = 0; - flipPacket = spacket_create(4, SPACKET_UNCACHED_ACCL); + flipPacket = packet2_create_normal(4, P2_TYPE_UNCACHED_ACCL); allocateBuffers(t_screen->width, t_screen->height); initDrawingEnv(t_screen->width, t_screen->height); setPrim(); @@ -106,12 +106,13 @@ void Renderer::initDrawingEnv(float t_screenW, float t_screenH) PRINT_LOG("Initializing drawing environment"); u16 halfW = (u16)t_screenW / 2; u16 halfH = (u16)t_screenH / 2; - spacket_t *spacket = spacket_create(20, SPACKET_NORMAL); - spacket_update(spacket, draw_setup_environment(spacket->base, 0, frameBuffers, &(zBuffer))); - spacket_update(spacket, draw_primitive_xyoffset(spacket->next, 0, (2048 - halfW), (2048 - halfH))); - spacket_update(spacket, draw_finish(spacket->next)); - spacket_send(spacket, DMA_CHANNEL_GIF, true); - spacket_free(spacket); + packet2_t *packet2 = packet2_create_normal(20, P2_TYPE_NORMAL); + packet2_update(packet2, draw_setup_environment(packet2->base, 0, frameBuffers, &(zBuffer))); + packet2_update(packet2, draw_primitive_xyoffset(packet2->next, 0, (2048 - halfW), (2048 - halfH))); + packet2_update(packet2, draw_finish(packet2->next)); + dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true); + dma_channel_wait(DMA_CHANNEL_GIF, 0); + packet2_free(packet2); PRINT_LOG("Drawing environment initialized!"); } @@ -274,8 +275,8 @@ void Renderer::flipBuffers() 0); context ^= 1; isFrameEmpty = 1; - spacket_update(flipPacket, draw_framebuffer(flipPacket->base, 0, &frameBuffers[context])); - spacket_update(flipPacket, draw_finish(flipPacket->next)); - spacket_send(flipPacket, DMA_CHANNEL_GIF, false); + packet2_update(flipPacket, draw_framebuffer(flipPacket->base, 0, &frameBuffers[context])); + packet2_update(flipPacket, draw_finish(flipPacket->next)); + dma_channel_send_packet2(flipPacket, DMA_CHANNEL_GIF, true); draw_wait_finish(); } diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 67e6772..70bd1b8 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -16,10 +16,9 @@ #include "../include/utils/math.hpp" #include "../include/utils/debug.hpp" -// Similiar set is in PS2SDK, but for VU1 we have to switch ST with RGBAQ, because VU1 must know Q before sending RGBAQ -#define DRAW_R_STQ_REGLIST ((u64)GIF_REG_ST) << 0 | ((u64)GIF_REG_RGBAQ) << 4 | ((u64)GIF_REG_XYZ2) << 8 const u32 VU1_PACKAGE_VERTS_PER_BUFF = 96; // Remember to modify buffer size in vu1 also const u32 VU1_PACKAGES_PER_PACKET = 6; +const u32 VU1_PACKET_SIZE = 128; // ---- // Constructors/Destructors @@ -29,12 +28,19 @@ VifSender::VifSender() { PRINT_LOG("Initializing VifSender"); PRINT_LOG("VifSender initialized!"); - - dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); - dma_channel_fast_waits(DMA_CHANNEL_VIF1); + packets[0] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true); + packets[1] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true); + matricesPacket = packet2_create_chain(4, P2_TYPE_NORMAL, true); + context = 0; + setDoubleBuffer(); } -VifSender::~VifSender() {} +VifSender::~VifSender() +{ + packet2_free(packets[0]); + packet2_free(packets[1]); + packet2_free(matricesPacket); +} // ---- // Methods @@ -46,15 +52,21 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po vec3ToNative(rotation, t_rotation, 1.0F); create_local_world(localWorld, position, rotation); create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data); - vu1.sendSingleRefList(0, &localScreen, 8); + packet2_reset(matricesPacket, false); + vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); + vu_add_end_tag(matricesPacket); + dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1); + dma_channel_wait(DMA_CHANNEL_VIF1, 0); } -void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, const Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) +void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) { // we have to split 3D object into small parts, because of small memory of VU1 + for (u32 i = 0; i < vertCount2;) { - vu1.createList(); + currPacket = packets[context]; + packet2_reset(currPacket, false); for (u8 j = 0; j < VU1_PACKAGES_PER_PACKET; j++) // how many "packages" per one packet { if (i != 0) // we have to go back to avoid the visual artifacts @@ -70,72 +82,40 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver i += (VU1_PACKAGE_VERTS_PER_BUFF - 1); i++; } - vu1.sendList(); + vu_add_end_tag(currPacket); + dma_channel_wait(DMA_CHANNEL_VIF1, 0); + dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1); + context = !context; } } +void VifSender::setDoubleBuffer() +{ + packet2_t *settings = packet2_create_chain(2, P2_TYPE_NORMAL, true); + vu_add_double_buffer_settings(settings, 8, 496); + vu_add_end_tag(settings); + dma_channel_send_packet2(settings, DMA_CHANNEL_VIF1, 1); + dma_channel_wait(DMA_CHANNEL_VIF1, 0); + packet2_free(settings); +} + /** Draw using PATH1 */ -void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer) +void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer) { const u32 vertCount = t_end - t_start; - vu1.addListBeginning(); - + vu_open_unpack(currPacket); // TODO get this via screensettings - vu1.addFloat(2048.0F); // scale - vu1.addFloat(2048.0F); // scale - vu1.addFloat(((float)0xFFFFFF) / 32.0F); // scale - vu1.add32(vertCount); // vertex count - - vu1.add128(GIF_SET_TAG(1, 0, 0, 0, GIF_FLG_PACKED, 1), GIF_REG_AD); // 1x set tag - - vu1.add128( // tex -> lod - GS_SET_TEX1( - t_mesh.lod.calculation, - t_mesh.lod.max_level, - t_mesh.lod.mag_filter, - t_mesh.lod.min_filter, - t_mesh.lod.mipmap_select, - t_mesh.lod.l, - (int)(t_mesh.lod.k * 16.0F)), - GS_REG_TEX1); - - vu1.add128( // tex -> buff + clut - GS_SET_TEX0( - textureBuffer->address >> 6, - textureBuffer->width >> 6, - textureBuffer->psm, - textureBuffer->info.width, - textureBuffer->info.height, - textureBuffer->info.components, - textureBuffer->info.function, - t_mesh.clut.address >> 6, - t_mesh.clut.psm, - t_mesh.clut.storage_mode, - t_mesh.clut.start, - t_mesh.clut.load_method), - GS_REG_TEX0); - - vu1.add128( - GS_GIFTAG( - vertCount, // amount of loops - 1, - 1, - GS_PRIM( - t_prim->type, - t_prim->shading, - t_prim->mapping, - t_prim->fogging, - t_prim->blending, - t_prim->antialiasing, - t_prim->mapping_type, - 0, // context - t_prim->colorfix), - 0, // GIFTAG_PACKED - 3), // STQ + RGBA + XYZ - DRAW_R_STQ_REGLIST); + vu_unpack_add_float(currPacket, 2048.0F); // scale + vu_unpack_add_float(currPacket, 2048.0F); // scale + vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale + vu_unpack_add_u32(currPacket, vertCount); // vertex count + vu_unpack_add_set(currPacket, 1); + vu_unpack_add_lod(currPacket, &t_mesh.lod); + vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut); + vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); for (u8 j = 0; j < 4; j++) - vu1.add32(128); + vu_unpack_add_u32(currPacket, 128); //// Clipping tests start @@ -172,15 +152,14 @@ void VifSender::drawVertices(const Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR // // vu1.addFloat(1.0F); // // vu1.addFloat(500.0F); // far - vu1.addFloat(0.0F); - vu1.addFloat(0.0F); - vu1.addFloat(0.0F); - vu1.addFloat(0.0F); + vu_unpack_add_float(currPacket, 0.0F); + vu_unpack_add_float(currPacket, 0.0F); + vu_unpack_add_float(currPacket, 0.0F); + vu_unpack_add_float(currPacket, 0.0F); //// Clipping tests end - - vu1.addListEnding(); - vu1.addReferenceList(t_vertices + t_start, 2 * vertCount, 1); - vu1.addReferenceList(t_coordinates + t_start, 2 * vertCount, 1); - vu1.addStartProgram(); + vu_close_unpack(currPacket); + vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1); + vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1); + vu_add_start_program(currPacket, 0); } diff --git a/src/engine/modules/vu1.cpp b/src/engine/modules/vu1.cpp deleted file mode 100644 index 1254065..0000000 --- a/src/engine/modules/vu1.cpp +++ /dev/null @@ -1,226 +0,0 @@ -/* -# ______ ____ ___ -# | \/ ____| |___| -# | | | \ | | -#----------------------------------------------------------------------- -# Copyright 2020, tyra - https://github.com/h4570/tyra -# Licenced under Apache License 2.0 -# Sandro Sobczyński -*/ - -#include "../include/modules/vu1.hpp" - -#include "../include/utils/debug.hpp" -#include -#include -#include - -// ---- -// Constructors/Destructors -// ---- - -VU1::VU1() -{ - PRINT_LOG("Initializing VU1"); - currPacket = 0; - switchPacket = 0; - spackets[0] = spacket_create(3072, SPACKET_NORMAL); - spackets[1] = spacket_create(3072, SPACKET_NORMAL); - PRINT_LOG("VU1 initialized!"); -} - -VU1::~VU1() {} - -// ---- -// Methods -// - - -/** Create dynamic list */ -void VU1::createList() -{ - switchPacket = !switchPacket; - qwordsInsertedToVU1 = 0; - if (switchPacket) - currPacket = spackets[0]; - else - currPacket = spackets[1]; - spacket_reset(currPacket, false); -} - -/** Add reference list and send via VIF1 - * Not using TOPS register - * Similar to addReferenceList() - */ -void VU1::sendSingleRefList(int t_destAddress, void *t_data, int t_quadSize) -{ - spacket_t *spacket = spacket_create(2, SPACKET_NORMAL); - spacket_ref(spacket, t_data, t_quadSize, 0, 0, 0, true); - spacket_vif_stcycl(spacket, 0, 0x0101, 0); - spacket_open_unpack(spacket, V4_32, t_destAddress, 0, 0, 0, 0); - spacket_close_unpack(spacket, t_quadSize); - spacket_chain_open_end(spacket, 0, 0, true); - spacket_vif_nop(spacket, 0); - spacket_vif_nop(spacket, 0); - spacket_chain_close_tag(spacket); - spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true); -} - -/** Add list beginning, set's double buffer if not set */ -void VU1::addListBeginning() -{ - if (isBuilding) - PRINT_ERR("Please end current list list before adding new one!"); - - if (isDoubleBufferSet == 0) - addDoubleBufferSetting(); - else - addFlush(); - - qwordsInsertedToVU1 = 0; - spacket_chain_open_cnt(currPacket, 0, 0, 0, true); - spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, 0, 1, 0, 1, 0); - isBuilding = true; -} - -/** Add list ending and fix unpack size */ -void VU1::addListEnding() -{ - if (!isBuilding) - { - PRINT_ERR("Please add list beginning first. Nothing to end!"); - return; - } - spacket_align_to_qw(currPacket); - spacket_chain_close_tag(currPacket); - spacket_close_unpack(currPacket, qwordsInsertedToVU1 >> 4); - isBuilding = 0; -} - -/** Add list which will load data from given pointer - * A lot faster than standard list. - * @param offset offset before data in quadwords. - * @param data data pointer - * @param size in quadwords - * @param useTops when true, data will be loaded at the beginning of buffer (BASE+OFFSET) - */ -void VU1::addReferenceList(void *t_data, u32 t_size, u8 t_useTops) -{ - if (isBuilding) - PRINT_ERR("Please end current list list before adding new one!"); - spacket_ref(currPacket, t_data, t_size, 0, 0, 0, 1); - spacket_vif_stcycl(currPacket, 0, 0x0101, 0); - spacket_open_unpack(currPacket, V4_32, qwordsInsertedToVU1 >> 4, t_useTops, 0, 1, 0); - spacket_close_unpack(currPacket, t_size); - qwordsInsertedToVU1 += t_size * 8; -} - -/** Start VU1 program */ -void VU1::addStartProgram() -{ - spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); - spacket_vif_mscal(currPacket, 0, 0); - spacket_vif_flush(currPacket, 0); - spacket_chain_close_tag(currPacket); -} - -/** Continue VU1 program from "--cont" line */ -void VU1::addContinueProgram() -{ - spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); - spacket_vif_mscnt(currPacket, 0); - spacket_vif_flush(currPacket, 0); - spacket_chain_close_tag(currPacket); -} - -/** Add end tag and send packet via VIF1 */ -void VU1::sendList() -{ - spacket_chain_open_end(currPacket, 0, 0, 1); - spacket_vif_nop(currPacket, 0); - spacket_vif_nop(currPacket, 0); - spacket_chain_close_tag(currPacket); - spacket_send_chain(currPacket, DMA_CHANNEL_VIF1, true, true, true); -} - -void VU1::addDoubleBufferSetting() -{ - spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); - spacket_vif_base(currPacket, 8, 0); - spacket_vif_offset(currPacket, 496, 0); - isDoubleBufferSet = 1; - spacket_chain_close_tag(currPacket); -} - -void VU1::addFlush() -{ - spacket_chain_open_cnt(currPacket, 0, 0, 0, 1); - spacket_vif_nop(currPacket, 0); - spacket_vif_flush(currPacket, 0); - spacket_chain_close_tag(currPacket); -} - -// ---- -// List adding -// ---- - -void VU1::add128(u64 v1, u64 v2) -{ - spacket_add_u64(currPacket, v1); - spacket_add_u64(currPacket, v2); - qwordsInsertedToVU1 += 16; -} - -void VU1::add64(u64 v) -{ - spacket_add_u64(currPacket, v); - qwordsInsertedToVU1 += 8; -} - -void VU1::add32(u32 v) -{ - spacket_add_u32(currPacket, v); - qwordsInsertedToVU1 += 4; -} - -void VU1::addFloat(float v) -{ - spacket_add_float(currPacket, v); - qwordsInsertedToVU1 += 4; -} - -// ---- -// Static -// ---- - -/** TODO */ -void VU1::uploadProgram(int t_dest, u32 *t_start, u32 *t_end) -{ - // get the size of the code as we can only send 256 instructions in each MPGtag - int count = VU1::countProgramSize(t_start, t_end); - spacket_t *spacket = spacket_create(20, SPACKET_NORMAL); - - while (count > 0) - { - u32 currentCount = count > 256 ? 256 : count; - spacket_ref(spacket, t_start, currentCount / 2, 0, 0, 0, 1); - spacket_vif_nop(spacket, 0); - spacket_vif_mpg(spacket, currentCount & 0xFF, t_dest, 0); - t_start += currentCount * 2; - count -= currentCount; - t_dest += currentCount; - } - spacket_chain_open_end(spacket, 0, 0, true); - spacket_vif_nop(spacket, 0); - spacket_vif_nop(spacket, 0); - spacket_chain_close_tag(spacket); - spacket_send_chain(spacket, DMA_CHANNEL_VIF1, true, true, true); -} - -u32 VU1::countProgramSize(u32 *t_start, u32 *t_end) -{ - u32 size = (t_end - t_start) / 2; - if (size & 1) - size++; - return size; -} diff --git a/src/samples/ari/Makefile b/src/samples/ari/Makefile index bd60f13..ffdc4aa 100644 --- a/src/samples/ari/Makefile +++ b/src/samples/ari/Makefile @@ -19,7 +19,6 @@ EE_OBJS = \ ../../engine/modules/texture_repository.o \ ../../engine/modules/timer.o \ ../../engine/modules/vif_sender.o \ - ../../engine/modules/vu1.o \ ../../engine/utils/math.o \ ../../engine/utils/string.o \ ../../engine/loaders/bmp_loader.o \ @@ -33,7 +32,7 @@ EE_OBJS = \ ari.o \ main.o -EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -laudsrv -lc -lstdc++ +EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpacket2 -lvu -lpad -laudsrv -lc -lstdc++ EE_INCS := -I./../../engine/include $(EE_INCS) EE_DVP = dvp-as EE_VCL = vcl diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 6dff5c8..6277438 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -37,7 +37,7 @@ void Ari::onInit() engine->audio.loadSong("MOV-CIRC.WAV"); adpcm = engine->audio.loadADPCM("ziobro.adpcm"); texRepo = engine->renderer->getTextureRepository(); - + engine->renderer->disableVSync(); island.loadDff("sunnyisl/", "sunnyisl", 0.1F, false); island.rotation.x = -1.6F; island.position.set(0.0F, 10.0F, 20.0F); @@ -49,8 +49,8 @@ void Ari::onInit() islandAddons.rotation.x = -1.6F; islandAddons.position.set(0.0F, 10.0F, 20.0F); - // skybox.loadObj("skybox/", "skybox", 100.0F, false); - // skybox.shouldBeFrustumCulled = false; + skybox.loadObj("skybox/", "skybox", 100.0F, false); + skybox.shouldBeFrustumCulled = false; waterFloors[0].loadObj("water/", "water", 5.0F, false); waterFloors[0].position.set(0.0F, 8.0F, 0.0F); @@ -71,13 +71,13 @@ void Ari::onInit() } texRepo->addByMesh("sunnyisl/", island); - // texRepo->addByMesh("sunnyisl/", islandAddons); + texRepo->addByMesh("sunnyisl/", islandAddons); - // texRepo->addByMesh("skybox/", skybox); + texRepo->addByMesh("skybox/", skybox); - // texRepo->addByMesh("ari/", player.mesh); + texRepo->addByMesh("ari/", player.mesh); - // engine->audio.playSong(); + engine->audio.playSong(); } void Ari::initBulb() @@ -91,14 +91,14 @@ void Ari::onUpdate() if (engine->pad.isCrossClicked) { engine->audio.loadSong("nob-else.wav"); - // engine->audio.playADPCM(adpcm); + engine->audio.playADPCM(adpcm); printf("FPS:%f\n", engine->fps); } camera.update(engine->pad, player.mesh); - // engine->renderer->draw(skybox); + engine->renderer->draw(skybox); engine->renderer->draw(island); - // engine->renderer->draw(islandAddons); - // engine->renderer->draw(player.mesh); + engine->renderer->draw(islandAddons); + engine->renderer->draw(player.mesh); for (u8 i = 0; i < WATER_TILES_COUNT; i++) engine->renderer->drawByPath3(waterFloors[i]); } diff --git a/src/samples/ari/objects/player.cpp b/src/samples/ari/objects/player.cpp index 65d984e..2f7da88 100644 --- a/src/samples/ari/objects/player.cpp +++ b/src/samples/ari/objects/player.cpp @@ -22,16 +22,16 @@ Player::Player() { - // PRINT_LOG("Creating player object"); - // this->gravity = 0.1F; - // this->lift = -1.0F; - // this->mesh.loadMD2("ari/", "ari", 0.0001F, true); - // this->mesh.position.set(0.0F, 10.0F, 0.0F); - // this->mesh.shouldBeBackfaceCulled = true; - // this->mesh.shouldBeFrustumCulled = false; - // this->mesh.shouldBeLighted = true; - // this->mesh.setAnimSpeed(0.05F); - // this->mesh.playAnimation(0, 1); + PRINT_LOG("Creating player object"); + this->gravity = 0.1F; + this->lift = -1.0F; + this->mesh.loadMD2("ari/", "ari", 0.0001F, true); + this->mesh.position.set(0.0F, 10.0F, 0.0F); + this->mesh.shouldBeBackfaceCulled = true; + this->mesh.shouldBeFrustumCulled = false; + this->mesh.shouldBeLighted = true; + this->mesh.setAnimSpeed(0.05F); + this->mesh.playAnimation(0, 1); PRINT_LOG("Player object created!"); } diff --git a/src/samples/floors/Makefile b/src/samples/floors/Makefile index 31a9119..5064b9b 100644 --- a/src/samples/floors/Makefile +++ b/src/samples/floors/Makefile @@ -19,7 +19,6 @@ EE_OBJS = \ ../../engine/modules/texture_repository.o \ ../../engine/modules/timer.o \ ../../engine/modules/vif_sender.o \ - ../../engine/modules/vu1.o \ ../../engine/utils/math.o \ ../../engine/utils/string.o \ ../../engine/loaders/bmp_loader.o \ @@ -37,7 +36,7 @@ EE_OBJS = \ floors.o \ main.o -EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -laudsrv -lc -lstdc++ +EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -lpacket2 -lvu -laudsrv -lc -lstdc++ EE_INCS := -I./../../engine/include $(EE_INCS) EE_DVP = dvp-as EE_VCL = openvcl From 3d755e99836b509212881413fc796f3893139983 Mon Sep 17 00:00:00 2001 From: h4570 Date: Fri, 20 Nov 2020 22:34:13 +0100 Subject: [PATCH 10/15] fixed obj parsing bug --- src/engine/loaders/obj_loader.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/engine/loaders/obj_loader.cpp b/src/engine/loaders/obj_loader.cpp index 8ad6ff9..a200589 100644 --- a/src/engine/loaders/obj_loader.cpp +++ b/src/engine/loaders/obj_loader.cpp @@ -147,7 +147,10 @@ void ObjLoader::allocateObjMemory(FILE *t_file, MeshFrame *o_result) if (strcmp(lineHeader, "usemtl") == 0) { if (currentMatI >= 0) // Skip -1 + { o_result->getMaterial(currentMatI).allocateFaces(facesCounter); + facesCounter = 0; + } currentMatI++; } else if (strcmp(lineHeader, "f") == 0) From 5e811b78cdc6f3e07196619330a252cec7253a73 Mon Sep 17 00:00:00 2001 From: h4570 Date: Fri, 20 Nov 2020 22:34:24 +0100 Subject: [PATCH 11/15] minor fixes --- src/engine/modules/audio.cpp | 2 +- src/engine/modules/vif_sender.cpp | 4 ++-- src/samples/ari/ari.cpp | 19 +++++++++++-------- src/samples/ari/ari.hpp | 2 +- src/samples/floors/Makefile | 9 +++++++++ src/samples/floors/floors.cpp | 4 ++-- 6 files changed, 26 insertions(+), 14 deletions(-) diff --git a/src/engine/modules/audio.cpp b/src/engine/modules/audio.cpp index 2889b00..2d7e836 100644 --- a/src/engine/modules/audio.cpp +++ b/src/engine/modules/audio.cpp @@ -117,7 +117,7 @@ audsrv_adpcm_t *Audio::loadADPCM(char *t_path) char *fullFilename = String::createConcatenated("host:", t_path); FILE *file = fopen(fullFilename, "rb"); delete[] fullFilename; - fseek(file, 0L, SEEK_END); + fseek(file, 0, SEEK_END); u32 adpcmFileSize = ftell(file); u8 data[adpcmFileSize]; rewind(file); diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 70bd1b8..37231ef 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -83,8 +83,8 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver i++; } vu_add_end_tag(currPacket); - dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1); + dma_channel_wait(DMA_CHANNEL_VIF1, 0); context = !context; } } @@ -117,7 +117,7 @@ void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_ver for (u8 j = 0; j < 4; j++) vu_unpack_add_u32(currPacket, 128); - //// Clipping tests start + // Clipping tests start // // const float minZ = 1; // // const float maxZ = 65535; diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 6277438..778b8a8 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -34,8 +34,12 @@ void Ari::onInit() { engine->renderer->setCameraDefinitions(&camera.worldView, &camera.position, camera.planes); engine->audio.setSongVolume(40); - engine->audio.loadSong("MOV-CIRC.WAV"); - adpcm = engine->audio.loadADPCM("ziobro.adpcm"); + // engine->audio.loadSong("MOV-CIRC.WAV"); + engine->audio.loadSong("nob-else.wav"); + + adpcm1 = engine->audio.loadADPCM("ziobro1.adpcm"); + adpcm2 = engine->audio.loadADPCM("ziobro2.adpcm"); + texRepo = engine->renderer->getTextureRepository(); engine->renderer->disableVSync(); island.loadDff("sunnyisl/", "sunnyisl", 0.1F, false); @@ -72,11 +76,8 @@ void Ari::onInit() texRepo->addByMesh("sunnyisl/", island); texRepo->addByMesh("sunnyisl/", islandAddons); - texRepo->addByMesh("skybox/", skybox); - texRepo->addByMesh("ari/", player.mesh); - engine->audio.playSong(); } @@ -90,17 +91,19 @@ void Ari::onUpdate() { if (engine->pad.isCrossClicked) { - engine->audio.loadSong("nob-else.wav"); - engine->audio.playADPCM(adpcm); + // engine->audio.loadSong("nob-else.wav"); + engine->audio.playADPCM(adpcm1); printf("FPS:%f\n", engine->fps); } + if (engine->pad.isCircleClicked) + engine->audio.playADPCM(adpcm2); camera.update(engine->pad, player.mesh); engine->renderer->draw(skybox); engine->renderer->draw(island); engine->renderer->draw(islandAddons); engine->renderer->draw(player.mesh); for (u8 i = 0; i < WATER_TILES_COUNT; i++) - engine->renderer->drawByPath3(waterFloors[i]); + engine->renderer->draw(waterFloors[i]); } void Ari::calcSpiral(int X, int Y) diff --git a/src/samples/ari/ari.hpp b/src/samples/ari/ari.hpp index bb594b3..1f88735 100644 --- a/src/samples/ari/ari.hpp +++ b/src/samples/ari/ari.hpp @@ -39,7 +39,7 @@ private: Player player; Mesh island, islandAddons, skybox; Mesh *waterFloors; - audsrv_adpcm_t *adpcm; + audsrv_adpcm_t *adpcm1, *adpcm2; Point *spirals; Camera camera; TextureRepository *texRepo; diff --git a/src/samples/floors/Makefile b/src/samples/floors/Makefile index 5064b9b..5b766b4 100644 --- a/src/samples/floors/Makefile +++ b/src/samples/floors/Makefile @@ -55,5 +55,14 @@ all: $(EE_BIN) clean: rm -f $(EE_BIN) $(EE_OBJS) +run: $(EE_BIN) + killall -v ps2client || true + ps2client reset + ps2client reset + $(EE_STRIP) --strip-all $(EE_BIN) + mv $(EE_BIN) bin/$(EE_BIN) + rm $(EE_OBJS) + cd bin/ && ps2client execee host:$(EE_BIN) + include $(PS2SDK)/samples/Makefile.pref include $(PS2SDK)/samples/Makefile.eeglobal diff --git a/src/samples/floors/floors.cpp b/src/samples/floors/floors.cpp index c63a5c8..1619e74 100644 --- a/src/samples/floors/floors.cpp +++ b/src/samples/floors/floors.cpp @@ -51,9 +51,9 @@ void Floors::onUpdate() camera.update(engine->pad, player.mesh); floorManager.update(player); player.update(engine->pad, camera, floorManager); - // engine->renderer->draw(player.mesh); + engine->renderer->draw(player.mesh); for (u8 i = 0; i < FLOORS_COUNT; i++) - engine->renderer->drawByPath3(floorManager.floors[i].mesh, lightManager.bulbs, lightManager.bulbsCount); + engine->renderer->draw(floorManager.floors[i].mesh, lightManager.bulbs, lightManager.bulbsCount); } void Floors::onAudioTick() From 82cab6f78bb15903dea15b90d06b2b8a67761f78 Mon Sep 17 00:00:00 2001 From: h4570 Date: Sat, 21 Nov 2020 13:59:56 +0100 Subject: [PATCH 12/15] refactored to match latest libpacket2 api --- src/engine/engine.cpp | 10 --- src/engine/include/modules/vif_sender.hpp | 3 +- src/engine/modules/gif_sender.cpp | 8 +-- src/engine/modules/renderer.cpp | 4 +- src/engine/modules/vif_sender.cpp | 76 +++++++++++++++-------- src/samples/ari/Makefile | 2 +- src/samples/floors/Makefile | 2 +- 7 files changed, 59 insertions(+), 46 deletions(-) diff --git a/src/engine/engine.cpp b/src/engine/engine.cpp index e5fddc0..76b7614 100644 --- a/src/engine/engine.cpp +++ b/src/engine/engine.cpp @@ -15,15 +15,8 @@ #include #include #include -#include -#include #include "include/utils/debug.hpp" -// VU1 micro program -extern u32 VU1Draw3D_CodeStart __attribute__((section(".vudata"))); -extern u32 VU1Draw3D_CodeEnd __attribute__((section(".vudata"))); -// - // ---- // Constructors/Destructors // ---- @@ -84,9 +77,6 @@ void Engine::firePS2() { SifInitRpc(0); srand(time(NULL)); - dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); - dma_channel_fast_waits(DMA_CHANNEL_VIF1); - vu_upload_program(0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd, DMA_CHANNEL_VIF1); fileService.startThread(); audio.startThread(&fileService); isInitialized = 0; diff --git a/src/engine/include/modules/vif_sender.hpp b/src/engine/include/modules/vif_sender.hpp index 9924a1b..1c26843 100644 --- a/src/engine/include/modules/vif_sender.hpp +++ b/src/engine/include/modules/vif_sender.hpp @@ -12,7 +12,7 @@ #define _TYRA_VIF_SENDER_ #include -#include +#include #include "../models/render_data.hpp" #include "../models/light_bulb.hpp" #include "../models/mesh.hpp" @@ -32,6 +32,7 @@ public: void sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation); private: + void uploadMicroProgram(); void setDoubleBuffer(); void drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer); packet2_t *packets[2] __attribute__((aligned(64))); diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 785c183..72b749b 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -32,8 +32,8 @@ GifSender::GifSender(u32 t_packetSize, ScreenSettings *t_screen) : screen(t_scre { PRINT_LOG("Initializing GifSender"); packetSize = t_packetSize; - packets[0] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false); - packets[1] = packet2_create_chain(t_packetSize, P2_TYPE_NORMAL, false); + packets[0] = packet2_create(t_packetSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, false); + packets[1] = packet2_create(t_packetSize, P2_TYPE_NORMAL, P2_MODE_CHAIN, false); PRINT_LOG("GifSender initialized!"); } @@ -54,7 +54,7 @@ GifSender::~GifSender() /** Send texture via GIF */ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) { - packet2_t *packet2 = packet2_create_chain(15, P2_TYPE_NORMAL, false); + packet2_t *packet2 = packet2_create(15, P2_TYPE_NORMAL, P2_MODE_CHAIN, false); packet2_update( packet2, draw_texture_transfer( @@ -75,7 +75,7 @@ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) void GifSender::sendClear(zbuffer_t *t_zBuffer) { - packet2_t *packet2 = packet2_create_chain(36, P2_TYPE_NORMAL, false); + packet2_t *packet2 = packet2_create(36, P2_TYPE_NORMAL, P2_MODE_CHAIN, false); packet2_chain_open_end(packet2, 0, 0); packet2_update(packet2, draw_disable_tests(packet2->next, 0, t_zBuffer)); packet2_update(packet2, draw_clear(packet2->next, 0, diff --git a/src/engine/modules/renderer.cpp b/src/engine/modules/renderer.cpp index 2c38304..4136af5 100644 --- a/src/engine/modules/renderer.cpp +++ b/src/engine/modules/renderer.cpp @@ -40,7 +40,7 @@ Renderer::Renderer(u32 t_packetSize, ScreenSettings *t_screen) isVSyncEnabled = true; isFrameEmpty = false; lastTextureId = 0; - flipPacket = packet2_create_normal(4, P2_TYPE_UNCACHED_ACCL); + flipPacket = packet2_create(4, P2_TYPE_UNCACHED_ACCL, P2_MODE_NORMAL, 0); allocateBuffers(t_screen->width, t_screen->height); initDrawingEnv(t_screen->width, t_screen->height); setPrim(); @@ -106,7 +106,7 @@ void Renderer::initDrawingEnv(float t_screenW, float t_screenH) PRINT_LOG("Initializing drawing environment"); u16 halfW = (u16)t_screenW / 2; u16 halfH = (u16)t_screenH / 2; - packet2_t *packet2 = packet2_create_normal(20, P2_TYPE_NORMAL); + packet2_t *packet2 = packet2_create(20, P2_TYPE_NORMAL, P2_MODE_NORMAL, 0); packet2_update(packet2, draw_setup_environment(packet2->base, 0, frameBuffers, &(zBuffer))); packet2_update(packet2, draw_primitive_xyoffset(packet2->next, 0, (2048 - halfW), (2048 - halfH))); packet2_update(packet2, draw_finish(packet2->next)); diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 37231ef..8425207 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -24,13 +24,21 @@ const u32 VU1_PACKET_SIZE = 128; // Constructors/Destructors // ---- +// VU1 micro program +extern u32 VU1Draw3D_CodeStart __attribute__((section(".vudata"))); +extern u32 VU1Draw3D_CodeEnd __attribute__((section(".vudata"))); +// + VifSender::VifSender() { PRINT_LOG("Initializing VifSender"); PRINT_LOG("VifSender initialized!"); - packets[0] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true); - packets[1] = packet2_create_chain(VU1_PACKET_SIZE, P2_TYPE_NORMAL, true); - matricesPacket = packet2_create_chain(4, P2_TYPE_NORMAL, true); + dma_channel_initialize(DMA_CHANNEL_VIF1, NULL, 0); + dma_channel_fast_waits(DMA_CHANNEL_VIF1); + uploadMicroProgram(); + packets[0] = packet2_create(VU1_PACKET_SIZE, P2_TYPE_NORMAL, P2_MODE_CHAIN, true); + packets[1] = packet2_create(VU1_PACKET_SIZE, P2_TYPE_NORMAL, P2_MODE_CHAIN, true); + matricesPacket = packet2_create(4, P2_TYPE_NORMAL, P2_MODE_CHAIN, true); context = 0; setDoubleBuffer(); } @@ -46,6 +54,20 @@ VifSender::~VifSender() // Methods // ---- +void VifSender::uploadMicroProgram() +{ + packet2_t *packet2 = packet2_create( + packet2_vu_get_packet_size_for_program(&VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd) + 1, // + end tag + P2_TYPE_NORMAL, + P2_MODE_CHAIN, + 1); + packet2_vu_add_micro_program(packet2, 0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd); + packet2_vu_add_end_tag(packet2); + dma_channel_send_packet2(packet2, DMA_CHANNEL_VIF1, 1); + dma_channel_wait(DMA_CHANNEL_VIF1, 0); + packet2_free(packet2); +} + void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_position, const Vector3 &t_rotation) { vec3ToNative(position, t_position, 1.0F); @@ -53,8 +75,8 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po create_local_world(localWorld, position, rotation); create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data); packet2_reset(matricesPacket, false); - vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); - vu_add_end_tag(matricesPacket); + packet2_vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); + packet2_vu_add_end_tag(matricesPacket); dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); } @@ -82,7 +104,7 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver i += (VU1_PACKAGE_VERTS_PER_BUFF - 1); i++; } - vu_add_end_tag(currPacket); + packet2_vu_add_end_tag(currPacket); dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); context = !context; @@ -91,9 +113,9 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver void VifSender::setDoubleBuffer() { - packet2_t *settings = packet2_create_chain(2, P2_TYPE_NORMAL, true); - vu_add_double_buffer_settings(settings, 8, 496); - vu_add_end_tag(settings); + packet2_t *settings = packet2_create(2, P2_TYPE_NORMAL, P2_MODE_CHAIN, true); + packet2_vu_add_double_buffer_settings(settings, 8, 496); + packet2_vu_add_end_tag(settings); dma_channel_send_packet2(settings, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); packet2_free(settings); @@ -103,19 +125,19 @@ void VifSender::setDoubleBuffer() void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer) { const u32 vertCount = t_end - t_start; - vu_open_unpack(currPacket); + packet2_vu_open_unpack(currPacket); // TODO get this via screensettings - vu_unpack_add_float(currPacket, 2048.0F); // scale - vu_unpack_add_float(currPacket, 2048.0F); // scale - vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale - vu_unpack_add_u32(currPacket, vertCount); // vertex count - vu_unpack_add_set(currPacket, 1); - vu_unpack_add_lod(currPacket, &t_mesh.lod); - vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut); - vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); + packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale + packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale + packet2_vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale + packet2_vu_unpack_add_u32(currPacket, vertCount); // vertex count + packet2_vu_unpack_add_set(currPacket, 1); + packet2_vu_unpack_add_lod(currPacket, &t_mesh.lod); + packet2_vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut); + packet2_vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); for (u8 j = 0; j < 4; j++) - vu_unpack_add_u32(currPacket, 128); + packet2_vu_unpack_add_u32(currPacket, 128); // Clipping tests start @@ -152,14 +174,14 @@ void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_ver // // vu1.addFloat(1.0F); // // vu1.addFloat(500.0F); // far - vu_unpack_add_float(currPacket, 0.0F); - vu_unpack_add_float(currPacket, 0.0F); - vu_unpack_add_float(currPacket, 0.0F); - vu_unpack_add_float(currPacket, 0.0F); + packet2_vu_unpack_add_float(currPacket, 0.0F); + packet2_vu_unpack_add_float(currPacket, 0.0F); + packet2_vu_unpack_add_float(currPacket, 0.0F); + packet2_vu_unpack_add_float(currPacket, 0.0F); //// Clipping tests end - vu_close_unpack(currPacket); - vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1); - vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1); - vu_add_start_program(currPacket, 0); + packet2_vu_close_unpack(currPacket); + packet2_vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1); + packet2_vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1); + packet2_vu_add_start_program(currPacket, 0); } diff --git a/src/samples/ari/Makefile b/src/samples/ari/Makefile index ffdc4aa..e06585d 100644 --- a/src/samples/ari/Makefile +++ b/src/samples/ari/Makefile @@ -32,7 +32,7 @@ EE_OBJS = \ ari.o \ main.o -EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpacket2 -lvu -lpad -laudsrv -lc -lstdc++ +EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpacket2 -lpad -laudsrv -lc -lstdc++ EE_INCS := -I./../../engine/include $(EE_INCS) EE_DVP = dvp-as EE_VCL = vcl diff --git a/src/samples/floors/Makefile b/src/samples/floors/Makefile index 5b766b4..bb45494 100644 --- a/src/samples/floors/Makefile +++ b/src/samples/floors/Makefile @@ -36,7 +36,7 @@ EE_OBJS = \ floors.o \ main.o -EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -lpacket2 -lvu -laudsrv -lc -lstdc++ +EE_LIBS = -ldraw -lgraph -lmath3d -lpacket -ldma -lpad -lpacket2 -laudsrv -lc -lstdc++ EE_INCS := -I./../../engine/include $(EE_INCS) EE_DVP = dvp-as EE_VCL = openvcl From 756f69d16097cdc39f9b7eacab6507153fb54cb1 Mon Sep 17 00:00:00 2001 From: h4570 Date: Sun, 22 Nov 2020 13:11:41 +0100 Subject: [PATCH 13/15] fixed packet size --- src/samples/ari/ari.cpp | 2 +- src/samples/ari/main.cpp | 2 +- src/samples/floors/floors.cpp | 2 +- src/samples/floors/main.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/samples/ari/ari.cpp b/src/samples/ari/ari.cpp index 778b8a8..40d7b8b 100644 --- a/src/samples/ari/ari.cpp +++ b/src/samples/ari/ari.cpp @@ -78,7 +78,7 @@ void Ari::onInit() texRepo->addByMesh("sunnyisl/", islandAddons); texRepo->addByMesh("skybox/", skybox); texRepo->addByMesh("ari/", player.mesh); - engine->audio.playSong(); + // engine->audio.playSong(); } void Ari::initBulb() diff --git a/src/samples/ari/main.cpp b/src/samples/ari/main.cpp index e8bd95a..f76ae54 100644 --- a/src/samples/ari/main.cpp +++ b/src/samples/ari/main.cpp @@ -14,7 +14,7 @@ int main() { Engine engine = Engine(); Ari game = Ari(&engine); - game.engine->init(&game, 40000); + game.engine->init(&game, 128); SleepThread(); return 0; } diff --git a/src/samples/floors/floors.cpp b/src/samples/floors/floors.cpp index 1619e74..c802267 100644 --- a/src/samples/floors/floors.cpp +++ b/src/samples/floors/floors.cpp @@ -53,7 +53,7 @@ void Floors::onUpdate() player.update(engine->pad, camera, floorManager); engine->renderer->draw(player.mesh); for (u8 i = 0; i < FLOORS_COUNT; i++) - engine->renderer->draw(floorManager.floors[i].mesh, lightManager.bulbs, lightManager.bulbsCount); + engine->renderer->drawByPath3(floorManager.floors[i].mesh, lightManager.bulbs, lightManager.bulbsCount); } void Floors::onAudioTick() diff --git a/src/samples/floors/main.cpp b/src/samples/floors/main.cpp index fcbf784..f051c73 100644 --- a/src/samples/floors/main.cpp +++ b/src/samples/floors/main.cpp @@ -14,7 +14,7 @@ int main() { Engine engine = Engine(); Floors game = Floors(&engine); - game.engine->init(&game, 40000); + game.engine->init(&game, 128); SleepThread(); return 0; } From e9febb5d8db01e446aed013e7dd2f4a11f363a2d Mon Sep 17 00:00:00 2001 From: h4570 Date: Sun, 22 Nov 2020 13:15:15 +0100 Subject: [PATCH 14/15] changed order of wait/send --- src/engine/modules/gif_sender.cpp | 3 ++- src/engine/modules/vif_sender.cpp | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/engine/modules/gif_sender.cpp b/src/engine/modules/gif_sender.cpp index 72b749b..2c69442 100644 --- a/src/engine/modules/gif_sender.cpp +++ b/src/engine/modules/gif_sender.cpp @@ -68,6 +68,7 @@ void GifSender::sendTexture(MeshTexture &texture, texbuffer_t *t_texBuffer) packet2_update(packet2, draw_texture_wrapping(packet2->next, 0, texture.getWrapSettings())); packet2_chain_close_tag(packet2); packet2_update(packet2, draw_texture_flush(packet2->next)); + dma_channel_wait(DMA_CHANNEL_GIF, 0); dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true); dma_channel_wait(DMA_CHANNEL_GIF, 0); packet2_free(packet2); @@ -109,8 +110,8 @@ void GifSender::sendPacket() packet2_update(currentPacket, draw_finish(currentPacket->next)); packet2_chain_close_tag(currentPacket); } - dma_channel_send_packet2(currentPacket, DMA_CHANNEL_GIF, true); dma_channel_wait(DMA_CHANNEL_GIF, 0); + dma_channel_send_packet2(currentPacket, DMA_CHANNEL_GIF, true); } /** Adds clear screen to current packet */ diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 8425207..2fb21c7 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -63,8 +63,8 @@ void VifSender::uploadMicroProgram() 1); packet2_vu_add_micro_program(packet2, 0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd); packet2_vu_add_end_tag(packet2); - dma_channel_send_packet2(packet2, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); + dma_channel_send_packet2(packet2, DMA_CHANNEL_VIF1, 1); packet2_free(packet2); } @@ -77,8 +77,8 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po packet2_reset(matricesPacket, false); packet2_vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); packet2_vu_add_end_tag(matricesPacket); - dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); + dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1); } void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 vertCount2, VECTOR *vertices, VECTOR *normals, VECTOR *coordinates, Mesh &t_mesh, LightBulb *t_bulbs, u16 t_bulbsCount, texbuffer_t *textureBuffer) From 25b5fb42956cf2f5e926737616121bdac02ab96c Mon Sep 17 00:00:00 2001 From: h4570 Date: Mon, 23 Nov 2020 22:01:19 +0100 Subject: [PATCH 15/15] fixed to last packet2 api --- src/engine/include/modules/vif_sender.hpp | 2 +- src/engine/modules/vif_sender.cpp | 53 ++++++++++++----------- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/engine/include/modules/vif_sender.hpp b/src/engine/include/modules/vif_sender.hpp index 1c26843..6291a75 100644 --- a/src/engine/include/modules/vif_sender.hpp +++ b/src/engine/include/modules/vif_sender.hpp @@ -12,7 +12,7 @@ #define _TYRA_VIF_SENDER_ #include -#include +#include #include "../models/render_data.hpp" #include "../models/light_bulb.hpp" #include "../models/mesh.hpp" diff --git a/src/engine/modules/vif_sender.cpp b/src/engine/modules/vif_sender.cpp index 2fb21c7..68512f7 100644 --- a/src/engine/modules/vif_sender.cpp +++ b/src/engine/modules/vif_sender.cpp @@ -57,12 +57,12 @@ VifSender::~VifSender() void VifSender::uploadMicroProgram() { packet2_t *packet2 = packet2_create( - packet2_vu_get_packet_size_for_program(&VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd) + 1, // + end tag + packet2_utils_get_packet_size_for_program(&VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd) + 1, // + end tag P2_TYPE_NORMAL, P2_MODE_CHAIN, 1); - packet2_vu_add_micro_program(packet2, 0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd); - packet2_vu_add_end_tag(packet2); + packet2_vif_add_micro_program(packet2, 0, &VU1Draw3D_CodeStart, &VU1Draw3D_CodeEnd); + packet2_utils_vu_add_end_tag(packet2); dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_send_packet2(packet2, DMA_CHANNEL_VIF1, 1); packet2_free(packet2); @@ -75,8 +75,8 @@ void VifSender::sendMatrices(const RenderData &t_renderData, const Vector3 &t_po create_local_world(localWorld, position, rotation); create_local_screen(localScreen, localWorld, t_renderData.worldView->data, t_renderData.perspective->data); packet2_reset(matricesPacket, false); - packet2_vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); - packet2_vu_add_end_tag(matricesPacket); + packet2_utils_vu_add_unpack_data(matricesPacket, 0, &localScreen, 8, 0); + packet2_utils_vu_add_end_tag(matricesPacket); dma_channel_wait(DMA_CHANNEL_VIF1, 0); dma_channel_send_packet2(matricesPacket, DMA_CHANNEL_VIF1, 1); } @@ -104,7 +104,7 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver i += (VU1_PACKAGE_VERTS_PER_BUFF - 1); i++; } - packet2_vu_add_end_tag(currPacket); + packet2_utils_vu_add_end_tag(currPacket); dma_channel_send_packet2(currPacket, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); context = !context; @@ -114,8 +114,8 @@ void VifSender::drawMesh(RenderData *t_renderData, Matrix t_perspective, u32 ver void VifSender::setDoubleBuffer() { packet2_t *settings = packet2_create(2, P2_TYPE_NORMAL, P2_MODE_CHAIN, true); - packet2_vu_add_double_buffer_settings(settings, 8, 496); - packet2_vu_add_end_tag(settings); + packet2_utils_vu_add_double_buffer(settings, 8, 496); + packet2_utils_vu_add_end_tag(settings); dma_channel_send_packet2(settings, DMA_CHANNEL_VIF1, 1); dma_channel_wait(DMA_CHANNEL_VIF1, 0); packet2_free(settings); @@ -125,19 +125,20 @@ void VifSender::setDoubleBuffer() void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_vertices, VECTOR *t_coordinates, prim_t *t_prim, texbuffer_t *textureBuffer) { const u32 vertCount = t_end - t_start; - packet2_vu_open_unpack(currPacket); + currPacket->vif_added_bytes = 0; + packet2_utils_vu_open_unpack(currPacket, 0, 1); // TODO get this via screensettings - packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale - packet2_vu_unpack_add_float(currPacket, 2048.0F); // scale - packet2_vu_unpack_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale - packet2_vu_unpack_add_u32(currPacket, vertCount); // vertex count - packet2_vu_unpack_add_set(currPacket, 1); - packet2_vu_unpack_add_lod(currPacket, &t_mesh.lod); - packet2_vu_unpack_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut); - packet2_vu_unpack_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); + packet2_add_float(currPacket, 2048.0F); // scale + packet2_add_float(currPacket, 2048.0F); // scale + packet2_add_float(currPacket, ((float)0xFFFFFF) / 32.0F); // scale + packet2_add_u32(currPacket, vertCount); // vertex count + packet2_utils_gif_add_set(currPacket, 1); + packet2_utils_gs_add_lod(currPacket, &t_mesh.lod); + packet2_utils_gs_add_texbuff_clut(currPacket, textureBuffer, &t_mesh.clut); + packet2_utils_gs_add_prim_giftag(currPacket, t_prim, vertCount, DRAW_STQ2_REGLIST, 3, 0); for (u8 j = 0; j < 4; j++) - packet2_vu_unpack_add_u32(currPacket, 128); + packet2_add_u32(currPacket, 128); // Clipping tests start @@ -174,14 +175,14 @@ void VifSender::drawVertices(Mesh &t_mesh, u32 t_start, u32 t_end, VECTOR *t_ver // // vu1.addFloat(1.0F); // // vu1.addFloat(500.0F); // far - packet2_vu_unpack_add_float(currPacket, 0.0F); - packet2_vu_unpack_add_float(currPacket, 0.0F); - packet2_vu_unpack_add_float(currPacket, 0.0F); - packet2_vu_unpack_add_float(currPacket, 0.0F); + packet2_add_float(currPacket, 0.0F); + packet2_add_float(currPacket, 0.0F); + packet2_add_float(currPacket, 0.0F); + packet2_add_float(currPacket, 0.0F); //// Clipping tests end - packet2_vu_close_unpack(currPacket); - packet2_vu_add_unpack_data(currPacket, 0, t_vertices + t_start, 2 * vertCount, 1); - packet2_vu_add_unpack_data(currPacket, 0, t_coordinates + t_start, 2 * vertCount, 1); - packet2_vu_add_start_program(currPacket, 0); + packet2_utils_vu_close_unpack(currPacket); + packet2_utils_vu_add_unpack_data(currPacket, packet2_get_vif_added_qws(currPacket), t_vertices + t_start, vertCount, 1); + packet2_utils_vu_add_unpack_data(currPacket, packet2_get_vif_added_qws(currPacket), t_coordinates + t_start, vertCount, 1); + packet2_utils_vu_add_start_program(currPacket, 0); }