From a077eb38b01292611f4f6031b75e3e2c1c20f06e Mon Sep 17 00:00:00 2001 From: chai Date: Fri, 16 Aug 2019 08:54:08 +0800 Subject: *misc --- Source/modules/asura-core/Graphics/GfxDevice.h | 110 ++++++++++++++++++------- 1 file changed, 81 insertions(+), 29 deletions(-) (limited to 'Source/modules/asura-core/Graphics/GfxDevice.h') diff --git a/Source/modules/asura-core/Graphics/GfxDevice.h b/Source/modules/asura-core/Graphics/GfxDevice.h index 2b105df..7ef03a3 100644 --- a/Source/modules/asura-core/Graphics/GfxDevice.h +++ b/Source/modules/asura-core/Graphics/GfxDevice.h @@ -16,10 +16,40 @@ namespace_begin(AsuraEngine) namespace_begin(Graphics) +class Mesh; class Profiler; class Shader; class GPUBuffer; class Canvas; +class DynamicVBO; +class VBO; +class VBOList; + +#define GFX_STATS_PROPERTY(TYPE,PROP_NAME,VAR_NAME) \ +private: \ + TYPE VAR_NAME; \ +public: \ + void Set##PROP_NAME (TYPE val) { VAR_NAME = val; } \ + TYPE Get##PROP_NAME () {return VAR_NAME; } \ + void Add##PROP_NAME (TYPE v=1) { VAR_NAME+=v;}; + +struct GfxDeviceStats +{ + GFX_STATS_PROPERTY(uint, DrawCall, drawCall); ///< 统计drawcall + GFX_STATS_PROPERTY(uint, CanvasSwitch, canvasSwitch); ///< 切换texture的次数 + GFX_STATS_PROPERTY(uint, ShaderSwitch, shaderSwitch); ///< 切换shader的次数 + GFX_STATS_PROPERTY(uint64, PrimsCount, primsCount); ///< 图元数量统计 + + void Reset() + { + drawCall = 0; + canvasSwitch = 0; + shaderSwitch = 0; + primsCount = 0; + } +}; + +#undef GFX_STATS_PROPERTY enum MatrixMode { @@ -28,6 +58,20 @@ enum MatrixMode MATRIX_MODE_VIEW = 2, }; + +enum GfxPrimitiveType +{ + GFX_PRIMITIVE_TRIANGLES = 0, + GFX_PRIMITIVE_TRIANGLESTRIPDEPRECATED, + GFX_PRIMITIVE_QUADS, + GFX_PRIMITIVE_LINES, + GFX_PRIMITIVE_LINESTRIP, + GFX_PRIMITIVE_POINTS, + + GFX_PRIMITIVE_TYPECOUNT, // KEEP THIS LAST! + GFX_PRIMITIVE_FORCE32BITINT = 0X7FFFFFFF // FORCE 32 BIT ENUM SIZE +}; + enum GLParams { GL_PARAM_MAX_TEXTURE_UNIT = 1, @@ -44,12 +88,12 @@ public: int GetParam(GLParams param); - bool Init(const AEMath::Recti& viewport); + bool Init(const Recti& viewport); bool Inited(); - void SetViewport(const AEMath::Recti viewport); + void SetViewport(const Recti viewport); - const AEMath::Recti& GetViewport(); + const Recti& GetViewport(); void PushMatrix(); void PopMatrix(); @@ -63,10 +107,8 @@ public: uint GetMatrixDepth(); uint GetMatrixIndex(); - void DrawArrays(GLenum mode, GLint first, GLsizei count); - - AEMath::Matrix44& GetMatrix(MatrixMode mode); - AEMath::Matrix44 GetMVPMatrix(); + Matrix44& GetMatrix(MatrixMode mode); + Matrix44 GetMVPMatrix(); void SetDrawColor(float r, float g, float b, float a); Color& GetDrawColor(); @@ -74,36 +116,47 @@ public: void SetActiveShader(Shader* = NULL); Shader* GetActiveShader() const; + VBO* CreateVBO(); + void DeleteVBO(); + + void DrawMesh(Mesh* mesh); + void DrawVBO(VBO* vbo); + void DrawDynamicVBO(); + void DrawTexture(Texture*); + void WipeError(); bool HasError(); GLenum GetError(); - GET_SET(MatrixMode, MatrixMode, state.matrixMode); - GET_SET(Canvas*, ActiveCanvas, state.canvas); + GET_SET(MatrixMode, MatrixMode, m_State.matrixMode); + GET_SET(Canvas*, ActiveCanvas, m_State.activeCanvas); private: + void BeforeDrawCall(); + + // Callbacks + void OnCreateVBO(VBO* vbo); + void OnDeleteVBO(VBO* vbo); + friend class Profiler; - struct - { - AEMath::Recti viewport; ///< 当前的视区,在切换HDC或者本窗口大小改变或者部分刷新时变动 - MatrixStack matrix[3]; ///< model, view, projection矩阵 - MatrixMode matrixMode; ///< 当前操作的矩阵 - Color drawColor; ///< 绘制的颜色 - Canvas* canvas; ///< 当前canvas - Shader* shader; ///< 当前使用的shader - } state; + struct { + Recti viewport; ///< 当前的视区,在切换HDC或者本窗口大小改变或者部分刷新时变动 + MatrixStack matrix[3]; ///< model, view, projection矩阵 + MatrixMode matrixMode; ///< 当前操作的矩阵 + Color drawColor; ///< 绘制的颜色 + Canvas* activeCanvas; ///< 当前canvas + Shader* activeShader; ///< 当前使用的shader + } m_State; #if ASURA_GL_PROFILE - struct - { - uint drawCall; ///< 统计drawcall - uint canvasSwitch; ///< 切换texture的次数 - uint shaderSwitch; ///< 切换shader的次数 - } stats; + GfxDeviceStats m_Stats; #endif + DynamicVBO* m_DynamicVBO; + VBOList* m_VBOList; + luaxport: LUAX_DECL_SINGLETON(GfxDevice); @@ -127,13 +180,12 @@ luaxport: }; -extern GfxDevice g_Device; - - -#define GL_CALL(x) do { x; /*GLAssert(); */} while(0) - +// 全局gfx device,runner和editor都适用 +extern GfxDevice g_GfxDevice; +inline GfxDevice& GetGfxDevice() { return g_GfxDevice; }; +#define GL_CALL(f, ...) do { f(__VA_ARGS__); /*GLAssert(); */} while(0) namespace_end namespace_end -- cgit v1.1-26-g67d0