#pragma once

#include "gl.h"

__BEGIN_DECLS

extern const char* GLDC_VERSION;


/*
 * Dreamcast specific compressed + twiddled formats.
 * We use constants from the range 0xEEE0 onwards
 * to avoid trampling any real GL constants (this is in the middle of the
 * any_vendor_future_use range defined in the GL enum.spec file.
*/
#define GL_UNSIGNED_SHORT_5_6_5_TWID_KOS            0xEEE0
#define GL_UNSIGNED_SHORT_1_5_5_5_REV_TWID_KOS      0xEEE2
#define GL_UNSIGNED_SHORT_4_4_4_4_REV_TWID_KOS      0xEEE3

#define GL_COMPRESSED_RGB_565_VQ_KOS                0xEEE4
#define GL_COMPRESSED_ARGB_1555_VQ_KOS              0xEEE6
#define GL_COMPRESSED_ARGB_4444_VQ_KOS              0xEEE7

#define GL_COMPRESSED_RGB_565_VQ_TWID_KOS           0xEEE8
#define GL_COMPRESSED_ARGB_1555_VQ_TWID_KOS         0xEEEA
#define GL_COMPRESSED_ARGB_4444_VQ_TWID_KOS         0xEEEB

#define GL_COMPRESSED_RGB_565_VQ_MIPMAP_KOS                0xEEEC
#define GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_KOS              0xEEED
#define GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_KOS              0xEEEE

#define GL_COMPRESSED_RGB_565_VQ_MIPMAP_TWID_KOS           0xEEEF
#define GL_COMPRESSED_ARGB_1555_VQ_MIPMAP_TWID_KOS         0xEEF0
#define GL_COMPRESSED_ARGB_4444_VQ_MIPMAP_TWID_KOS         0xEEF1

#define GL_NEARZ_CLIPPING_KOS                       0xEEFA


/* Initialize the GL pipeline. GL will initialize the PVR. */
GLAPI void APIENTRY glKosInit();

typedef struct {
    /* If GL_TRUE, enables pvr autosorting, this *will* break glDepthFunc/glDepthTest */
    GLboolean autosort_enabled;

    /* If GL_TRUE, enables the PVR FSAA */
    GLboolean fsaa_enabled;

    /* The internal format for paletted textures, must be GL_RGBA4 (default) or GL_RGBA8 */
    GLenum internal_palette_format;

    /* Initial capacity of each of the OP, TR and PT lists in vertices */
    GLuint initial_op_capacity;
    GLuint initial_tr_capacity;
    GLuint initial_pt_capacity;
    GLuint initial_immediate_capacity;

    /* Default: True
     *
     * Whether glTexImage should automatically twiddle textures
     * if the internal format is a generic format (e.g. GL_RGB).
     * this is the same as calling glEnable(GL_TEXTURE_TWIDDLE_KOS)
     * on boot */
    GLboolean texture_twiddle;
} GLdcConfig;


typedef struct {
    GLuint padding0;
    GLfloat x;
    GLfloat y;
    GLfloat z;
    GLfloat u;
    GLfloat v;
    GLubyte bgra[4];
    GLuint padding1;
} GLVertexKOS;

GLAPI void APIENTRY glVertexPackColor3fKOS(GLVertexKOS* vertex, float r, float g, float b);
GLAPI void APIENTRY glVertexPackColor4fKOS(GLVertexKOS* vertex, float r, float g, float b, float a);

GLAPI void APIENTRY glKosInitConfig(GLdcConfig* config);

/* Usage:
 *
 * GLdcConfig config;
 * glKosInitConfig(&config);
 *
 * config.autosort_enabled = GL_TRUE;
 *
 * glKosInitEx(&config);
 */
GLAPI void APIENTRY glKosInitEx(GLdcConfig* config);
GLAPI void APIENTRY glKosSwapBuffers();
GLAPI void APIENTRY glKosShutdown();

