2012-11-01 16:19:01 +01:00
// Copyright (c) 2012- PPSSPP Project.
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
2012-11-04 23:01:49 +01:00
// the Free Software Foundation, version 2.0 or later versions.
2012-11-01 16:19:01 +01:00
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License 2.0 for more details.
// A copy of the GPL 2.0 should have been included with the program.
// If not, see http://www.gnu.org/licenses/
// Official git repository and contact information can be found at
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/.
# pragma once
2012-11-19 23:29:14 +01:00
# include <list>
2012-11-19 21:23:29 +01:00
# include <vector>
2012-11-06 17:05:27 +01:00
# include "../GPUInterface.h"
2012-12-01 02:15:46 +01:00
# include "Framebuffer.h"
2012-12-21 19:16:17 +01:00
# include "VertexDecoder.h"
2012-11-19 23:29:14 +01:00
# include "gfx_es2/fbo.h"
2012-11-01 16:19:01 +01:00
class ShaderManager ;
2012-12-21 16:49:42 +01:00
class LinkedShader ;
2012-11-01 16:19:01 +01:00
2012-11-06 17:05:27 +01:00
class GLES_GPU : public GPUInterface
2012-11-01 16:19:01 +01:00
{
public :
2012-11-20 10:59:23 +01:00
GLES_GPU ( int renderWidth , int renderHeight ) ;
2012-11-19 23:29:14 +01:00
~ GLES_GPU ( ) ;
2012-11-20 10:59:23 +01:00
virtual void InitClear ( ) ;
2012-11-06 17:05:27 +01:00
virtual u32 EnqueueList ( u32 listpc , u32 stall ) ;
virtual void UpdateStall ( int listid , u32 newstall ) ;
virtual void ExecuteOp ( u32 op , u32 diff ) ;
virtual bool InterpretList ( ) ;
2012-11-06 18:14:09 +01:00
virtual void DrawSync ( int mode ) ;
2012-11-28 13:45:22 +01:00
virtual void Continue ( ) ;
virtual void Break ( ) ;
2012-11-18 13:04:49 +01:00
virtual void EnableInterrupts ( bool enable ) {
interruptsEnabled_ = enable ;
}
2012-11-19 21:23:29 +01:00
virtual void SetDisplayFramebuffer ( u32 framebuf , u32 stride , int format ) ;
virtual void CopyDisplayToOutput ( ) ;
virtual void BeginFrame ( ) ;
2012-11-26 17:35:08 +01:00
virtual void UpdateStats ( ) ;
2012-12-21 23:43:48 +01:00
virtual void InvalidateCache ( u32 addr , int size ) ;
2012-11-19 21:23:29 +01:00
2012-11-06 17:05:27 +01:00
private :
2012-11-26 17:35:08 +01:00
// TransformPipeline.cpp
2012-12-21 19:16:17 +01:00
void InitTransform ( ) ;
2012-11-28 13:45:22 +01:00
void TransformAndDrawPrim ( void * verts , void * inds , int prim , int vertexCount , float * customUV , int forceIndexType , int * bytesRead = 0 ) ;
2012-12-21 16:49:42 +01:00
//void SoftwareTransformAndDraw(int prim, LinkedShader *program, int forceIndexType, int vertexCount, void *inds, const DecVtxFormat &decVtxFormat, int indexLowerBound, int indexUpperBound, float *customUV);
2012-12-19 15:14:41 +01:00
void ApplyDrawState ( ) ;
2012-12-21 19:16:17 +01:00
void Flush ( ) ;
2012-11-26 20:38:26 +01:00
void UpdateViewportAndProjection ( ) ;
2012-11-26 17:35:08 +01:00
void DrawBezier ( int ucount , int vcount ) ;
2012-11-22 20:57:41 +01:00
void DoBlockTransfer ( ) ;
2012-11-06 17:05:27 +01:00
bool ProcessDLQueue ( ) ;
2012-11-26 20:38:26 +01:00
2012-12-19 15:14:41 +01:00
// Applies states for debugging if enabled.
void BeginDebugDraw ( ) ;
void EndDebugDraw ( ) ;
2012-12-01 02:15:46 +01:00
FramebufferManager framebufferManager ;
2012-11-26 20:38:26 +01:00
ShaderManager * shaderManager_ ;
2012-11-18 13:04:49 +01:00
bool interruptsEnabled_ ;
2012-11-19 21:23:29 +01:00
u32 displayFramebufPtr_ ;
u32 displayStride_ ;
int displayFormat_ ;
int renderWidth_ ;
int renderHeight_ ;
2012-11-26 17:35:08 +01:00
float renderWidthFactor_ ;
float renderHeightFactor_ ;
2012-11-19 23:29:14 +01:00
2012-11-19 21:23:29 +01:00
struct CmdProcessorState
{
u32 pc ;
u32 stallAddr ;
} ;
CmdProcessorState dcontext ;
int dlIdGenerator ;
struct DisplayList
{
int id ;
u32 listpc ;
u32 stall ;
} ;
std : : vector < DisplayList > dlQueue ;
u32 prev ;
u32 stack [ 2 ] ;
u32 stackptr ;
bool finished ;
2012-11-19 23:29:14 +01:00
struct VirtualFramebuffer {
u32 fb_address ;
u32 z_address ;
int fb_stride ;
int z_stride ;
// There's also a top left of the drawing region, but meh...
int width ;
int height ;
2012-11-19 21:23:29 +01:00
2012-11-19 23:29:14 +01:00
int format ; // virtual, right now they are all RGBA8888
FBO * fbo ;
} ;
void SetRenderFrameBuffer ( ) ; // Uses parameters computed from gstate
// TODO: Break out into some form of FBO manager
VirtualFramebuffer * GetDisplayFBO ( ) ;
std : : list < VirtualFramebuffer * > vfbs_ ;
VirtualFramebuffer * currentRenderVfb_ ;
u8 bezierBuf [ 16000 ] ;
2012-11-01 16:19:01 +01:00
} ;