From ebccaedb937b0da4c835c58c3a34e36ab5306246 Mon Sep 17 00:00:00 2001
From: Luke Benstead <kazade@gmail.com>
Date: Sun, 28 Mar 2021 14:33:56 +0100
Subject: [PATCH] Start restructuring and switching to CMake

---
 .gitignore                    |   1 +
 CMakeLists.txt                |  30 ++++++++++
 GL/platform.h                 |   7 +++
 GL/platforms/sh4.c            |   0
 GL/platforms/sh4.h            |   9 +++
 GL/{ => platforms}/sh4_math.h |   0
 GL/platforms/x86.c            |   0
 GL/platforms/x86.h            |   4 ++
 GL/private.h                  | 100 +++++++++++++++++++++++++++++++---
 Makefile                      |  37 -------------
 10 files changed, 144 insertions(+), 44 deletions(-)
 create mode 100644 CMakeLists.txt
 create mode 100644 GL/platform.h
 create mode 100644 GL/platforms/sh4.c
 create mode 100644 GL/platforms/sh4.h
 rename GL/{ => platforms}/sh4_math.h (100%)
 create mode 100644 GL/platforms/x86.c
 create mode 100644 GL/platforms/x86.h
 delete mode 100644 Makefile

diff --git a/.gitignore b/.gitignore
index c1b78b3..5134efd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,3 +7,4 @@
 dc-build.sh
 .buildconfig
 GL/version.h
