From 100eae256f067366be519fd6a77ffc81e448b2b0 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 29 Sep 2023 10:31:25 +1000 Subject: [PATCH 1/3] Consoles: WIP on supporting back to quitting back to launcher --- src/ClassiCube.vcxproj | 2 +- src/ClassiCube.vcxproj.filters | 2 +- src/Game.c | 7 +++++-- src/{Platform_WinApi.c => Platform_Windows.c} | 0 src/Window_3DS.c | 2 +- src/Window_Android.c | 2 +- src/Window_Dreamcast.c | 2 +- src/Window_GCWii.c | 4 ++-- src/Window_PS3.c | 2 +- src/Window_PSP.c | 2 +- src/Window_PSVita.c | 2 +- src/Window_Xbox.c | 2 +- 12 files changed, 16 insertions(+), 13 deletions(-) rename src/{Platform_WinApi.c => Platform_Windows.c} (100%) diff --git a/src/ClassiCube.vcxproj b/src/ClassiCube.vcxproj index 35ca0b84d..bb93b5c20 100644 --- a/src/ClassiCube.vcxproj +++ b/src/ClassiCube.vcxproj @@ -496,7 +496,7 @@ - + diff --git a/src/ClassiCube.vcxproj.filters b/src/ClassiCube.vcxproj.filters index 4e46449fb..f1c86faab 100644 --- a/src/ClassiCube.vcxproj.filters +++ b/src/ClassiCube.vcxproj.filters @@ -596,7 +596,7 @@ Source Files\Platform - + Source Files\Platform diff --git a/src/Game.c b/src/Game.c index 0459b70e2..1f2305626 100644 --- a/src/Game.c +++ b/src/Game.c @@ -49,6 +49,7 @@ int Game_MaxViewDistance = DEFAULT_MAX_VIEWDIST; int Game_FpsLimit, Game_Vertices; cc_bool Game_SimpleArmsAnim; +static cc_bool gameRunning; cc_bool Game_ClassicMode, Game_ClassicHacks; cc_bool Game_AllowCustomBlocks; @@ -615,7 +616,7 @@ static void Game_RenderFrame(double delta) { Gfx_EndFrame(); } -void Game_Free(void* obj) { +static void Game_Free(void* obj) { struct IGameComponent* comp; /* Most components will call OnContextLost in their Free functions */ /* Set to false so components will always free managed textures too */ @@ -627,6 +628,7 @@ void Game_Free(void* obj) { if (comp->Free) comp->Free(); } + gameRunning = false; Logger_WarnFunc = Logger_DialogWarn; Gfx_Free(); Options_SaveIfChanged(); @@ -638,7 +640,7 @@ void Game_Free(void* obj) { delta = Stopwatch_ElapsedMicroseconds(Game_FrameStart, render) / (1000.0 * 1000.0);\ \ Window_ProcessEvents(delta);\ - if (!WindowInfo.Exists) return;\ + if (!gameRunning) return;\ \ if (delta > 1.0) delta = 1.0; /* avoid large delta with suspended process */ \ if (delta > 0.0) { Game_FrameStart = render; Game_RenderFrame(delta); } @@ -681,6 +683,7 @@ void Game_Run(int width, int height, const cc_string* title) { Window_Create3D(width, height); Window_SetTitle(title); Window_Show(); + gameRunning = true; Game_Load(); Event_RaiseVoid(&WindowEvents.Resized); diff --git a/src/Platform_WinApi.c b/src/Platform_Windows.c similarity index 100% rename from src/Platform_WinApi.c rename to src/Platform_Windows.c diff --git a/src/Window_3DS.c b/src/Window_3DS.c index 9be979e10..42861ccae 100644 --- a/src/Window_3DS.c +++ b/src/Window_3DS.c @@ -70,7 +70,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } /*########################################################################################################################* diff --git a/src/Window_Android.c b/src/Window_Android.c index 602061c9c..3bf71a95e 100644 --- a/src/Window_Android.c +++ b/src/Window_Android.c @@ -302,7 +302,7 @@ static void RemakeWindowSurface(void) { /* Loop until window gets created by main UI thread */ /* (i.e. until processSurfaceCreated is received) */ while (!winCreated) { - Window_ProcessEvents(0.0); + Window_ProcessEvents(0.01); Thread_Sleep(10); } diff --git a/src/Window_Dreamcast.c b/src/Window_Dreamcast.c index 3c7b904ed..9bef57ed1 100644 --- a/src/Window_Dreamcast.c +++ b/src/Window_Dreamcast.c @@ -60,7 +60,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } /*########################################################################################################################* diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index bd86ed71e..357f7cd38 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -28,8 +28,8 @@ int Display_ScaleY(int y) { return y; } static void OnPowerOff(void) { - Event_RaiseVoid(&WindowEvents.Closing); WindowInfo.Exists = false; + Window_Close(); } void Window_Init(void) { @@ -85,7 +85,7 @@ void Window_Create2D(int width, int height) { launcherMode = true; } void Window_Create3D(int width, int height) { launcherMode = false; } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } diff --git a/src/Window_PS3.c b/src/Window_PS3.c index 8c55e4b90..387a8b43b 100644 --- a/src/Window_PS3.c +++ b/src/Window_PS3.c @@ -79,7 +79,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } diff --git a/src/Window_PSP.c b/src/Window_PSP.c index 91ffa5662..4d2667803 100644 --- a/src/Window_PSP.c +++ b/src/Window_PSP.c @@ -58,7 +58,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } diff --git a/src/Window_PSVita.c b/src/Window_PSVita.c index 248fc1e27..a128f186d 100644 --- a/src/Window_PSVita.c +++ b/src/Window_PSVita.c @@ -61,7 +61,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } diff --git a/src/Window_Xbox.c b/src/Window_Xbox.c index 4f7b65ea4..f1c4126be 100644 --- a/src/Window_Xbox.c +++ b/src/Window_Xbox.c @@ -98,7 +98,7 @@ void Window_Show(void) { } void Window_SetSize(int width, int height) { } void Window_Close(void) { - /* TODO implement */ + Event_RaiseVoid(&WindowEvents.Closing); } From 9b1d9ced16a69d96b6b45ecd786d106d9c9daee7 Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 29 Sep 2023 13:51:03 +1000 Subject: [PATCH 2/3] WIP for 3DS, Wii/GameCube, Dreamcast --- misc/dreamcast/Makefile | 4 +++- misc/dreamcast/boot_logo.png | Bin 4054 -> 4021 bytes src/Game.c | 2 +- src/Graphics_3DS.c | 41 ++++++++++++++++++++------------ src/Graphics_Dreamcast.c | 18 +++++++------- src/Graphics_GCWii.c | 3 ++- src/Window_GCWii.c | 34 +++++++++++++++++++------- third_party/gldc/Makefile | 2 +- third_party/gldc/include/gldc.h | 11 --------- third_party/gldc/src/draw.c | 41 ++------------------------------ third_party/gldc/src/private.h | 2 -- third_party/gldc/src/state.c | 3 --- 12 files changed, 68 insertions(+), 93 deletions(-) diff --git a/misc/dreamcast/Makefile b/misc/dreamcast/Makefile index d52976a2c..17b27ac69 100644 --- a/misc/dreamcast/Makefile +++ b/misc/dreamcast/Makefile @@ -4,6 +4,8 @@ SOURCE_DIRS := src third_party/bearssl/src C_FILES := $(foreach dir,$(SOURCE_DIRS),$(wildcard $(dir)/*.c)) OBJS := $(addprefix $(BUILD_DIR)/, $(notdir $(C_FILES:%.c=%.o))) CFLAGS :=-g -O1 -pipe -fno-math-errno -Ithird_party/bearssl/inc +LDFLAGS=-g +LIBS=-lm TARGET := ClassiCube-dc @@ -24,7 +26,7 @@ $(BUILD_DIR)/%.o: third_party/bearssl/src/%.c $(TARGET).elf: $(OBJS) - kos-cc $^ -o $@ + kos-cc $(LDFLAGS) $^ -o $@ $(LIBS) $(TARGET).bin: $(TARGET).elf sh-elf-objcopy -R .stack -O binary $(TARGET).elf $(TARGET).bin diff --git a/misc/dreamcast/boot_logo.png b/misc/dreamcast/boot_logo.png index 7a3ce03ce32676ccb84037d76a829984c6a7d601..eb243c85d9ac359dd4a0dab67581484f4fc9833d 100644 GIT binary patch delta 3972 zcmZ{nbyU-V*TzSWMq;!$B}GCoNGB*IsUo0*Q34_j(qms@v=YJyX;4s527;uF6iJ65 zC5#y1MoQyG{CMBB6C&!BsDpAa`PD) zay;i+il}^hf)m8-i8bD6)-MnBP}bwm{cf(uw<_eNXpnd(KY#OYjB45t1RL0{O%DGg zXbPWcK;d3#jOjDS4gj3s1bH3>&f42Cf|HDV8?$Lv(w$S zK9CKRd#&G>fIZIII<38hB!A;dW70}q?c@Ku6wG~a1$}wx0TWKiEkV-5H1Y%Q?NcBs z&?wL5$S|*2dwlyL%(s;&Yr5mK2$VW!;t=(11}Sga?z|P-!nBAE99clUR$IEUngxjZ zzTX2mN#t=|+>UF8mqFrf=kK9?{�ic9~@u6uEYEb2t@nt9s*NjLNN#dZt2vp!Eg5 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%0Dh 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 h: yx_yx_xx_xx - // e.g. h > w: yx_yx_yy_yy + // Twiddled index looks like this (lowest numbered bits are leftmost): + // - w = h: yxyx yxyx + // - w > h: yxyx xxxx + // - h > w: yxyx yyyy // And can therefore be broken down into two components: // 1) interleaved lower bits // 2) masked and then shifted higher bits @@ -484,8 +486,6 @@ static CC_NOINLINE void UnshiftTextureCoords(int count) { static void Gfx_FreeState(void) { FreeDefaultResources(); } static void Gfx_RestoreState(void) { InitDefaultResources(); - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); gfx_format = -1; glAlphaFunc(GL_GREATER, 0.5f); @@ -519,10 +519,8 @@ void Gfx_SetVertexFormat(VertexFormat fmt) { gfx_stride = strideSizes[fmt]; if (fmt == VERTEX_FORMAT_TEXTURED) { - glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnable(GL_TEXTURE_2D); } else { - glDisableClientState(GL_TEXTURE_COORD_ARRAY); glDisable(GL_TEXTURE_2D); } } diff --git a/src/Graphics_GCWii.c b/src/Graphics_GCWii.c index c34b7f983..ca9b9871d 100644 --- a/src/Graphics_GCWii.c +++ b/src/Graphics_GCWii.c @@ -48,12 +48,13 @@ static void InitGX(void) { } void Gfx_Create(void) { + if (!Gfx.Created) InitGX(); + Gfx.MaxTexWidth = 512; Gfx.MaxTexHeight = 512; Gfx.Created = true; gfx_vsync = true; - InitGX(); Gfx_RestoreState(); } diff --git a/src/Window_GCWii.c b/src/Window_GCWii.c index 357f7cd38..bc74a72c4 100644 --- a/src/Window_GCWii.c +++ b/src/Window_GCWii.c @@ -16,6 +16,7 @@ #include #endif +static cc_bool needsFBUpdate; static cc_bool launcherMode; static void* xfb; static GXRModeObj* rmode; @@ -31,13 +32,7 @@ static void OnPowerOff(void) { WindowInfo.Exists = false; Window_Close(); } - -void Window_Init(void) { - // TODO: SYS_SetResetCallback(reload); too? not sure how reset differs on GC/WII - #if defined HW_RVL - SYS_SetPowerCallback(OnPowerOff); - #endif - +static void InitVideo(void) { // Initialise the video system VIDEO_Init(); @@ -61,6 +56,14 @@ void Window_Init(void) { VIDEO_Flush(); // Wait for Video setup to complete VIDEO_WaitVSync(); +} + +void Window_Init(void) { + // TODO: SYS_SetResetCallback(reload); too? not sure how reset differs on GC/WII + #if defined HW_RVL + SYS_SetPowerCallback(OnPowerOff); + #endif + InitVideo(); DisplayInfo.Width = rmode->fbWidth; DisplayInfo.Height = rmode->xfbHeight; @@ -81,8 +84,14 @@ void Window_Init(void) { PAD_Init(); } -void Window_Create2D(int width, int height) { launcherMode = true; } -void Window_Create3D(int width, int height) { launcherMode = false; } +void Window_Create2D(int width, int height) { + needsFBUpdate = true; + launcherMode = true; +} + +void Window_Create3D(int width, int height) { + launcherMode = false; +} void Window_Close(void) { Event_RaiseVoid(&WindowEvents.Closing); @@ -465,6 +474,13 @@ static u32 CvtRGB (u8 r1, u8 g1, u8 b1, u8 r2, u8 g2, u8 b2) } void Window_DrawFramebuffer(Rect2D r) { + // When coming back from the 3D game, framebuffer might have changed + if (needsFBUpdate) { + VIDEO_SetNextFramebuffer(xfb); + VIDEO_Flush(); + needsFBUpdate = false; + } + VIDEO_WaitVSync(); r.X &= ~0x01; // round down to nearest even horizontal index diff --git a/third_party/gldc/Makefile b/third_party/gldc/Makefile index 10dcad132..e0949b7b9 100644 --- a/third_party/gldc/Makefile +++ b/third_party/gldc/Makefile @@ -24,5 +24,5 @@ default: $(TARGET) kos-cc $(C_DEFINES) $(C_INCLUDES) $(C_FLAGS) -c $< -o $@ $(TARGET): $(OBJS) - kos-ar cr $@ $< + kos-ar cr $@ $^ kos-ranlib $@ diff --git a/third_party/gldc/include/gldc.h b/third_party/gldc/include/gldc.h index 832f22850..2d2993cba 100644 --- a/third_party/gldc/include/gldc.h +++ b/third_party/gldc/include/gldc.h @@ -97,11 +97,6 @@ __BEGIN_DECLS /* Fog */ #define GL_FOG 0x0004 /* capability bit */ -/* Client state caps */ -#define GL_VERTEX_ARRAY 0x8074 -#define GL_COLOR_ARRAY 0x8076 -#define GL_TEXTURE_COORD_ARRAY 0x8078 - #define GL_FRONT_AND_BACK 0x0408 #define GL_FRONT 0x0404 #define GL_BACK 0x0405 @@ -126,9 +121,6 @@ __BEGIN_DECLS #define GL_INVALID_OPERATION 0x0502 #define GL_OUT_OF_MEMORY 0x0505 -/* GetPName */ -#define GL_MAX_TEXTURE_SIZE 0x0D33 - /* StringName */ #define GL_VENDOR 0x1F00 #define GL_RENDERER 0x1F01 @@ -259,9 +251,6 @@ GLAPI void glVertexPointer(GLint size, GLenum type, GLAPI void glDrawArrays(GLenum mode, GLint first, GLsizei count); GLAPI void glDrawElements(GLenum mode, GLsizei count, GLenum type, const GLvoid *indices); -GLAPI void glEnableClientState(GLenum cap); -GLAPI void glDisableClientState(GLenum cap); - /* Transformation / Matrix Functions */ GLAPI void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); diff --git a/third_party/gldc/src/draw.c b/third_party/gldc/src/draw.c index d72f072a5..c5cf11164 100644 --- a/third_party/gldc/src/draw.c +++ b/third_party/gldc/src/draw.c @@ -10,7 +10,6 @@ static void* VERTEX_PTR; static GLsizei VERTEX_STRIDE; -static GLuint ENABLED_VERTEX_ATTRIBUTES; extern GLboolean AUTOSORT_ENABLED; @@ -59,7 +58,7 @@ static void generateQuads(SubmissionTarget* target, const GLsizei first, const G /* Copy the pos, uv and color directly in one go */ const GLubyte* pos = VERTEX_PTR; - const GLubyte* uv = (ENABLED_VERTEX_ATTRIBUTES & UV_ENABLED_FLAG) ? VERTEX_PTR : NULL; + const GLubyte* uv = TEXTURES_ENABLED ? VERTEX_PTR : NULL; const GLubyte* col = VERTEX_PTR; Vertex* dst = start; @@ -332,43 +331,7 @@ void APIENTRY glDrawArrays(GLenum mode, GLint first, GLsizei count) { submitVertices(mode, first, count); } -void APIENTRY glEnableClientState(GLenum cap) { - TRACE(); - - switch(cap) { - case GL_VERTEX_ARRAY: - ENABLED_VERTEX_ATTRIBUTES |= VERTEX_ENABLED_FLAG; - break; - case GL_COLOR_ARRAY: - ENABLED_VERTEX_ATTRIBUTES |= DIFFUSE_ENABLED_FLAG; - break; - case GL_TEXTURE_COORD_ARRAY: - ENABLED_VERTEX_ATTRIBUTES |= UV_ENABLED_FLAG; - break; - default: - _glKosThrowError(GL_INVALID_ENUM, __func__); - } -} - -void APIENTRY glDisableClientState(GLenum cap) { - TRACE(); - - switch(cap) { - case GL_VERTEX_ARRAY: - ENABLED_VERTEX_ATTRIBUTES &= ~VERTEX_ENABLED_FLAG; - break; - case GL_COLOR_ARRAY: - ENABLED_VERTEX_ATTRIBUTES &= ~DIFFUSE_ENABLED_FLAG; - break; - case GL_TEXTURE_COORD_ARRAY: - ENABLED_VERTEX_ATTRIBUTES &= ~UV_ENABLED_FLAG; - break; - default: - _glKosThrowError(GL_INVALID_ENUM, __func__); - } -} - void APIENTRY glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid * pointer) { VERTEX_PTR = pointer; VERTEX_STRIDE = stride; -} +} \ No newline at end of file diff --git a/third_party/gldc/src/private.h b/third_party/gldc/src/private.h index 9ebba2332..929a3d832 100644 --- a/third_party/gldc/src/private.h +++ b/third_party/gldc/src/private.h @@ -41,8 +41,6 @@ extern void* memcpy4 (void *dest, const void *src, size_t count); #define ST_ENABLED_FLAG (1 << 2) #define DIFFUSE_ENABLED_FLAG (1 << 3) -#define MAX_TEXTURE_SIZE 1024 - typedef struct { unsigned int flags; /* Constant PVR_CMD_USERCLIP */ unsigned int d1, d2, d3; /* Ignored for this type */ diff --git a/third_party/gldc/src/state.c b/third_party/gldc/src/state.c index 0c06ba4fa..5d6f94e8b 100644 --- a/third_party/gldc/src/state.c +++ b/third_party/gldc/src/state.c @@ -467,9 +467,6 @@ void _glApplyScissor(bool force) { void APIENTRY glGetIntegerv(GLenum pname, GLint *params) { switch(pname) { - case GL_MAX_TEXTURE_SIZE: - *params = MAX_TEXTURE_SIZE; - break; case GL_TEXTURE_FREE_MEMORY_ATI: case GL_FREE_TEXTURE_MEMORY_KOS: *params = _glFreeTextureMemory(); From 81e544c42505876c4110b228997fd5015d0e9bfd Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Fri, 29 Sep 2023 15:48:27 +1000 Subject: [PATCH 3/3] Fix PSP and Vita too sort of work too --- src/Graphics_PSP.c | 22 ++++++++++++++++------ src/Graphics_PSVita.c | 34 +++++++++++++++++++++++----------- third_party/gldc/src/private.h | 27 --------------------------- 3 files changed, 39 insertions(+), 44 deletions(-) diff --git a/src/Graphics_PSP.c b/src/Graphics_PSP.c index 17f7d1f5f..f3282ae6c 100644 --- a/src/Graphics_PSP.c +++ b/src/Graphics_PSP.c @@ -72,10 +72,23 @@ static void guInit(void) { static GfxResourceID white_square; void Gfx_Create(void) { + if (!Gfx.Created) guInit(); + Gfx.MaxTexWidth = 512; Gfx.MaxTexHeight = 512; Gfx.Created = true; - guInit(); + gfx_vsync = true; + + Gfx_RestoreState(); +} + +void Gfx_Free(void) { + Gfx_FreeState(); +} + +cc_bool Gfx_TryRestoreContext(void) { return true; } + +void Gfx_RestoreState(void) { InitDefaultResources(); // 1x1 dummy white texture @@ -85,14 +98,11 @@ void Gfx_Create(void) { white_square = Gfx_CreateTexture(&bmp, 0, false); } -void Gfx_Free(void) { +void Gfx_FreeState(void) { FreeDefaultResources(); Gfx_DeleteTexture(&white_square); } -cc_bool Gfx_TryRestoreContext(void) { return true; } -void Gfx_RestoreState(void) { } -void Gfx_FreeState(void) { } #define GU_Toggle(cap) if (enabled) { sceGuEnable(cap); } else { sceGuDisable(cap); } /*########################################################################################################################* @@ -424,4 +434,4 @@ void Gfx_DrawIndexedTris_T2fC4b(int verticesCount, int startVertex) { sceGuDrawArray(GU_TRIANGLES, gfx_fields | GU_INDEX_16BIT, ICOUNT(verticesCount), gfx_indices, gfx_vertices + startVertex * SIZEOF_VERTEX_TEXTURED); } -#endif \ No newline at end of file +#endif diff --git a/src/Graphics_PSVita.c b/src/Graphics_PSVita.c index badff855d..a1aaaf2c3 100644 --- a/src/Graphics_PSVita.c +++ b/src/Graphics_PSVita.c @@ -523,11 +523,7 @@ static void SetDefaultStates(void) { sceGxmSetBackDepthFunc(gxm_context, SCE_GXM_DEPTH_FUNC_LESS_EQUAL); } -void Gfx_Create(void) { - Gfx.MaxTexWidth = 512; - Gfx.MaxTexHeight = 512; - Gfx.Created = true; - +static void InitGPU(void) { InitGXM(); AllocRingBuffers(); AllocGXMContext(); @@ -547,13 +543,33 @@ void Gfx_Create(void) { AllocTexturedVertexProgram(1); CreateFragmentPrograms(3, gxm_textured_FP, gxm_textured_VP); CreateFragmentPrograms(9, gxm_textured_alpha_FP, gxm_textured_VP); +} + +void Gfx_Create(void) { + if (!Gfx.Created) InitGPU(); + + Gfx.MaxTexWidth = 512; + Gfx.MaxTexHeight = 512; + Gfx.Created = true; + gfx_vsync = true; Gfx_SetDepthTest(true); - InitDefaultResources(); Gfx_SetVertexFormat(VERTEX_FORMAT_COLOURED); frontBufferIndex = NUM_DISPLAY_BUFFERS - 1; backBufferIndex = 0; + Gfx_RestoreState(); +} + +void Gfx_Free(void) { + Gfx_FreeState(); +} + +cc_bool Gfx_TryRestoreContext(void) { return true; } + +void Gfx_RestoreState(void) { + InitDefaultResources(); + // 1x1 dummy white texture struct Bitmap bmp; BitmapCol pixels[1] = { BITMAPCOLOR_WHITE }; @@ -562,15 +578,11 @@ void Gfx_Create(void) { // TODO } -void Gfx_Free(void) { +void Gfx_FreeState(void) { FreeDefaultResources(); Gfx_DeleteTexture(&white_square); } -cc_bool Gfx_TryRestoreContext(void) { return true; } -void Gfx_RestoreState(void) { } -void Gfx_FreeState(void) { } - /*########################################################################################################################* *--------------------------------------------------------GPU Textures-----------------------------------------------------* diff --git a/third_party/gldc/src/private.h b/third_party/gldc/src/private.h index 929a3d832..af37a655d 100644 --- a/third_party/gldc/src/private.h +++ b/third_party/gldc/src/private.h @@ -36,11 +36,6 @@ extern void* memcpy4 (void *dest, const void *src, size_t count); #define TRACE_ENABLED 0 #define TRACE() if(TRACE_ENABLED) {fprintf(stderr, "%s\n", __func__);} (void) 0 -#define VERTEX_ENABLED_FLAG (1 << 0) -#define UV_ENABLED_FLAG (1 << 1) -#define ST_ENABLED_FLAG (1 << 2) -#define DIFFUSE_ENABLED_FLAG (1 << 3) - typedef struct { unsigned int flags; /* Constant PVR_CMD_USERCLIP */ unsigned int d1, d2, d3; /* Ignored for this type */ @@ -206,22 +201,6 @@ GLubyte _glInitTextures(); void _glUpdatePVRTextureContext(PolyContext* context, GLshort textureUnit); -typedef struct { - const void* ptr; // 4 - GLenum type; // 4 - GLsizei stride; // 4 - GLint size; // 4 -} AttribPointer; - -typedef struct { - AttribPointer vertex; // 16 - AttribPointer colour; // 32 - AttribPointer uv; // 48 - AttribPointer st; // 64 - AttribPointer normal; // 80 - AttribPointer padding; // 96 -} AttribPointerList; - GLboolean _glCheckValidEnum(GLint param, GLint* values, const char* func); GLenum _glGetShadeModel(); @@ -287,12 +266,6 @@ GL_FORCE_INLINE void _glKosResetError() { sprintf(ERROR_FUNCTION, "\n"); } -typedef struct { - float n[3]; // 12 bytes - float finalColour[4]; //28 bytes - uint32_t padding; // 32 bytes -} EyeSpaceData; - unsigned char _glIsClippingEnabled(); void _glEnableClipping(unsigned char v);