/*
 * CUSTOM EXTENSION multiple_shared_palette_KOS
 *
 * This extension allows using up to 4 different shared palettes
 * with ColorTableEXT. The following constants are provided
 * to use as targets for ColorTableExt:
 *
 * - SHARED_TEXTURE_PALETTE_0_KOS
 * - SHARED_TEXTURE_PALETTE_1_KOS
 * - SHARED_TEXTURE_PALETTE_2_KOS
 * - SHARED_TEXTURE_PALETTE_3_KOS
 *
 * In this use case SHARED_TEXTURE_PALETTE_0_KOS is interchangable with SHARED_TEXTURE_PALETTE_EXT
 * (both refer to the first shared palette).
 *
 * To select which palette a texture uses, a new pname is accepted by TexParameteri: SHARED_TEXTURE_BANK_KOS
 * by default textures use shared palette 0.
*/


#define GL_SHARED_TEXTURE_PALETTE_0_KOS             0xEEFC
#define GL_SHARED_TEXTURE_PALETTE_1_KOS             0xEEFD
#define GL_SHARED_TEXTURE_PALETTE_2_KOS             0xEEFE
#define GL_SHARED_TEXTURE_PALETTE_3_KOS             0xEEFF
#define GL_SHARED_TEXTURE_PALETTE_4_KOS             0xEF00
#define GL_SHARED_TEXTURE_PALETTE_5_KOS             0xEF01
#define GL_SHARED_TEXTURE_PALETTE_6_KOS             0xEF02
#define GL_SHARED_TEXTURE_PALETTE_7_KOS             0xEF03
#define GL_SHARED_TEXTURE_PALETTE_8_KOS             0xEF04
#define GL_SHARED_TEXTURE_PALETTE_9_KOS             0xEF05

#define GL_SHARED_TEXTURE_PALETTE_10_KOS             0xEF06
#define GL_SHARED_TEXTURE_PALETTE_11_KOS             0xEF07
#define GL_SHARED_TEXTURE_PALETTE_12_KOS             0xEF08
#define GL_SHARED_TEXTURE_PALETTE_13_KOS             0xEF09
#define GL_SHARED_TEXTURE_PALETTE_14_KOS             0xEF0A
#define GL_SHARED_TEXTURE_PALETTE_15_KOS             0xEF0B
#define GL_SHARED_TEXTURE_PALETTE_16_KOS             0xEF0C
#define GL_SHARED_TEXTURE_PALETTE_17_KOS             0xEF0D
#define GL_SHARED_TEXTURE_PALETTE_18_KOS             0xEF0E
#define GL_SHARED_TEXTURE_PALETTE_19_KOS             0xEF0F

#define GL_SHARED_TEXTURE_PALETTE_20_KOS             0xEF10
#define GL_SHARED_TEXTURE_PALETTE_21_KOS             0xEF11
#define GL_SHARED_TEXTURE_PALETTE_22_KOS             0xEF12
#define GL_SHARED_TEXTURE_PALETTE_23_KOS             0xEF13
#define GL_SHARED_TEXTURE_PALETTE_24_KOS             0xEF14
#define GL_SHARED_TEXTURE_PALETTE_25_KOS             0xEF15
#define GL_SHARED_TEXTURE_PALETTE_26_KOS             0xEF16
#define GL_SHARED_TEXTURE_PALETTE_27_KOS             0xEF17
#define GL_SHARED_TEXTURE_PALETTE_28_KOS             0xEF18
#define GL_SHARED_TEXTURE_PALETTE_29_KOS             0xEF19

#define GL_SHARED_TEXTURE_PALETTE_30_KOS             0xEF1A
#define GL_SHARED_TEXTURE_PALETTE_31_KOS             0xEF1B
#define GL_SHARED_TEXTURE_PALETTE_32_KOS             0xEF1C
#define GL_SHARED_TEXTURE_PALETTE_33_KOS             0xEF1D
#define GL_SHARED_TEXTURE_PALETTE_34_KOS             0xEF1E
#define GL_SHARED_TEXTURE_PALETTE_35_KOS             0xEF1F
#define GL_SHARED_TEXTURE_PALETTE_36_KOS             0xEF20
#define GL_SHARED_TEXTURE_PALETTE_37_KOS             0xEF21
#define GL_SHARED_TEXTURE_PALETTE_38_KOS             0xEF22
#define GL_SHARED_TEXTURE_PALETTE_39_KOS             0xEF23

