disable interlacing and texture cache manager

This commit is contained in:
h4570
2022-07-28 10:12:26 +02:00
parent dfb8bc73c3
commit 7a80c15ac8
9 changed files with 109 additions and 52 deletions
@@ -72,12 +72,13 @@ void RendererCore2D::render(Sprite* sprite,
rect->color.q = 0;
rect->v0.x = sprite->position.x;
rect->v0.y = sprite->position.y / 2.0F; // interlacing
rect->v0.y = sprite->position.y;
// rect->v0.y /= 2.0F; // interlacing
rect->v0.z = (u32)-1;
rect->v1.x = (sprite->size.x * sprite->scale) + sprite->position.x;
rect->v1.y = (sprite->size.y * sprite->scale) + sprite->position.y;
rect->v1.y /= 2.0F; // interlacing
// rect->v1.y /= 2.0F; // interlacing
rect->v1.z = (u32)-1;
auto* packet = packets[context];
@@ -89,11 +90,10 @@ void RendererCore2D::render(Sprite* sprite,
packet2_utils_gs_add_texbuff_clut(packet, texBuffers.core, clutBuffer);
draw_enable_blending();
packet2_update(packet, draw_rect_textured(packet->next, 0, rect));
packet2_update(
packet,
draw_primitive_xyoffset(
packet->next, 0, SCREEN_CENTER - (settings->getWidth() / 2.0F),
SCREEN_CENTER - (settings->getInterlacedHeightF() / 2.0F)));
packet2_update(packet, draw_primitive_xyoffset(
packet->next, 0,
SCREEN_CENTER - (settings->getWidth() / 2.0F),
SCREEN_CENTER - (settings->getHeight() / 2.0F)));
draw_disable_blending();
packet2_update(packet, draw_finish(packet->next));
@@ -37,7 +37,7 @@ void RendererCore3D::setFov(const float& t_fov) {
void RendererCore3D::setProjection() {
projection = M4x4::perspective(
fov, settings->getWidth(), settings->getInterlacedHeightF(),
fov, settings->getWidth(), settings->getHeight(),
settings->getProjectionScale(), settings->getAspectRatio(),
settings->getNear(), settings->getFar());
}
@@ -27,6 +27,7 @@ RendererCoreGS::RendererCoreGS() {
context = 0;
spaceOccupiedByFrameBuffers = 0;
spaceOccupiedByZBuffer = 0;
currentField = 0;
}
RendererCoreGS::~RendererCoreGS() {
if (flipPacket) {
@@ -52,11 +53,10 @@ void RendererCoreGS::initChannels() {
}
void RendererCoreGS::allocateBuffers() {
const u16 psm = 32;
frameBuffers[0].width = static_cast<unsigned int>(settings->getWidth());
frameBuffers[0].height = settings->getInterlacedHeightUI();
frameBuffers[0].height = static_cast<unsigned int>(settings->getHeight());
frameBuffers[0].mask = 0;
const u16 fpsm = 32;
frameBuffers[0].psm = GS_PSM_32;
frameBuffers[0].address =
graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height,
@@ -73,26 +73,35 @@ void RendererCoreGS::allocateBuffers() {
zBuffer.enable = DRAW_ENABLE;
zBuffer.mask = 0;
zBuffer.method = ZTEST_METHOD_GREATER_EQUAL;
const u16 zpsm = 32;
zBuffer.zsm = GS_ZBUF_32;
zBuffer.address =
graph_vram_allocate(frameBuffers[0].width, frameBuffers[0].height,
zBuffer.zsm, GRAPH_ALIGN_PAGE);
graph_set_mode(GRAPH_MODE_INTERLACED, GRAPH_MODE_NTSC, GRAPH_MODE_FRAME,
GRAPH_ENABLE);
graph_set_screen(0, 0, static_cast<int>(settings->getWidth()),
static_cast<int>(settings->getHeight()));
graph_set_bgcolor(0, 0, 0);
graph_set_framebuffer_filtered(frameBuffers[1].address, frameBuffers[1].width,
frameBuffers[1].psm, 0, 0);
graph_enable_output();
graph_initialize(frameBuffers[1].address, frameBuffers[1].width,
frameBuffers[1].height, frameBuffers[1].psm, 0, 0);
// Interlacing tests
// graph_set_mode(GRAPH_MODE_INTERLACED, GRAPH_MODE_NTSC, GRAPH_MODE_FRAME,
// GRAPH_ENABLE);
// graph_set_screen(0, 0, static_cast<int>(settings->getWidth()),
// static_cast<int>(settings->getHeight()));
// graph_set_bgcolor(0, 0, 0);
// graph_set_framebuffer_filtered(frameBuffers[1].address,
// frameBuffers[1].width,
// frameBuffers[1].psm, 0, 0);
// graph_enable_output();
spaceOccupiedByZBuffer =
((frameBuffers[0].width / 100.0F) * (frameBuffers[0].height / 100.0F) *
(zpsm / 100.0F)) /
8.0F;
spaceOccupiedByFrameBuffers =
((frameBuffers[0].width / 100.0F) * (frameBuffers[0].height / 100.0F) *
(psm / 100.0F)) /
(fpsm / 100.0F)) /
8.0F;
spaceOccupiedByZBuffer = spaceOccupiedByFrameBuffers;
spaceOccupiedByFrameBuffers *= 2;
TYRA_LOG("Framebuffers, zBuffer set and allocated!");
@@ -102,11 +111,10 @@ void RendererCoreGS::initDrawingEnvironment() {
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, screenCenter - (settings->getWidth() / 2.0F),
screenCenter - (settings->getInterlacedHeightF() / 2.0F)));
packet2_update(packet2, draw_primitive_xyoffset(
packet2->next, 0,
screenCenter - (settings->getWidth() / 2.0F),
screenCenter - (settings->getHeight() / 2.0F)));
packet2_update(packet2, draw_finish(packet2->next));
dma_channel_send_packet2(packet2, DMA_CHANNEL_GIF, true);
dma_channel_wait(DMA_CHANNEL_GIF, 0);
@@ -136,6 +144,22 @@ void RendererCoreGS::setLod() {
TYRA_LOG("Lod set!");
}
qword_t* RendererCoreGS::setXYOffset(qword_t* q, const int& drawContext,
const float& x, const float& y) {
PACK_GIFTAG(q, GIF_SET_TAG(1, 0, 0, 0, GIF_FLG_PACKED, 1), GIF_REG_AD);
q++;
int yOffset = currentField == GRAPH_FIELD_ODD ? 8 : 0;
PACK_GIFTAG(q,
GS_SET_XYOFFSET(static_cast<int>(x * 16.0F),
static_cast<int>((y * 16.0F + yOffset))),
GS_REG_XYOFFSET + drawContext);
q++;
return q;
}
void RendererCoreGS::flipBuffers() {
graph_set_framebuffer_filtered(frameBuffers[context].address,
frameBuffers[context].width,
@@ -145,10 +169,29 @@ void RendererCoreGS::flipBuffers() {
packet2_update(flipPacket,
draw_framebuffer(flipPacket->base, 0, &frameBuffers[context]));
// Interlacing test
// packet2_update(
// flipPacket,
// setXYOffset(flipPacket->next, 0,
// screenCenter - (settings->getWidth() / 2.0F),
// screenCenter - (settings->getInterlacedHeightF() / 2.0F)));
packet2_update(flipPacket, draw_finish(flipPacket->next));
dma_channel_wait(DMA_CHANNEL_GIF, 0);
dma_channel_send_packet2(flipPacket, DMA_CHANNEL_GIF, true);
draw_wait_finish();
// Interlacing test
// updateCurrentField();
}
void RendererCoreGS::updateCurrentField() {
if (*GS_REG_CSR & (1 << 13)) {
currentField = GRAPH_FIELD_ODD;
return;
}
currentField = GRAPH_FIELD_EVEN;
}
} // namespace Tyra
@@ -39,13 +39,15 @@ void RendererCoreTexture::updateClutBuffer(texbuffer_t* clutBuffer) {
RendererCoreTextureBuffers RendererCoreTexture::useTexture(Texture* t_tex) {
TYRA_ASSERT(t_tex != nullptr, "Provided nullptr texture!");
cacheManager.addRequestedTexture(t_tex);
// cacheManager.addRequestedTexture(t_tex);
auto allocated = getAllocatedBuffersByTextureId(t_tex->getId());
if (allocated.id != 0) return allocated;
while (t_tex->getSizeInMB() > sender.getFreeVRamInMB()) {
auto idToDealloc = cacheManager.getTextureIdToDealloc(currentAllocations);
while ((t_tex->getSizeInMB()) > sender.getFreeVRamInMB()) {
// auto idToDealloc =
// cacheManager.getTextureIdToDealloc(currentAllocations);
auto idToDealloc = currentAllocations.back().id;
auto buffToDealloc = getAllocatedBuffersByTextureId(idToDealloc);
sender.deallocate(buffToDealloc);
unregisterAllocation(idToDealloc);
@@ -49,7 +49,7 @@ void RendererCoreTextureSender::deallocate(
graph_vram_free(texBuffers.core->address);
delete texBuffers.core;
if (texBuffers.clut != nullptr) {
if (texBuffers.clut != nullptr && texBuffers.clut->width > 0) {
graph_vram_free(texBuffers.clut->address);
delete texBuffers.clut;
}