Fixed dolphin rendering.
This commit is contained in:
@@ -16,6 +16,9 @@ target_compile_definitions(${DUSK_LIBRARY_TARGET_NAME} PUBLIC
|
|||||||
DOL=1
|
DOL=1
|
||||||
ISO=2
|
ISO=2
|
||||||
DUSK_DOLPHIN_BUILD_TYPE=${DUSK_DOLPHIN_BUILD_TYPE}
|
DUSK_DOLPHIN_BUILD_TYPE=${DUSK_DOLPHIN_BUILD_TYPE}
|
||||||
|
# GameCube/Wii PowerPC is always big-endian; declare it at compile time
|
||||||
|
# like every other target instead of relying on endian.h's runtime probe.
|
||||||
|
DUSK_PLATFORM_ENDIAN_BIG
|
||||||
)
|
)
|
||||||
|
|
||||||
# Custom compiler flags
|
# Custom compiler flags
|
||||||
|
|||||||
@@ -115,6 +115,11 @@ errorret_t assetChunkLoaderSync(assetloading_t *loading) {
|
|||||||
memoryCopy(out->tiles, data + offset, tileSize);
|
memoryCopy(out->tiles, data + offset, tileSize);
|
||||||
offset += tileSize;
|
offset += tileSize;
|
||||||
|
|
||||||
|
for(size_t t = 0; t < CHUNK_TILE_COUNT; t++) {
|
||||||
|
uint32_t *shape = (uint32_t *)&out->tiles[t].shape;
|
||||||
|
*shape = endianLittleToHost32(*shape);
|
||||||
|
}
|
||||||
|
|
||||||
out->meshCount = data[offset];
|
out->meshCount = data[offset];
|
||||||
offset += sizeof(uint8_t);
|
offset += sizeof(uint8_t);
|
||||||
assertTrue(
|
assertTrue(
|
||||||
@@ -136,6 +141,9 @@ errorret_t assetChunkLoaderSync(assetloading_t *loading) {
|
|||||||
|
|
||||||
memoryCopy(out->meshOffsets[m], data + offset, sizeof(vec3));
|
memoryCopy(out->meshOffsets[m], data + offset, sizeof(vec3));
|
||||||
offset += sizeof(vec3);
|
offset += sizeof(vec3);
|
||||||
|
out->meshOffsets[m][0] = endianLittleToHostFloat(out->meshOffsets[m][0]);
|
||||||
|
out->meshOffsets[m][1] = endianLittleToHostFloat(out->meshOffsets[m][1]);
|
||||||
|
out->meshOffsets[m][2] = endianLittleToHostFloat(out->meshOffsets[m][2]);
|
||||||
}
|
}
|
||||||
|
|
||||||
memoryFree(data);
|
memoryFree(data);
|
||||||
|
|||||||
@@ -48,8 +48,20 @@ errorret_t assetMeshLoaderAsync(assetloading_t *loading) {
|
|||||||
uint32_t vertCount = endianLittleToHost32(*(uint32_t *)(raw + 8));
|
uint32_t vertCount = endianLittleToHost32(*(uint32_t *)(raw + 8));
|
||||||
meshvertex_t *vertices = NULL;
|
meshvertex_t *vertices = NULL;
|
||||||
if(vertCount > 0) {
|
if(vertCount > 0) {
|
||||||
vertices = memoryAllocate(vertCount * sizeof(meshvertex_t));
|
// 32-byte (cache-line) aligned: GX_SetArray + DCFlushRange on Dolphin
|
||||||
|
// require this for the DMA'd vertex data to actually reach the GPU
|
||||||
|
// coherently. Static compiled-in vertex arrays happen to get this from
|
||||||
|
// the linker; a plain memoryAllocate here would not.
|
||||||
|
vertices = memoryAlign(32, vertCount * sizeof(meshvertex_t));
|
||||||
memoryCopy(vertices, raw + 12, vertCount * sizeof(meshvertex_t));
|
memoryCopy(vertices, raw + 12, vertCount * sizeof(meshvertex_t));
|
||||||
|
|
||||||
|
for(uint32_t v = 0; v < vertCount; v++) {
|
||||||
|
vertices[v].uv[0] = endianLittleToHostFloat(vertices[v].uv[0]);
|
||||||
|
vertices[v].uv[1] = endianLittleToHostFloat(vertices[v].uv[1]);
|
||||||
|
vertices[v].pos[0] = endianLittleToHostFloat(vertices[v].pos[0]);
|
||||||
|
vertices[v].pos[1] = endianLittleToHostFloat(vertices[v].pos[1]);
|
||||||
|
vertices[v].pos[2] = endianLittleToHostFloat(vertices[v].pos[2]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
memoryFree(raw);
|
memoryFree(raw);
|
||||||
|
|
||||||
@@ -103,18 +115,22 @@ errorret_t assetMeshLoaderSync(assetloading_t *loading) {
|
|||||||
out->vertices = NULL;
|
out->vertices = NULL;
|
||||||
errorChain(ret);
|
errorChain(ret);
|
||||||
}
|
}
|
||||||
|
out->meshInitialized = true;
|
||||||
|
|
||||||
ret = meshFlush(&out->mesh, 0, (int32_t)vertCount);
|
ret = meshFlush(&out->mesh, 0, (int32_t)vertCount);
|
||||||
if(errorIsNotOk(ret)) {
|
if(errorIsNotOk(ret)) {
|
||||||
loading->entry->state = ASSET_ENTRY_STATE_ERROR;
|
loading->entry->state = ASSET_ENTRY_STATE_ERROR;
|
||||||
meshDispose(&out->mesh);
|
meshDispose(&out->mesh);
|
||||||
|
out->meshInitialized = false;
|
||||||
memoryFree(out->vertices);
|
memoryFree(out->vertices);
|
||||||
out->vertices = NULL;
|
out->vertices = NULL;
|
||||||
errorChain(ret);
|
errorChain(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef DUSK_OPENGL_LEGACY
|
#if defined(DUSK_OPENGL) && !defined(DUSK_OPENGL_LEGACY)
|
||||||
// VBO owns the data now; CPU copy is no longer needed.
|
// VBO owns the data now; CPU copy is no longer needed. The platform
|
||||||
|
// mesh object itself still needs meshDispose later - tracked via
|
||||||
|
// out->meshInitialized, independent of the CPU buffer's lifetime.
|
||||||
memoryFree(out->vertices);
|
memoryFree(out->vertices);
|
||||||
out->vertices = NULL;
|
out->vertices = NULL;
|
||||||
#endif
|
#endif
|
||||||
@@ -129,8 +145,11 @@ errorret_t assetMeshDispose(assetentry_t *entry) {
|
|||||||
assertIsMainThread("Must be called from the main thread.");
|
assertIsMainThread("Must be called from the main thread.");
|
||||||
|
|
||||||
assetmeshoutput_t *out = &entry->data.mesh;
|
assetmeshoutput_t *out = &entry->data.mesh;
|
||||||
if(out->vertices != NULL) {
|
if(out->meshInitialized) {
|
||||||
errorChain(meshDispose(&out->mesh));
|
errorChain(meshDispose(&out->mesh));
|
||||||
|
out->meshInitialized = false;
|
||||||
|
}
|
||||||
|
if(out->vertices != NULL) {
|
||||||
memoryFree(out->vertices);
|
memoryFree(out->vertices);
|
||||||
out->vertices = NULL;
|
out->vertices = NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ typedef struct {
|
|||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
mesh_t mesh;
|
mesh_t mesh;
|
||||||
|
bool_t meshInitialized;
|
||||||
meshvertex_t *vertices;
|
meshvertex_t *vertices;
|
||||||
} assetmeshoutput_t;
|
} assetmeshoutput_t;
|
||||||
|
|
||||||
|
|||||||
@@ -78,6 +78,12 @@ errorret_t displayInitDolphin(void) {
|
|||||||
GX_SetDispCopyGamma(GX_GM_1_0);
|
GX_SetDispCopyGamma(GX_GM_1_0);
|
||||||
GX_SetColorUpdate(GX_TRUE);
|
GX_SetColorUpdate(GX_TRUE);
|
||||||
|
|
||||||
|
// Without this, the EFB's Z-buffer format/compression is left at whatever
|
||||||
|
// GX_Init() defaulted to, so depth testing and the GX_MAX_Z24 clear value
|
||||||
|
// used every frame in frameBufferClearDolphin aren't guaranteed to line up
|
||||||
|
// with the actual EFB Z format.
|
||||||
|
GX_SetPixelFmt(GX_PF_RGB8_Z24, GX_ZC_LINEAR);
|
||||||
|
|
||||||
// Describe mesh vertex format.
|
// Describe mesh vertex format.
|
||||||
GX_ClearVtxDesc();
|
GX_ClearVtxDesc();
|
||||||
GX_SetVtxDesc(GX_VA_POS, GX_INDEX16);
|
GX_SetVtxDesc(GX_VA_POS, GX_INDEX16);
|
||||||
@@ -101,7 +107,7 @@ errorret_t displaySetStateDolphin(displaystate_t state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||||
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_FALSE);
|
||||||
} else {
|
} else {
|
||||||
GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
|
GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user