#define GL_SHARED_TEXTURE_PALETTE_40_KOS             0xEF24
#define GL_SHARED_TEXTURE_PALETTE_41_KOS             0xEF25
#define GL_SHARED_TEXTURE_PALETTE_42_KOS             0xEF26
#define GL_SHARED_TEXTURE_PALETTE_43_KOS             0xEF27
#define GL_SHARED_TEXTURE_PALETTE_44_KOS             0xEF28
#define GL_SHARED_TEXTURE_PALETTE_45_KOS             0xEF29
#define GL_SHARED_TEXTURE_PALETTE_46_KOS             0xEF2A
#define GL_SHARED_TEXTURE_PALETTE_47_KOS             0xEF2B
#define GL_SHARED_TEXTURE_PALETTE_48_KOS             0xEF2C
#define GL_SHARED_TEXTURE_PALETTE_49_KOS             0xEF2D

#define GL_SHARED_TEXTURE_PALETTE_50_KOS             0xEF2E
#define GL_SHARED_TEXTURE_PALETTE_51_KOS             0xEF2F
#define GL_SHARED_TEXTURE_PALETTE_52_KOS             0xEF30
#define GL_SHARED_TEXTURE_PALETTE_53_KOS             0xEF31
#define GL_SHARED_TEXTURE_PALETTE_54_KOS             0xEF32
#define GL_SHARED_TEXTURE_PALETTE_55_KOS             0xEF33
#define GL_SHARED_TEXTURE_PALETTE_56_KOS             0xEF34
#define GL_SHARED_TEXTURE_PALETTE_57_KOS             0xEF35
#define GL_SHARED_TEXTURE_PALETTE_58_KOS             0xEF36
#define GL_SHARED_TEXTURE_PALETTE_59_KOS             0xEF37

#define GL_SHARED_TEXTURE_PALETTE_60_KOS             0xEF38
#define GL_SHARED_TEXTURE_PALETTE_61_KOS             0xEF39
#define GL_SHARED_TEXTURE_PALETTE_62_KOS             0xEF3A
#define GL_SHARED_TEXTURE_PALETTE_63_KOS             0xEF3B

/* Pass to glTexParameteri to set the shared bank */
#define GL_SHARED_TEXTURE_BANK_KOS                  0xEF3C

/* Memory allocation extension (GL_KOS_texture_memory_management) */
GLAPI GLvoid APIENTRY glDefragmentTextureMemory_KOS(void);

/* glGet extensions */
#define GL_FREE_TEXTURE_MEMORY_KOS                  0xEF3D
#define GL_USED_TEXTURE_MEMORY_KOS                  0xEF3E
#define GL_FREE_CONTIGUOUS_TEXTURE_MEMORY_KOS       0xEF3F

//for palette internal format (glfcConfig)
#define GL_RGB565_KOS                               0xEF40
#define GL_ARGB4444_KOS                             0xEF41
#define GL_ARGB1555_KOS                             0xEF42
#define GL_RGB565_TWID_KOS                          0xEF43
#define GL_ARGB4444_TWID_KOS                        0xEF44
#define GL_ARGB1555_TWID_KOS                        0xEF45
#define GL_COLOR_INDEX8_TWID_KOS                    0xEF46
#define GL_COLOR_INDEX4_TWID_KOS                    0xEF47
#define GL_RGB_TWID_KOS                             0xEF48
#define GL_RGBA_TWID_KOS                            0xEF49

/* glGet extensions */
#define GL_TEXTURE_INTERNAL_FORMAT_KOS              0xEF50

/* If enabled, will twiddle texture uploads where possible */
#define GL_TEXTURE_TWIDDLE_KOS                      0xEF51

__END_DECLS