Path: blob/master/libmupen64plus/mupen64plus-video-z64/src/rgl.h
2 views
/*1* z642*3* Copyright (C) 2007 ziggy4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* (at your option) any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License along16* with this program; if not, write to the Free Software Foundation, Inc.,17* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.18*19**/2021#ifndef _RGL_H_22#define _RGL_H_2324#include "queue.h"25#include "rgl_assert.h"26#include "rdp.h"2728#include <glew.h>29#if defined(__MACOSX__)30#include <OpenGL/gl.h>31#elif defined(__MACOS__)32#include <gl.h>33#else34#include <GL/gl.h>35#endif3637#ifdef RDP_DEBUG38//#include <IL/il.h>39#endif4041#include "glshader.h"4243#include <limits.h> //for PATH_MAX4445#define DWORD unsigned int46extern GFX_INFO gfx;47#define rdram ((uint32_t*)gfx.RDRAM)48#define rsp_imem ((uint32_t*)gfx.IMEM)49#define rsp_dmem ((uint32_t*)gfx.DMEM)50#define vi_origin (*(uint32_t*)gfx.VI_ORIGIN_REG)51#define vi_width (*(uint32_t*)gfx.VI_WIDTH_REG)52#define vi_control (*(uint32_t*)gfx.VI_STATUS_REG)5354#define dp_start (*(uint32_t*)gfx.DPC_START_REG)55#define dp_end (*(uint32_t*)gfx.DPC_END_REG)56#define dp_current (*(uint32_t*)gfx.DPC_CURRENT_REG)57#define dp_status (*(uint32_t*)gfx.DPC_STATUS_REG)5859// highly experimental AND slow60//#define RGL_EXACT_BLEND6162struct rglSettings_t {63int hiresFb;64int resX, resY;65int fsResX, fsResY;66int fbInfo;67int forceSwap;68int threaded;69int async;70int noNpotFbos;71int lowres;72int fullscreen;73};7475extern rglSettings_t rglSettings;76extern void (*render_callback)(int);7778struct rglDepthBuffer_t {79uint32_t address;80int width, height;81GLuint zbid;82};83#define MAX_DEPTH_BUFFERS 1684extern rglDepthBuffer_t zBuffers[MAX_DEPTH_BUFFERS];85extern int nbZBuffers;8687struct rglRenderBuffer_t;88struct rglDepthSection_t {89rglRenderBuffer_t * buffer;90int chunkId;91};92#define RGL_MAX_DEPTH_SECTIONS 169394struct rglRenderBuffer_t {95CIRCLEQ_ENTRY(rglRenderBuffer_t) link;96uint32_t addressStart, addressStop;97int format, size, fbWidth, line;98int width, height;99int flags;100GLuint texid, fbid;101#ifdef RGL_EXACT_BLEND102GLuint texid2, fbid2;103#endif104int realWidth, realHeight;105int fboWidth, fboHeight;106int redimensionStamp;107rdpRect_t area;108rdpRect_t mod;109rglDepthBuffer_t * depthBuffer;110int chunkId;111rglDepthSection_t depthSections[16];112int nbDepthSections;113};114#define RGL_RB_DEPTH 1115#define RGL_RB_FULL 2116#define RGL_RB_ERASED 4117#define RGL_RB_FBMOD 8 // the GL framebuffer was modified118#define RGL_RB_RAMMOD 16 // the framebuffer was modified in rdram119#define RGL_RB_HASTRIANGLES 32 // we assume it's not a depth buffer in this case120121CIRCLEQ_HEAD(rglRenderBufferHead_t, rglRenderBuffer_t);122123#define MAX_RENDER_BUFFERS 64124extern rglRenderBuffer_t rBuffers[MAX_RENDER_BUFFERS];125extern int nbRBuffers;126extern rglRenderBuffer_t * curRBuffer;127extern rglRenderBuffer_t * curZBuffer;128extern rglRenderBufferHead_t rBufferHead;129130extern int rglTexCacheCounter;131struct rglTexture_t {132CIRCLEQ_ENTRY(rglTexture_t) byCrc, byUsage;133GLuint id, zid;134uint32_t crc;135int w, h, fmt;136int clipw, cliph;137GLuint ws, wt, filter; // current settings138};139CIRCLEQ_HEAD(rglTextureHead_t, rglTexture_t);140#define RGL_TEX_CACHE_SIZE 1024141extern rglTexture_t rglTextures[RGL_TEX_CACHE_SIZE];142struct rglTexCache_t {143int counter;144rglTexture_t * tex;145};146extern rglTexCache_t rglTexCache[0x1000];147extern uint8_t rglTmpTex[];148extern uint8_t rglTmpTex2[];149150struct rglTile_t : public rdpTile_t {151rglTexture_t * tex;152rglRenderBuffer_t * hiresBuffer;153uint32_t hiresAddress;154GLuint ws, wt; // GL clamping modes155GLuint filter; // GL filter mode156};157158struct rglVertex_t {159float x, y, z, w;160float s, t;161uint8_t r, g, b, a;162};163164struct rglStrip_t {165int tilenum;166int nbVtxs;167int flags;168rglVertex_t * vtxs;169};170171#define RGL_STRIP_TEX1 1172#define RGL_STRIP_TEX2 2173#define RGL_STRIP_SHADE 4174#define RGL_STRIP_ZBUFFER 8175176struct rglRenderChunk_t {177rdpState_t rdpState;178rglTile_t tiles[8];179rglRenderBuffer_t * renderBuffer;180uint32_t depthAddress;181int flags;182int nbStrips;183rglStrip_t * strips;184#ifdef RDP_DEBUG185rglShader_t * shader;186int tracePos;187#endif188};189190// first 8 bits used for tile usage191#define RGL_CHUNK_CLEAR (1<<8)192193#define MAX_RENDER_CHUNKS 40000194extern rglRenderChunk_t chunks[MAX_RENDER_CHUNKS];195extern rglRenderChunk_t * curChunk;196extern int nbChunks;197198#define MAX_STRIPS 80000199extern rglStrip_t strips[MAX_STRIPS];200extern rglVertex_t vtxs[6*MAX_STRIPS];201extern int nbStrips, nbVtxs;202203struct rglRenderMode_t {204rdpOtherModes_t otherModes;205rdpCombineModes_t combineModes;206uint32_t flags;207};208209#define RGL_RM_DEPTH 1210211// TODO use a hash table212#define MAX_RENDER_MODES 1024213extern rglRenderMode_t renderModesDb[MAX_RENDER_MODES];214extern int nbRenderModes;215216extern rglShader_t * rglCopyShader;217extern rglShader_t * rglCopyDepthShader;218219220#define RGL_COMB_FMT_RGBA 0221#define RGL_COMB_FMT_I 1222#define RGL_COMB_FMT_DEPTH 2223#define RGL_COMB_FMT 3224#define RGL_COMB_IN0_DEPTH 4225#define RGL_COMB_IN0 4226#define RGL_COMB_IN1_DEPTH 8227#define RGL_COMB_IN1 8228#define RGL_COMB_TILE7 16229230extern volatile int rglStatus, rglNextStatus;231#define RGL_STATUS_CLOSED 0232#define RGL_STATUS_WINDOWED 1233#define RGL_STATUS_FULLSCREEN 2234235236void rglUpdateStatus();237void rglTouchTMEM();238void rglResetTextureCache();239void rglTile(rdpTile_t & tile, rglTile_t & rtile, int recth);240void rglRenderMode(rglRenderChunk_t & chunk);241void rglBlender(rglRenderChunk_t & chunk);242void rglClearCombiners();243void rglSetCombiner(rglRenderChunk_t & chunk, int format);244void rglPrepareRendering(int texturing, int tilenum, int recth, int depth);245rglRenderBuffer_t * rglSelectRenderBuffer(uint32_t addr, int width, int size, int format);246char * rglCombiner2String(rdpState_t & state);247248249int rglInit();250void rglClose();251int rglOpenScreen();252void rglCloseScreen();253int rglReadSettings();254void rglUpdate();255void rglFullSync();256void rglTextureRectangle(rdpTexRect_t * rect, int flip);257void rglFillRectangle(rdpRect_t * rect);258void rglTriangle(uint32_t w1, uint32_t w2, int shade, int texture, int zbuffer,259uint32_t * rdp_cmd);260void rglRenderChunks();261void rglDisplayFramebuffers();262int rglT1Usage(rdpState_t & state);263int rglT2Usage(rdpState_t & state);264void rglDebugger();265void rglCloseDebugger();266void rglFramebuffer2Rdram(rglRenderBuffer_t & buffer, uint32_t start, uint32_t stop);267void rglRdram2Framebuffer(rglRenderBuffer_t & buffer, uint32_t start, uint32_t stop);268void rglRenderChunks(rglRenderBuffer_t * upto);269void rglRenderChunks(int upto);270float rglZscale(uint16_t z);271272void rglSwapBuffers();273274extern int screen_width, screen_height;275276extern void check();277278#endif279280281