disable interlacing and texture cache manager
This commit is contained in:
@@ -28,24 +28,31 @@ class RendererCoreGS {
|
||||
void flipBuffers();
|
||||
|
||||
float getVRamFreeSpaceInMB() const {
|
||||
return 4.0F - spaceOccupiedByFrameBuffers - spaceOccupiedByZBuffer;
|
||||
return 4.0F - spaceOccupiedByFrameBuffers - spaceOccupiedByZBuffer -
|
||||
vramMargin;
|
||||
}
|
||||
|
||||
private:
|
||||
constexpr static float gsCenter = 4096.0F;
|
||||
constexpr static float screenCenter = gsCenter / 2.0F;
|
||||
constexpr static float vramMargin =
|
||||
0.003F; // We don't have perfectly 4MB of VRAM
|
||||
|
||||
float spaceOccupiedByFrameBuffers, spaceOccupiedByZBuffer;
|
||||
RendererSettings* settings;
|
||||
framebuffer_t frameBuffers[2];
|
||||
packet2_t* flipPacket;
|
||||
u8 context;
|
||||
u8 currentField;
|
||||
|
||||
void allocateBuffers();
|
||||
void initDrawingEnvironment();
|
||||
void setPrim();
|
||||
void setLod();
|
||||
void initChannels();
|
||||
void updateCurrentField();
|
||||
qword_t* setXYOffset(qword_t* q, const int& drawContext, const float& x,
|
||||
const float& y);
|
||||
};
|
||||
|
||||
} // namespace Tyra
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace Tyra {
|
||||
class RendererSettings {
|
||||
public:
|
||||
RendererSettings()
|
||||
: width(640.0F),
|
||||
: width(512.0F),
|
||||
height(448.0F),
|
||||
interlacedHeightF(height / 2),
|
||||
near(0.1F),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user