+build/*
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 0000000..7047c41
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,30 @@
+cmake_minimum_required(VERSION 3.0)
+project(GLdc)
+
+set(
+    SOURCES
+    GL/clip.c
+    GL/draw.c
+    GL/error.c
+    GL/flush.c
+    GL/fog.c
+    GL/framebuffer.c
+    GL/glu.c
+    GL/immediate.c
+    GL/lighting.c
+    GL/matrix.c
+    GL/profiler.c
+    GL/state.c
+    GL/texture.c
+    GL/util.c
+    GL/yalloc/yalloc.c
+)
+
+if(PLATFORM_DREAMCAST)
+set(SOURCES ${SOURCES} GL/platforms/sh4.c)
+else()
+set(SOURCES ${SOURCES} GL/platforms/x86.c)
+endif()
+
+add_library(GLdc ${SOURCES})
+
diff --git a/GL/platform.h b/GL/platform.h
new file mode 100644
index 0000000..6beb6f9
--- /dev/null
+++ b/GL/platform.h
@@ -0,0 +1,7 @@
+#pragma once
+
+#ifdef __DREAMCAST__
+#include "platforms/sh4.h"
+#else
+#include "platforms/x86.h"
+#endif
diff --git a/GL/platforms/sh4.c b/GL/platforms/sh4.c
new file mode 100644
index 0000000..e69de29
diff --git a/GL/platforms/sh4.h b/GL/platforms/sh4.h
new file mode 100644
index 0000000..ce25f1c
--- /dev/null
+++ b/GL/platforms/sh4.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include <dc/matrix.h>
+#include <dc/pvr.h>
+#include <dc/vec3f.h>
+#include <dc/fmath.h>
+#include <dc/matrix3d.h>
+
+#include "sh4_math.h"
diff --git a/GL/sh4_math.h b/GL/platforms/sh4_math.h
similarity index 100%
rename from GL/sh4_math.h
rename to GL/platforms/sh4_math.h
diff --git a/GL/platforms/x86.c b/GL/platforms/x86.c
new file mode 100644
index 0000000..e69de29
diff --git a/GL/platforms/x86.h b/GL/platforms/x86.h
new file mode 100644
index 0000000..af268d9
--- /dev/null
+++ b/GL/platforms/x86.h
@@ -0,0 +1,4 @@
+#pragma once
+
+#define MATH_Fast_Divide(n, d) (n / d)
+#define MATH_fmac(a, b, c) (a * b + c)
diff --git a/GL/private.h b/GL/private.h
index cf6f789..904686d 100644
--- a/GL/private.h
+++ b/GL/private.h
@@ -2,16 +2,12 @@
 #define PRIVATE_H
 
 #include <stdint.h>
-#include <dc/matrix.h>
-#include <dc/pvr.h>
-#include <dc/vec3f.h>
-#include <dc/fmath.h>
-#include <dc/matrix3d.h>
+
+#include "platform.h"
 
 #include "../include/gl.h"
 #include "../containers/aligned_vector.h"
 #include "../containers/named_array.h"
-#include "sh4_math.h"
 
 extern void* memcpy4 (void *dest, const void *src, size_t count);
 
@@ -90,9 +86,99 @@ typedef float Matrix4x4[16];
 #endif
 
 typedef struct {
-    pvr_poly_hdr_t hdr;
+    uint32_t cmd;
+    uint32_t mode1;
+    uint32_t mode2;
+    uint32_t mode3;
+    uint32_t d1;
+    uint32_t d2;
+    uint32_t d3;
+    uint32_t d4;
 } PVRHeader;
 
+typedef struct {
+    int     list_type;          /**< \brief Primitive list
+                                     \see   pvr_lists */
+    struct {
+        int     alpha;          /**< \brief Enable or disable alpha outside modifier
+                                     \see   pvr_alpha_switch */
+        int     shading;        /**< \brief Shading type
+                                     \see   pvr_shading_types */
+        int     fog_type;       /**< \brief Fog type outside modifier
+                                     \see   pvr_fog_types */
+        int     culling;        /**< \brief Culling mode
+                                     \see   pvr_cull_modes */
+        int     color_clamp;    /**< \brief Color clamp enable/disable outside modifier
+                                     \see   pvr_colclamp_switch */
+        int     clip_mode;      /**< \brief Clipping mode
+                                     \see   pvr_clip_modes */
+        int     modifier_mode;  /**< \brief Modifier mode */
+        int     specular;       /**< \brief Offset color enable/disable outside modifier
+                                     \see   pvr_offset_switch */
+        int     alpha2;         /**< \brief Enable/disable alpha inside modifier
+                                     \see   pvr_alpha_switch */
+        int     fog_type2;      /**< \brief Fog type inside modifier
+                                     \see   pvr_fog_types */
+        int     color_clamp2;   /**< \brief Color clamp enable/disable inside modifier
+                                     \see   pvr_colclamp_switch */
+    } gen;                      /**< \brief General parameters */
+    struct {
+        int     src;            /**< \brief Source blending mode outside modifier
+                                     \see   pvr_blend_modes */
+        int     dst;            /**< \brief Dest blending mode outside modifier
+                                     \see   pvr_blend_modes */
+        int     src_enable;     /**< \brief Source blending enable outside modifier
+                                     \see   pvr_blend_switch */
+        int     dst_enable;     /**< \brief Dest blending enable outside modifier
+                                     \see   pvr_blend_switch */
+        int     src2;           /**< \brief Source blending mode inside modifier
+                                     \see   pvr_blend_modes */
+        int     dst2;           /**< \brief Dest blending mode inside modifier
+                                     \see   pvr_blend_modes */
+        int     src_enable2;    /**< \brief Source blending mode inside modifier
+                                     \see   pvr_blend_switch */
+        int     dst_enable2;    /**< \brief Dest blending mode inside modifier
+                                     \see   pvr_blend_switch */
+    } blend;                    /**< \brief Blending parameters */
+    struct {
+        int     color;
+        int     uv;
+        int     modifier;
+    } fmt;
+    struct {
+        int     comparison;
+        int     write;
+    } depth;
+    struct {
+        int enable;
+        int filter;
+        int mipmap;
+        int mipmap_bias;
+        int uv_flip;
+        int uv_clamp;
+        int alpha;
+        int env;
+        int width;
+        int height;
+        int format;
+        void* base;
+    } txr;
+    struct {
+        int enable;
+        int filter;
+        int mipmap;
+        int mipmap_bias;
+        int uv_flip;
+        int uv_clamp;
+        int alpha;
+        int env;
+        int width;
+        int height;
+        int format;
+        void* base;
+    } txr2;
+} PVRState;
+
 typedef struct {
     unsigned int flags;      /* Constant PVR_CMD_USERCLIP */
     unsigned int d1, d2, d3; /* Ignored for this type */
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 0fa72f6..0000000
--- a/Makefile
+++ /dev/null
@@ -1,37 +0,0 @@
-# KallistiOS ##version##
-#
-# kos-ports/libgl Makefile
-# Copyright (C) 2013, 2014 Josh Pearson
-# Copyright (C) 2014 Lawrence Sebald
-# Copyright (C) 2020 Luke Benstead
-
-TARGET = libGLdc.a
-OBJS = GL/draw.o GL/flush.o GL/framebuffer.o GL/immediate.o GL/lighting.o GL/state.o GL/texture.o GL/glu.o GL/version.h
-OBJS += GL/matrix.o GL/fog.o GL/error.o GL/clip.o containers/stack.o containers/named_array.o containers/aligned_vector.o GL/profiler.o
-OBJS += GL/yalloc/yalloc.o
-
-SUBDIRS =
-
-KOS_CFLAGS += -ffast-math -Ofast -Iinclude
-
-GL/version.h:
-	rm -f $@
-	@printf '#pragma once\n#define GLDC_VERSION "$(shell git describe --abbrev=4 --dirty --always --tags)"\n' > $@
-
-link:
-	$(KOS_AR) rcs $(TARGET) $(OBJS)
-
-build: GL/version.h $(OBJS) link
-
-
-samples: build
-	$(KOS_MAKE) -C samples all
-
-defaultall: create_kos_link $(OBJS) subdirs linklib samples
-
-include $(KOS_BASE)/addons/Makefile.prefab
-
-# creates the kos link to the headers
-create_kos_link:
-	rm -f ../include/GL
-	ln -s ../GLdc/include ../include/GL