open source

This commit is contained in:
lvfulong
2020-11-11 16:17:13 +08:00
parent 4d989f3ecb
commit bc4ca748de
2441 changed files with 623057 additions and 2 deletions
+144
View File
@@ -0,0 +1,144 @@
/**
@file JCImage.cpp
@brief
@author James
@version 1.0
@date 2016_5_13
*/
#include "JCImage.h"
#include <util/Log.h>
#include "JCImageManager.h"
#include <util/JCCommonMethod.h>
namespace laya
{
JCImage::JCImage()
{
m_pFileResManager = NULL;
m_pImageManager = NULL;
m_nID = 0;
m_nTouchTime = 0;
m_bPushBitmapData = false;
m_bPremultiplyAlpha = false;
}
JCImage::~JCImage()
{
m_kBitmapData.releaseData();
}
void JCImage::setManager(void* pFileResManager, JCImageManager* pImageManager)
{
m_pFileResManager = (JCFileResManager*)pFileResManager;
m_pImageManager = pImageManager;
}
void JCImage::setPremultiplyAlpha(bool bPremultiplyAlpha)
{
m_bPremultiplyAlpha = bPremultiplyAlpha;
}
int JCImage::getWidth()
{
return m_kBitmapData.m_nWidth;
}
int JCImage::getHeight()
{
return m_kBitmapData.m_nHeight;
}
char* JCImage::getImageData()
{
return m_kBitmapData.m_pImageData;
}
void JCImage::setImageID(int nID)
{
m_nID = nID;
m_kBitmapData.m_nImageID = nID;
}
bool JCImage::premultiplyAlpha(BitmapData* pBitmapData)
{
if (pBitmapData == NULL)return false;
if (pBitmapData->m_nImageType != ImgType_png && pBitmapData->m_nImageType != ImgType_gif)return false;
int w = pBitmapData->m_nWidth*4;
int h = pBitmapData->m_nHeight;
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j+=4)
{
int n = i*w + j;
unsigned char* base = (unsigned char*)(pBitmapData->m_pImageData+n);
unsigned char alpha = base[3];
if (alpha != 0xFF)
{
unsigned int red = base[0];
unsigned int green = base[1];
unsigned int blue = base[2];
red = red * alpha / 255;
green = green * alpha / 255;
blue = blue * alpha / 255;
base[0] = (unsigned char)red;
base[1] = (unsigned char)green;
base[2] = (unsigned char)blue;
}
}
}
return true;
}
void JCImage::releaseBitmapData()
{
m_kBitmapData.releaseData();
}
bool JCImage::enableImage()
{
if (m_kBitmapData.m_pImageData == NULL)
{
if (m_pFileResManager)
{
JCFileRes* pRes = m_pFileResManager->getRes(m_sUrl);
JCBuffer kBuffer;
if (pRes && pRes->loadFromCache(kBuffer, false))
{
if (m_bPushBitmapData == false)
{
if (loadImageMemSync(kBuffer.m_pPtr, kBuffer.m_nLen, m_kBitmapData) == false)
{
LOGE("JCImage::gpuRestoreRes decode image error url=%s", m_sUrl.c_str());
m_kBitmapData.releaseData();
return false;
}
}
else
{
int nImageLenght = m_kBitmapData.m_nWidth * m_kBitmapData.m_nHeight * 4;
if (kBuffer.m_nLen == nImageLenght)
{
m_kBitmapData.m_pImageData = new char[nImageLenght];
memcpy(m_kBitmapData.m_pImageData, kBuffer.m_pPtr, nImageLenght);
}
else
{
LOGE("JCImage::gpuRestoreRes image lenght != buffer.lenght");
return false;
}
}
}
else
{
LOGE("JCImage::gpuRestoreRes load file error url=%s", m_sUrl.c_str());
m_kBitmapData.releaseData();
return false;
}
}
else
{
return false;
}
}
if(m_bPremultiplyAlpha)
{
premultiplyAlpha(&m_kBitmapData);
}
return true;
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
+71
View File
@@ -0,0 +1,71 @@
/**
@file JCImage.h
@brief
@author James
@version 1.0
@date 2016_5_13
*/
#ifndef __JCImage_H__
#define __JCImage_H__
#include <resource/JCFileResManager.h>
#include <imageLib/JCImageRW.h>
namespace laya
{
class JCImageManager;
/**
* @brief
*/
class JCImage
{
public:
/** @brief构造函数
*/
JCImage();
/** @brief析构函数
*/
virtual ~JCImage();
void setManager(void* pFileResManager, JCImageManager* pImageManager);
int getWidth();
int getHeight();
void setImageID(int nID);
char* getImageData();
virtual bool enableImage();
void releaseBitmapData();
void setPremultiplyAlpha(bool bPremultiplyAlpha);
virtual void updateTexImage() {}
virtual bool isVideo() const { return false; }
public:
static bool premultiplyAlpha( BitmapData* pBitmapData );
public:
double m_nTouchTime;
BitmapData m_kBitmapData;
std::string m_sUrl;
JCFileResManager* m_pFileResManager;
JCImageManager* m_pImageManager;
bool m_bPushBitmapData; //是否为pushBitmapData的,正常的url为false,如果是js调用的pushBitmapData为true
private:
int m_nID;
bool m_bPremultiplyAlpha;
};
}
#endif //__JCImage_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,244 @@
/**
@file JCImageManager.cpp
@brief
@author James
@version 1.0
@date 2016_5_13
*/
//包含头文件
#include "JCImageManager.h"
#include <util/Log.h>
#include <util/JCCommonMethod.h>
//------------------------------------------------------------------------------
namespace laya
{
JCImageManager::JCImageManager( )
{
m_nDeleteMaxNum = 0;
m_nCountImageID = 0;
m_nReleaseSpaceTime = 20000;
}
JCImageManager::~JCImageManager()
{
clearAllImage();
clearImageIDs();
}
void JCImageManager::setReleaseSpaceTime(int nTime)
{
m_nReleaseSpaceTime = nTime;
LOGI("JCImageManager::setReleaseSpaceTime=%d",nTime);
}
void JCImageManager::setImage(int nID, JCImage* pImage)
{
bool bSucess = true;
int nSize = (int)m_vImages.size();
if (nID == nSize)
{
m_vImages.push_back( pImage );
}
else if( nID < nSize )
{
if (m_vImages[nID] == NULL)
{
m_vImages[nID] = pImage;
}
else
{
bSucess = false;
LOGE("JCImageManager::setImage error m_vImages[%d] != NULL",nID );
}
}
else
{
int nOldSize = m_vImages.size();
m_vImages.resize( nID + 1 );
m_vImages[nID] = pImage;
}
if (bSucess)
{
pImage->setImageID(nID);
pImage->m_nTouchTime = tmGetCurms();
m_vOccupiedMemImages[nID] = pImage;
}
}
JCImage* JCImageManager::getImage(int nID)
{
if ((size_t)nID < m_vImages.size())
{
return m_vImages[nID];
}
return NULL;
}
bool JCImageManager::deleteImage(int nID)
{
if (nID == -1) return false;
m_vDeleteList.push_back(nID);
return true;
}
bool JCImageManager::_deleteImage(int nID)
{
if (nID == -1) return false;
if (nID < (int)m_vImages.size())
{
if (m_vImages[nID])
{
removeImageFromMap(nID);
delete m_vImages[nID];
m_vImages[nID] = NULL;
}
}
removeImageID(nID);
return true;
}
void JCImageManager::removeImageFromMap(int nID)
{
MapImageIter iter = m_vOccupiedMemImages.find(nID);
if (iter != m_vOccupiedMemImages.end())
{
iter = m_vOccupiedMemImages.erase(iter);
}
}
void JCImageManager::clearAllImage()
{
for (VectorImageIter iter = m_vImages.begin(); iter != m_vImages.end(); iter++)
{
JCImage* pImage = *iter;
if (pImage)
{
delete pImage;
pImage = NULL;
}
}
m_vImages.clear();
m_vOccupiedMemImages.clear();
}
void JCImageManager::resetRenderThread()
{
clearAllImage();
}
void JCImageManager::removeImageID(int nID)
{
m_kMutex.lock();
if (nID >= 0 && (size_t)nID < m_vImageIDs.size())
{
m_vImageIDs[nID] = -1;
}
m_kMutex.unlock();
}
void JCImageManager::clearImageIDs()
{
m_kMutex.lock();
m_vImageIDs.clear();
m_kMutex.unlock();
}
int JCImageManager::getImageID()
{
m_kMutex.lock();
for (int i = 0,n = m_vImageIDs.size(); i < n; i++ )
{
if (m_vImageIDs[i] == -1)
{
m_vImageIDs[i] = i;
m_kMutex.unlock();
return i;
}
}
m_vImageIDs.push_back(m_nCountImageID);
m_kMutex.unlock();
return m_nCountImageID++;
}
void JCImageManager::resetJSThread()
{
clearImageIDs();
m_nCountImageID = 0;
}
void JCImageManager::_batchHandleDeleteImage()
{
if (m_vDeleteList.size() <= 0)return;
int n = m_vDeleteList.size();
for (int i = 0; i < n; i++)
{
_deleteImage(m_vDeleteList[i]);
}
if (n > m_nDeleteMaxNum)
{
m_nDeleteMaxNum = n;
m_vDeleteList.reserve(m_nDeleteMaxNum);
}
m_vDeleteList.clear();
}
void JCImageManager::update(int nFrameCount)
{
_batchHandleDeleteImage();
if (nFrameCount % 5 == 0)
{
if (m_vOccupiedMemImages.size() > 0)
{
double nCurentTime = tmGetCurms();
for (MapImageIter iter = m_vOccupiedMemImages.begin(); iter != m_vOccupiedMemImages.end(); )
{
JCImage* pImage = iter->second;
if (pImage && (nCurentTime - pImage->m_nTouchTime) > m_nReleaseSpaceTime)
{
pImage->releaseBitmapData();
iter = m_vOccupiedMemImages.erase(iter);
}
else
{
iter++;
}
}
}
}
}
void JCImageManager::printCorpseImages(const char* sFileName)
{
#ifdef WIN32
FILE* fp = fopen(sFileName, "w");
char sBuffer[2048] = { 0 };
int nSizeCount = 0;
for (int i = 0, n = m_vImages.size(); i < n; i++ )
{
JCImage* pImage = m_vImages[i];
if (pImage && pImage->m_kBitmapData.m_pImageData )
{
int nCurrentSize = pImage->m_kBitmapData.m_nHeight*pImage->m_kBitmapData.m_nWidth * 4;
nSizeCount += nCurrentSize;
sprintf(sBuffer, "image id=%d,memorySize=%d,url=%s\n", i, nCurrentSize,pImage->m_sUrl.c_str());
LOGI(sBuffer);
if (fp)
{
fputs(sBuffer, fp);
}
}
}
sprintf(sBuffer, "memory size count=%d", nSizeCount);
LOGI(sBuffer);
if (fp)
{
fputs(sBuffer, fp);
fclose(fp);
}
#else
char sBuffer[2048] = { 0 };
int nSizeCount = 0;
for (int i = 0, n = m_vImages.size(); i < n; i++)
{
JCImage* pImage = m_vImages[i];
if (pImage && pImage->m_kBitmapData.m_pImageData)
{
int nCurrentSize = pImage->m_kBitmapData.m_nHeight*pImage->m_kBitmapData.m_nWidth * 4;
nSizeCount += nCurrentSize;
LOGI("image id=%d,memorySize=%d,url=%s\n", i, nCurrentSize, pImage->m_sUrl.c_str());
}
}
LOGI(sBuffer, "memory size count=%d", nSizeCount);
#endif
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
+104
View File
@@ -0,0 +1,104 @@
/**
@file JCImageManager.h
@brief
@author James
@version 1.0
@date 2016_5_13
*/
#ifndef __JCImageManager_H__
#define __JCImageManager_H__
#include "../Image/JCImage.h"
#include <map>
#include <vector>
#include <thread>
#include <mutex>
/**
* @brief
*/
namespace laya
{
class JCImageManager
{
public:
typedef std::vector<JCImage*> VectorImage;
typedef VectorImage::iterator VectorImageIter;
typedef std::vector<int> VectorImageID;
typedef VectorImageID::iterator VectorImageIDIter;
typedef std::map<int, JCImage*> MapImage;
typedef MapImage::iterator MapImageIter;
public:
/** @brief构造函数
*/
JCImageManager();
/** @brief析构函数
*/
~JCImageManager();
void setImage( int nID,JCImage* pImage );
bool deleteImage( int nID );
void clearAllImage();
JCImage* getImage( int nID );
void resetRenderThread();
void printCorpseImages( const char* sFileName );
public:
int getImageID();
void resetJSThread();
void removeImageID(int nID);
void clearImageIDs();
void removeImageFromMap( int nID );
void update(int nFrameCount);
void setReleaseSpaceTime(int nTime);
private:
void _batchHandleDeleteImage();
bool _deleteImage(int nID);
public:
VectorImageID m_vImageIDs; ///<imageID
VectorImage m_vImages; ///<完整的Image的容器
//当Image把数据merge到显卡上,Image的内存数据就会删除掉,如果迟迟没有merge到显卡,这部分数据只会保留一段时间
MapImage m_vOccupiedMemImages; ///<占用内存的Image容器
int m_nCountImageID; ///<imageID
int m_nReleaseSpaceTime; ///<删除的间隔时间
std::recursive_mutex m_kMutex; ///<线程锁
private:
int m_nDeleteMaxNum; ///<为了效率保存最大的值
std::vector<int> m_vDeleteList; ///<删除列表
};
}
#endif //__JCImageManager_H__
//-----------------------------END FILE--------------------------------
+48
View File
@@ -0,0 +1,48 @@
/**
@file JCImage.cpp
@brief
@author James
@version 1.0
@date 2016_5_13
*/
#include "JCVideo.h"
#include <util/Log.h>
#include "JCImageManager.h"
#include <util/JCCommonMethod.h>
namespace laya
{
JCVideo::JCVideo() : JCImage()
{
m_kBitmapData.m_pImageData = 0;
m_videoHandler = nullptr;
}
JCVideo::~JCVideo()
{
if(m_videoHandler)
{
delete m_videoHandler;
m_videoHandler = nullptr;
}
}
void JCVideo::setVideoHandler(IVideoHandler* handler)
{
m_videoHandler = handler;
}
void JCVideo::updateTexImage()
{
if (m_videoHandler && m_videoHandler->isFrameUpdated())
{
m_videoHandler->updateBitmapData(&m_kBitmapData);
}
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
+60
View File
@@ -0,0 +1,60 @@
/**
@file JCImage.h
@brief
@author James
@version 1.0
@date 2016_5_13
*/
#ifndef __JCVideo_H__
#define __JCVideo_H__
#include <resource/JCFileResManager.h>
#include <imageLib/JCImageRW.h>
#include "JCImage.h"
namespace laya
{
class JCImageManager;
/**
* @brief
*/
class IVideoHandler
{
public:
virtual ~IVideoHandler() {}
virtual bool isFrameUpdated() = 0;
virtual void updateBitmapData(BitmapData* bitmapData) = 0;
};
class JCVideo : public JCImage
{
public:
/** @brief构造函数
*/
JCVideo();
/** @brief析构函数
*/
~JCVideo();
void setVideoHandler(IVideoHandler* handler);
virtual bool isVideo() const override {
return true;
}
virtual void updateTexImage();
virtual bool enableImage() override { return true; }
private:
IVideoHandler* m_videoHandler;
};
}
#endif //__JCVideo_H__
//-----------------------------END FILE--------------------------------
+354
View File
@@ -0,0 +1,354 @@
namespace laya
{
struct CMD_ii
{
int i;
int j;
};
struct CMD_if
{
int i;
float j;
};
struct CMD_iff
{
int i;
float x;
float y;
};
struct CMD_ifff
{
int i;
float x;
float y;
float z;
};
struct CMD_iffff
{
int i;
float x;
float y;
float w;
float h;
};
struct CMD_ifffffffff
{
int i;
float x;
float y;
float w;
float h;
float x1;
float y1;
float w1;
float h1;
};
struct CMD_iif
{
int i;
int j;
float x;
};
struct CMD_iiff
{
int i;
int j;
float x;
float y;
};
struct CMD_iifff
{
int i;
int j;
float x;
float y;
float z;
};
struct CMD_iiffff
{
int i;
int j;
float x;
float y;
float w;
float h;
};
struct CMD_iii
{
int i;
int j;
int k;
};
struct CMD_iiifii
{
int i;
int j;
int k;
float l;
int m;
int n;
};
struct CMD_iiii
{
int i;
int j;
int k;
int l;
};
struct CMD_iiiii
{
int i;
int j;
int k;
int l;
int m;
};
struct CMD_iiiiii
{
int i;
int j;
int k;
int l;
int m;
int n;
};
struct CMD_iiiiiii
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
};
struct CMD_iiiiiiii
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
};
struct CMD_iiiiiiiii
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int k;
};
struct CMD_iiiiiiiiiii
{
int a;
int b;
int c;
int d;
int e;
int f;
int g;
int h;
int i;
int j;
int k;
};
struct CMD_fi
{
float x;
int y;
};
struct CMD_ff
{
float x;
float y;
};
struct CMD_ffi
{
float x;
float y;
int i;
};
struct CMD_ifi
{
int a;
float b;
int c;
};
struct CMD_ffii
{
float x;
float y;
int i;
int j;
};
struct CMD_fff
{
float x;
float y;
float z;
};
struct CMD_fffiiii
{
float x;
float y;
float w;
int h;
int i;
int j;
int k;
};
struct CMD_ffff
{
float x;
float y;
float w;
float h;
};
struct CMD_ffffi
{
float x;
float y;
float w;
float h;
int i;
};
struct CMD_ffffiii
{
float x;
float y;
float w;
float h;
int i;
int j;
int k;
};
struct CMD_ffffiif
{
float x;
float y;
float w;
float h;
int i;
int j;
float k;
};
struct CMD_fffffiiifi
{
float x;
float y;
float r;
float s;
float e;
int f;
int l;
int m;
float w;
int v;
};
struct CMD_fffiiifi
{
float x;
float y;
float r;
int f;
int l;
int m;
float w;
int v;
};
struct CMD_ffffiiif
{
float x;
float y;
float w;
float h;
int i;
int j;
int m;
float k;
};
struct CMD_fffiifi
{
float x;
float y;
float r;
int i;
int j;
float k;
int l;
};
struct CMD_fffff
{
float x;
float y;
float w;
float h;
float i;
};
struct CMD_ffffifi
{
float fx;
float fy;
float tx;
float ty;
int c;
float w;
int i;
};
struct CMD_fffffi
{
float x;
float y;
float w;
float h;
float i;
int j;
};
struct CMD_ffffff
{
float a;
float b;
float c;
float d;
float tx;
float ty;
};
struct CMDMatrix4x4
{
float matrix[16];
};
struct CMDIBVB
{
int ibId;
int vbId;
int vertType;
int shaderId;
int imgId;
int startIndex;
int offset;
int numElement;
float x;
float y;
float mat[6];
};
struct CMDSkinMesh
{
int ibId;
int vbId;
int vertType;
int numElement;
int startIndex;
int imgId;
int shaderId;
float mat[6];
float x;
float y;
};
}
@@ -0,0 +1,59 @@
/**
@file JCIDGenerator.cpp
@brief
@author James
@version 1.0
@date 2016_5_12
*/
#include "JCIDGenerator.h"
namespace laya
{
JCIDGenerator::JCIDGenerator()
{
}
JCIDGenerator::~JCIDGenerator()
{
}
bool JCIDGenerator::deleteID(GLuint nFakeID)
{
//只设置为无效,不从vector中删除
if (nFakeID >= 0 && nFakeID < m_vIDTable.size())
{
m_vIDTable[nFakeID] = 0;
}
return true;
}
bool JCIDGenerator::setRealID(GLuint nFakeID,GLuint nRealID)
{
if (nFakeID == m_vIDTable.size())
{
m_vIDTable.push_back(nRealID);
}
else if (nFakeID > m_vIDTable.size())
{
int nLastSize = m_vIDTable.size();
m_vIDTable.resize(nFakeID +1);
//把中间的空的,全部填充成无效的
for (int i = nLastSize,n=m_vIDTable.size(); i < n; i++)
{
m_vIDTable[i] = 0;
}
m_vIDTable[nFakeID] = nRealID;
}
else
{
m_vIDTable[nFakeID] = nRealID;
}
return true;
}
void JCIDGenerator::reset()
{
m_vIDTable.clear();
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,53 @@
/**
@file JCIDGenerator.h
@brief
@author James
@version 1.0
@date 2016_5_12
*/
#ifndef __JCIDGenerator_H__
#define __JCIDGenerator_H__
#include <string>
#include "util/Log.h"
#include <vector>
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#else
#include <GLES3/gl3.h>
#endif
namespace laya
{
class JCIDGenerator
{
public:
JCIDGenerator();
~JCIDGenerator();
bool deleteID(GLuint nFakeID);
bool setRealID(GLuint fakeID,GLuint realID);
GLuint getRealID(GLuint fakeID)
{
return fakeID < m_vIDTable.size() ? m_vIDTable[fakeID] : 0;
}
void reset();
protected:
std::vector<GLuint> m_vIDTable;
};
}
//------------------------------------------------------------------------------
#endif //__JCIDGenerator_H__
//-----------------------------END FILE--------------------------------
File diff suppressed because it is too large Load Diff
+249
View File
@@ -0,0 +1,249 @@
/**
@file JCLayaGL.h
@brief
@author James
@version 1.0
@date 2018_5_25
*/
#ifndef __JCLayaGL_H__
#define __JCLayaGL_H__
#include <string>
#include <vector>
#include <list>
#include <unordered_map>
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#else
#include <GLES3/gl3.h>
#endif
#include "../Image/JCImageManager.h"
#include "JCIDGenerator.h"
#include <Manager/JCArrayBufferManager.h>
#include "../RenderEx/JCGlobalValue.h"
#include "../Manager/JCOrderResManager.h"
#include "../RenderEx/JCRegister.h"
#include <buffer/JCCommandEncoderBuffer.h>
//1024*1024*4
#define TEX_IMAGE2D_DUMMY_MAX_SIZE 4194304
namespace laya
{
typedef GLuint WebGLShader;
typedef GLuint WebGLProgram;
typedef GLuint WebGLBuffer;
typedef GLuint WebGLFramebuffer;
typedef GLuint WebGLRenderbuffer;
typedef GLuint WebGLTexture;
typedef GLuint WebGLUniformLocation;
class JCWebGLPlus;
/**
* @brief
*/
class JCLayaGL
{
public:
JCLayaGL(int nWidth,int nHeight,JCArrayBufferManager* pArrayBuferManager, JCImageManager* pImageManager,JCIDGenerator* pIDGenerator,JCIDGenerator* pProgramLocationTable,JCRegister* pRegister,JCWebGLPlus* pWebGLPlus);
static void _texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);
static void _createVertexArray(GLuint& vao);
static void _bindVertexArray(GLuint vao);
static void _deleteVertexArray(GLuint& vao);
virtual ~JCLayaGL();
virtual bool isContextLost();
virtual void* getExtension(const std::string& name);
virtual void activeTexture(GLenum texture);
virtual void attachShader(WebGLProgram program, WebGLShader shader);
virtual void bindAttribLocation(WebGLProgram program, GLuint index, const std::string& name);
virtual void bindBuffer(GLenum target, WebGLBuffer buffer);
virtual void bindFramebuffer(GLenum target, WebGLFramebuffer framebuffer);
virtual void bindRenderbuffer(GLenum target, WebGLRenderbuffer renderbuffer);
virtual void bindTexture(GLenum target, WebGLTexture texture);
virtual void blendColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
virtual void blendEquation(GLenum mode);
virtual void blendEquationSeparate(GLenum modeRGB, GLenum modeAlpha);
virtual void blendFunc(GLenum sfactor, GLenum dfactor);
virtual void blendFuncSeparate(GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha);
virtual void bufferData_size(GLenum target, GLsizeiptr size, GLenum usage);
virtual void bufferData(GLenum target, int dataSize, char* data, GLenum usage);
virtual void bufferSubData(GLenum target, GLintptr offset,int dataSize, char* data);
virtual GLenum checkFramebufferStatus(GLenum target);
virtual void clear(GLbitfield mask);
virtual void clearColor(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
virtual void clearDepth(GLclampf depth);
virtual void clearStencil(GLint s);
virtual void colorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
virtual void compileShader(WebGLShader shader);
virtual void compressedTexImage2D(GLenum target, GLint level, GLenum internalformat,GLsizei width, GLsizei height, GLint border,int dataSize,char* data);
virtual void compressedTexSubImage2D(GLenum target, GLint level,GLint xoffset, GLint yoffset,GLsizei width, GLsizei height, GLenum format, int dataSize,char* data );
virtual void copyTexImage2D(GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border);
virtual void copyTexSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height);
virtual WebGLBuffer createBuffer(int fakeID);
virtual WebGLFramebuffer createFramebuffer(int fakeID);
virtual WebGLProgram createProgram(int fakeID);
virtual WebGLRenderbuffer createRenderbuffer(int fakeID);
virtual WebGLShader createShader(int fakeID,GLenum type);
virtual WebGLTexture createTexture(int fakeID);
virtual void cullFace(GLenum mode);
virtual void deleteBuffer(WebGLBuffer buffer);
virtual void deleteFramebuffer(WebGLFramebuffer framebuffer);
virtual void deleteProgram(WebGLProgram program);
virtual void deleteRenderbuffer(WebGLRenderbuffer renderbuffer);
virtual void deleteShader(WebGLShader shader);
virtual void deleteTexture(WebGLTexture texture);
virtual void depthFunc(GLenum func);
virtual void depthMask(GLboolean flag);
virtual void depthRange(GLclampf zNear, GLclampf zFar);
virtual void detachShader(WebGLProgram program, WebGLShader shader);
virtual void disable(GLenum cap);
virtual void disableVertexAttribArray(GLuint index);
virtual void drawArrays(GLenum mode, GLint first, GLsizei count);
virtual void drawElements(GLenum mode, GLsizei count, GLenum type, GLintptr offset);
virtual void enable(GLenum cap);
virtual void enableVertexAttribArray(GLuint index);
virtual void finish();
virtual void flush();
virtual void framebufferRenderbuffer(GLenum target, GLenum attachment, GLenum renderbuffertarget, WebGLRenderbuffer renderbuffer);
virtual void framebufferTexture2D(GLenum target, GLenum attachment, GLenum textarget, WebGLTexture texture, GLint level);
virtual void frontFace(GLenum mode);
virtual void generateMipmap(GLenum target);
virtual GLint getAttribLocation(WebGLProgram program,const std::string& name);
virtual GLint getBufferParameter(GLenum target, GLenum pname);
virtual GLint getParameter(GLenum pname,int fakeID);
virtual GLenum getError();
virtual GLint getFramebufferAttachmentParameter(GLenum target, GLenum attachment,GLenum pname);
virtual GLint getProgramParameter(WebGLProgram program, GLenum pname);
virtual std::string getProgramInfoLog(WebGLProgram program);
virtual GLint getRenderbufferParameter(GLenum target, GLenum pname);
virtual GLint getShaderParameter(WebGLShader shader, GLenum pname);
virtual std::string getShaderInfoLog(WebGLShader shader);
virtual std::string getShaderSource(WebGLShader shader);
virtual GLint getTexParameter(GLenum target, GLenum pname);
virtual GLint getUniform(WebGLProgram program, WebGLUniformLocation location);
virtual WebGLUniformLocation getUniformLocation(WebGLProgram program, int fakeLoc,const std::string& name);
virtual GLint getVertexAttrib(GLuint index, GLenum pname);
virtual GLsizeiptr getVertexAttribOffset(GLuint index, GLenum pname);
virtual void hint(GLenum target, GLenum mode);
virtual GLboolean isBuffer(WebGLBuffer buffer);
virtual GLboolean isEnabled(GLenum cap);
virtual GLboolean isFramebuffer(WebGLFramebuffer framebuffer);
virtual GLboolean isProgram(WebGLProgram program);
virtual GLboolean isRenderbuffer(WebGLRenderbuffer renderbuffer);
virtual GLboolean isShader(WebGLShader shader);
virtual GLboolean isTexture(WebGLTexture texture);
virtual void lineWidth(GLfloat width);
virtual void linkProgram(WebGLProgram program);
virtual void pixelStorei(GLenum pname, GLint param);
virtual void polygonOffset(GLfloat factor, GLfloat units);
virtual void readPixelsAsync(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, int callbackObjID, int funcID);
virtual void renderbufferStorage(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
virtual void sampleCoverage(GLclampf value, GLboolean invert);
virtual void scissor(GLint x, GLint y, GLsizei width, GLsizei height);
virtual void shaderSource(WebGLShader shader, const std::string& source);
virtual void stencilFunc(GLenum func, GLint ref, GLuint mask);
virtual void stencilFuncSeparate(GLenum face, GLenum func, GLint ref, GLuint mask);
virtual void stencilMask(GLuint mask);
virtual void stencilMaskSeparate(GLenum face, GLuint mask);
virtual void stencilOp(GLenum fail, GLenum zfail, GLenum zpass);
virtual void stencilOpSeparate(GLenum face, GLenum fail, GLenum zfail, GLenum zpass);
virtual void texImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, void* pixels);
virtual void texSubImage2D(GLenum target, GLint level, GLint xoffset, GLint yoffset,GLsizei width, GLsizei height, GLenum format, GLenum type, void* pixels);
virtual void texParameterf(GLenum target, GLenum pname, GLfloat param);
virtual void texParameteri(GLenum target, GLenum pname, GLint param);
virtual void uniform1f(WebGLUniformLocation location, GLfloat x);
virtual void uniform1fv(WebGLUniformLocation location, int byteSize, const GLfloat* v );
virtual void uniform1i(WebGLUniformLocation location, GLint x);
virtual void uniform1iv(WebGLUniformLocation location, int byteSize, const GLint* v );
virtual void uniform2f(WebGLUniformLocation location, GLfloat x, GLfloat y);
virtual void uniform2fv(WebGLUniformLocation location, int byteSize, const GLfloat* v );
virtual void uniform2i(WebGLUniformLocation location, GLint x, GLint y);
virtual void uniform2iv(WebGLUniformLocation location, int byteSize, const GLint* v );
virtual void uniform3f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z);
virtual void uniform3fv(WebGLUniformLocation location, int byteSize, const GLfloat* v);
virtual void uniform3i(WebGLUniformLocation location, GLint x, GLint y, GLint z);
virtual void uniform3iv(WebGLUniformLocation location, int byteSize, const GLint* v );
virtual void uniform4f(WebGLUniformLocation location, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
virtual void uniform4fv(WebGLUniformLocation location, int byteSize, const GLfloat* v );
virtual void uniform4i(WebGLUniformLocation location, GLint x, GLint y, GLint z, GLint w);
virtual void uniform4iv(WebGLUniformLocation location, int byteSize, const GLint* v);
virtual void uniformMatrix2fv(WebGLUniformLocation location, int byteSize,GLboolean transpose,GLfloat* value);
virtual void uniformMatrix3fv(WebGLUniformLocation location, int byteSize,GLboolean transpose,GLfloat* value);
virtual void uniformMatrix4fv(WebGLUniformLocation location, int byteSize, GLboolean transpose,GLfloat* value);
virtual void useProgram(WebGLProgram program);
virtual void validateProgram(WebGLProgram program);
virtual void vertexAttrib1f(GLuint index, GLfloat x);
virtual void vertexAttrib1fv(GLuint index, GLfloat* values);
virtual void vertexAttrib2f(GLuint index, GLfloat x, GLfloat y);
virtual void vertexAttrib2fv(GLuint index, GLfloat* values);
virtual void vertexAttrib3f(GLuint index, GLfloat x, GLfloat y, GLfloat z);
virtual void vertexAttrib3fv(GLuint index, GLfloat* values);
virtual void vertexAttrib4f(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
virtual void vertexAttrib4fv(GLuint index, GLfloat* values);
virtual void vertexAttribPointer(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLintptr offset);
virtual void viewport(GLint x, GLint y, GLsizei width, GLsizei height);
virtual void readPixels(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid* pixels);
virtual int createVertexArray(int fakeID);
virtual void bindVertexArray(int fakeID);
virtual void deleteVertexArray(int fakeID);
virtual void vertexAttribDivisor(GLuint index, GLuint divisor);
virtual void drawArraysInstanced(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
virtual void drawElementsInstanced(GLenum mode, GLsizei count, GLenum type, GLintptr indices, GLsizei primcount);
virtual void texImage2DCanvas(GLsizei width, GLsizei height, int canvas);
virtual void texStorage2D(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height);
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
virtual void useCommandEncoder(int nCmdSetID);
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
public:
virtual void deleteAllGLRes();
virtual void removeTextureFromMap(GLuint texture);
virtual void removeFrameBufferFromMap(GLuint frameBuffer);
virtual void removeProgramFromMap(GLuint program);
virtual void removeShaderFromMap(GLuint shader);
virtual void removeRenderBufferFromMap(GLuint renderBuffer);
virtual void removeBufferFromMap(GLuint buffer);
virtual void removeVAOFromMap(GLuint VAO);
public:
void _readPixelsAsync(GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, int callbackObjID, int funcID);
private:
void flipY(GLenum format, GLsizei width, GLsizei height, void* pixels);
public:
static char m_pDummyData[TEX_IMAGE2D_DUMMY_MAX_SIZE];
public:
JCWebGLPlus* m_pWebGLPlus;
JCImageManager* m_pImageManager;
JCArrayBufferManager* m_pArrayBufferManager;
JCRegister* m_pRegister;
protected:
GLint m_nMainFrameBuffer;
JCIDGenerator* m_pIDGenerator;
JCIDGenerator* m_pProgramLocationTable;
bool m_bFlipY;
public:
int m_nCurrentBuffer;
int m_nCurrentProgram;
static float s_fMainCanvasScaleX;
static float s_fMainCanvasScaleY;
static float s_fMainCanvasTX;
static float s_fMainCanvasTY;
int m_nMainCanvasWidth;
int m_nMainCanvasHeight;
private:
std::unordered_map<GLuint, bool> m_vAllTexture;
std::unordered_map<GLuint, bool> m_vAllFrameBuffer;;
std::unordered_map<GLuint, bool> m_vAllProgram;
std::unordered_map<GLuint, bool> m_vAllShader;
std::unordered_map<GLuint, bool> m_vAllRenderBuffer;
std::unordered_map<GLuint, bool> m_vAllBuffer;
std::unordered_map<GLuint, bool> m_vAllVAO;
};
}
//------------------------------------------------------------------------------
#endif //__JCLayaGL_H__
//-----------------------------END FILE--------------------------------
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,400 @@
/**
@file JCLayaGLDispatch.h
@brief
@author James
@version 1.0
@date 2018_5_25
*/
#ifndef __JCLayaGLDispatch_H__
#define __JCLayaGLDispatch_H__
#include <stdlib.h>
#include "JCLayaGL.h"
#include <buffer/JCCommandEncoderBuffer.h>
//#define DEBUG_PARSE_STREAM 0
namespace laya
{
enum LAYA_FUNCTION_ID
{
LAYA_UNIFORMMATRIX2FVEX = 0,
LAYA_UNIFORMMATRIX3FVEX,
LAYA_UNIFORMMATRIX4FVEX,
LAYA_ADDSHADERUNIFORM,
LAYA_UPLOADSHADERUNIFORMS,
LAYA_UPLOADSHADERUNIFORMS_BUFFER,
LAYA_USECOMMANDENCODER,
LAYA_LOADDATATOREG,
LAYA_LOADDATATOREGEX,
LAYA_IFLESS0,
LAYA_IFEQUAL0,
LAYA_IFGREATER0,
LAYA_IFLEQUAL0,
LAYA_IFGEQUAL0,
LAYA_IFGNOTEQUAL0,
LAYA_OPERATEREG,
LAYA_STORE,
LAYA_CREATE_IMAGE_ON_RENDER_THREAD = 64,
LAYA_DELETE_IMAGE_ON_RENDER_THREAD,
LAYA_RELEASE_IMAGE_ON_RENDER_THREAD,
LAYA_SET_IMAGE_RELEASE_SPACE_TIME,
LAYA_SET_PREMULTIPLY_ALPHA,
LAYA_PERFADDDATA,
LAYA_PERFUPDATEDT,
LAYA_SET_MAIN_CONTEXT_SIZE,
//-------------------------------
LAYA_GETCONTEXTATTRIBUTES = 128,
LAYA_ISCONTEXTLOST,
LAYA_GETSUPPORTEDEXTENSIONS,
LAYA_GETEXTENSION,
LAYA_ACTIVETEXTURE,
LAYA_ATTACHSHADER,
LAYA_BINDATTRIBLOCATION,
LAYA_BINDBUFFER,
LAYA_BINDFRAMEBUFFER,
LAYA_BINDRENDERBUFFER,//第10个
LAYA_BINDTEXTURE,
LAYA_USETEXTURE,
LAYA_BLENDCOLOR,
LAYA_BLENDEQUATION,
LAYA_BLENDEQUATIONSEPARATE,
LAYA_BLENDFUNC,
LAYA_BLENDFUNCSEPARATE,
LAYA_BUFFERDATA_SIZE,
LAYA_BUFFERDATA_ARRAYBUFFER,
LAYA_BUFFERSUBDATA,//第20个
LAYA_CHECKFRAMEBUFFERSTATUS,
LAYA_CLEAR,
LAYA_CLEARCOLOR,
LAYA_CLEARDEPTH,
LAYA_CLEARSTENCIL,
LAYA_COLORMASK,
LAYA_COMPILESHADER,
LAYA_COPYTEXIMAGE2D,
LAYA_COPYTEXSUBIMAGE2D,
LAYA_CREATEBUFFER,//第30个
LAYA_CREATEFRAMEBUFFER,
LAYA_CREATEPROGRAM,
LAYA_CREATERENDERBUFFER,
LAYA_CREATESHADER,
LAYA_CREATETEXTURE,
LAYA_CULLFACE,
LAYA_DELETEBUFFER,
LAYA_DELETEFRAMEBUFFER,
LAYA_DELETEPROGRAM,
LAYA_DELETERENDERBUFFER,//第40个
LAYA_DELETESHADER,
LAYA_DELETETEXTURE,
LAYA_DEPTHFUNC,
LAYA_DEPTHMASK,
LAYA_DEPTHRANGE,
LAYA_DETACHSHADER,
LAYA_DISABLE,
LAYA_DISABLEVERTEXATTRIBARRAY,
LAYA_DRAWARRAYS,
LAYA_DRAWELEMENTS,//第50个
LAYA_ENABLE,
LAYA_ENABLEVERTEXATTRIBARRAY,
LAYA_FINISH,
LAYA_FLUSH,
LAYA_FRAMEBUFFERRENDERBUFFER,
LAYA_FRAMEBUFFERTEXTURE2D,
LAYA_FRONTFACE,
LAYA_GENERATEMIPMAP,
LAYA_GETACTIVEATTRIB,
LAYA_GETACTIVEUNIFORM,//第60个
LAYA_GETATTRIBLOCATION,
LAYA_GETPARAMETER,
LAYA_GETBUFFERPARAMETER,
LAYA_GETERROR,
LAYA_GETFRAMEBUFFERATTACHMENTPARAMETER,
LAYA_GETPROGRAMPARAMETER,
LAYA_GETPROGRAMINFOLOG,
LAYA_GETRENDERBUFFERPARAMETER,
LAYA_GETSHADERPRECISIONFORMAT,
LAYA_GETSHADERPARAMETER,//第70个
LAYA_GETSHADERINFOLOG,
LAYA_GETSHADERSOURCE,
LAYA_GETTEXPARAMETER,
LAYA_GETUNIFORM,
LAYA_GETUNIFORMLOCATION,
LAYA_GETVERTEXATTRIB,
LAYA_GETVERTEXATTRIBOFFSET,
LAYA_HINT,
LAYA_ISBUFFER,
LAYA_ISENABLED,//第80个
LAYA_ISFRAMEBUFFER,
LAYA_ISPROGRAM,
LAYA_ISRENDERBUFFER,
LAYA_ISSHADER,
LAYA_ISTEXTURE,
LAYA_LINEWIDTH,
LAYA_LINKPROGRAM,
LAYA_PIXELSTOREI,
LAYA_POLYGONOFFSET,
LAYA_READPIXELS,//第90个
LAYA_RENDERBUFFERSTORAGE,
LAYA_SAMPLECOVERAGE,
LAYA_SCISSOR,
LAYA_SHADERSOURCE,
LAYA_STENCILFUNC,
LAYA_STENCILFUNCSEPARATE,
LAYA_STENCILMASK,
LAYA_STENCILMASKSEPARATE,
LAYA_STENCILOP,
LAYA_STENCILOPSEPARATE,//第100个
LAYA_TEXIMAGE2D,
LAYA_TEXPARAMETERF,
LAYA_TEXPARAMETERI,
LAYA_TEXSUBIMAGE2D,
LAYA_UNIFORM1F,
LAYA_UNIFORM1FV,
LAYA_UNIFORM1I,
LAYA_UNIFORM1IV,
LAYA_UNIFORM2F,
LAYA_UNIFORM2FV,//第110个
LAYA_UNIFORM2I,
LAYA_UNIFORM2IV,
LAYA_UNIFORM3F,
LAYA_UNIFORM3FV,
LAYA_UNIFORM3I,
LAYA_UNIFORM3IV,
LAYA_UNIFORM4F,
LAYA_UNIFORM4FV,
LAYA_UNIFORM4I,
LAYA_UNIFORM4IV,//第120个
LAYA_UNIFORMMATRIX2FV,
LAYA_UNIFORMMATRIX3FV,
LAYA_UNIFORMMATRIX4FV,
LAYA_USEPROGRAM,
LAYA_VALIDATEPROGRAM,
LAYA_VERTEXATTRIB1F,
LAYA_VERTEXATTRIB1FV,
LAYA_VERTEXATTRIB2F,
LAYA_VERTEXATTRIB2FV,
LAYA_VERTEXATTRIB3F,//第130个
LAYA_VERTEXATTRIB3FV,
LAYA_VERTEXATTRIB4F,
LAYA_VERTEXATTRIB4FV,
LAYA_VERTEXATTRIBPOINTER,
LAYA_VIEWPORT,
LAYA_CONFIGUREBACKBUFFER,
LAYA_COMPRESSEDTEXIMAGE2D,
LAYA_TEXIMAGE2D_PIXEL,
LAYA_TEXSUBIMAGE2D_PIXEL,
LAYA_CREATEVERTEXARRAY,//第140个
LAYA_BINDVERTEXARRAY,
LAYA_DELETEVERTEXARRAYS,
LAYA_READPIXELSASYNC,
LAYA_COMPRESSEDTEXSUBIMAGE2D,
LAYA_VERTEXATTRIBDIVISOR,
LAYA_DRAWARRAYSINSTANCED,
LAYA_DRAWELEMENTSINSTANCED,
};
class JCLayaGLDispatch
{
public:
typedef void(*ProcFunction)(JCCommandEncoderBuffer& layaGLCmd);
static bool dispatchScriptCmd(JCCommandEncoderBuffer& layaGLCmd);
static void dispatchAllCmds(JCCommandEncoderBuffer* pTemplateMem);
public:
static void _layaGL_empty(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getContextAttributes(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isContextLost(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getSupportedExtensions(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getExtension(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_activeTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_attachShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindAttribLocation(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindFramebuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindRenderbuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_useTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_blendColor(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_blendEquation(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_blendEquationSeparate(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_blendFunc(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_blendFuncSeparate(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bufferData_size(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bufferData_ArrayBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bufferSubData(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_checkFramebufferStatus(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_clear(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_clearColor(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_clearDepth(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_clearStencil(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_colorMask(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_compileShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_copyTexImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_copyTexSubImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createFramebuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createRenderbuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_cullFace(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteFramebuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteRenderbuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_depthFunc(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_depthMask(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_depthRange(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_detachShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_disable(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_disableVertexAttribArray(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_drawArrays(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_drawElements(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_enable(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_enableVertexAttribArray(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_finish(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_flush(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_framebufferRenderbuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_framebufferTexture2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_frontFace(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_generateMipmap(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getActiveAttrib(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getActiveUniform(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getAttribLocation(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getBufferParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getError(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getFramebufferAttachmentParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getProgramParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getProgramInfoLog(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getRenderbufferParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getShaderPrecisionFormat(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getShaderParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getShaderInfoLog(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getShaderSource(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getTexParameter(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getUniform(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getUniformLocation(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getVertexAttrib(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_getVertexAttribOffset(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_hint(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isEnabled(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isFramebuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isRenderbuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isShader(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_isTexture(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_lineWidth(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_linkProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_pixelStorei(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_polygonOffset(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_readPixels(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_renderbufferStorage(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_sampleCoverage(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_scissor(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_shaderSource(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilFunc(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilFuncSeparate(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilMask(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilMaskSeparate(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilOp(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_stencilOpSeparate(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texParameterf(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texParameteri(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texSubImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform1f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform1fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform1i(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform1iv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform2f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform2fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform2i(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform2iv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform3f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform3fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform3i(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform3iv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform4f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform4fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform4i(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniform4iv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniformMatrix2fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniformMatrix3fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniformMatrix4fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_useProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_validateProgram(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib1f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib1fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib2f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib2fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib3f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib3fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib4f(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttrib4fv(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttribPointer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_viewport(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_configureBackBuffer(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_compressedTexImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texImage2D_pixel(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texSubImage2D_pixel(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_createVertexArray(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_bindVertexArray(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteVertexArray(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_readPixelsAsync(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_compressedTexSubImage2D(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_vertexAttribDivisor(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_drawArraysInstanced(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_drawElementsInstanced(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texImage2D_canvas(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_texStorage2D(JCCommandEncoderBuffer& layaGLCmd);
//------------------------------------------------------------------------------
//-------------------------webgl扩展函数-----------------------------------------
//------------------------------------------------------------------------------
static void _layaGL_uniformMatrix2fvEx(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniformMatrix3fvEx(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uniformMatrix4fvEx(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_addShaderUniform(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_useCommandEncoder(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uploadShaderUniforms(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_uploadShaderUniformsData(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_loadDataToReg(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_loadDataToRegEx(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifLess0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifEqual0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifGreater0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifLEqual0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifGEqual0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_ifGNotEqual0(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_operateReg(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_store(JCCommandEncoderBuffer& layaGLCmd);
//------------------------------------------------------------------------------
//-------------------------C++函数-----------------------------------------
//------------------------------------------------------------------------------
static void _layaGL_createImageOnRenderThread(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_deleteImageOnRenderThread(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_releaseImageOnRenderThread(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_setImageReleaseSpaceTime(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_setPremultiplyAlpha(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_PerfAddData(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_PerfUpdateDt(JCCommandEncoderBuffer& layaGLCmd);
static void _layaGL_setMainContextSize(JCCommandEncoderBuffer& layaGLCmd);
public:
static JCLayaGL* ms_pLayaGL; ///<全局的LayaGL
};
}
//------------------------------------------------------------------------------
#endif //__JCLayaGLDispatch_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,126 @@
/**
@file JCOrderResManager.h
@brief
@author James
@version 1.0
@date 2017_12_1
*/
#ifndef __JCOrderResManager_H__
#define __JCOrderResManager_H__
#include <stdio.h>
#include <vector>
#include <util/Log.h>
namespace laya
{
template<class T>
class JCOrderResManager
{
public:
/** @brief构造函数
*/
JCOrderResManager( bool bNeedDelRes )
{
m_bNeedDelRes = bNeedDelRes;
m_nGlobalID = 0;
}
/** @brief析构函数
*/
~JCOrderResManager()
{
clearAllRes();
}
void setRes(int nID, T* pRes)
{
int nSize = (int)m_vRes.size();
if (nID == nSize)
{
m_vRes.push_back(pRes);
}
else if (nID < nSize)
{
if (m_vRes[nID] == NULL)
{
m_vRes[nID] = pRes;
}
else
{
LOGE("JCOrderResManager::setRes error m_vRes[%d] != NULL", nID);
}
}
else
{
int nOldSize = m_vRes.size();
m_vRes.resize(nID + 1);
m_vRes[nID] = pRes;
}
}
T* getRes(int nID)
{
return m_vRes[nID];
}
void deleteRes(int nID)
{
if (nID < m_vRes.size())
{
T* pRes = m_vRes[nID];
if (pRes)
{
delete pRes;
}
m_vRes[nID] = NULL;
}
}
void removeRes(int nID)
{
if (nID < m_vRes.size())
{
m_vRes[nID] = NULL;
}
}
int getGlobalID()
{
return m_nGlobalID++;
}
void clearAllRes()
{
if (m_bNeedDelRes)
{
for (int i = 0, n = m_vRes.size(); i < n; i++)
{
T* pRes = m_vRes[i];
if (pRes)delete pRes;
}
}
m_vRes.clear();
}
void resetGlobalID()
{
m_nGlobalID = 0;
}
public:
std::vector<T*> m_vRes;
int m_nGlobalID;
bool m_bNeedDelRes;
};
}
//------------------------------------------------------------------------------
#endif //__JCOrderResManager_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,627 @@
/**
@file JCPerfHUD.cpp
@brief
@author James
@version 1.0
@date 2016_5_18
*/
#include "JCPerfHUD.h"
#include <util/Log.h>
#include <util/JCCommonMethod.h>
#include "../LayaGL/JCLayaGL.h"
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#else
#include <GLES3/gl3.h>
#endif
namespace laya
{
//----------------------------------------------------------------------------
int JCPerfHUD::m_nMaxData=100;
double JCPerfHUD::m_tmCurRender =0;
double JCPerfHUD::m_tmDelayTime = 0;
PerfDataBase* JCPerfHUD::m_vDatas[MAXPERFDATA];
std::vector<short> JCPerfHUD::m_vValidID;
double JCPerfHUD::m_tmCurJs;
double JCPerfHUD::m_tmVSYNC = 0.0;
unsigned int JCPerfHUD::m_nCurVsyncFrm = 0;
unsigned int JCPerfHUD::m_nCurDrawFrm = 0;
float JCPerfHUD::m_fGlobalScale = 1.0;
JCLayaGL* JCPerfHUD::m_pLayaGL = NULL;
void PerfData::updateData( float dt)
{
m_DataLock.lock();
m_vDatas.push_back(dt);
if (m_vDatas.size()>m_nMaxData) {
m_vDatas.pop_front();
}
m_DataLock.unlock();
}
//假设是均匀时间
void PerfData::drawData(JCPerfDataRender* pRender) {
m_DataLock.lock();
JCPerfDataRender::vertex cdata[100];
JCPerfDataRender::vertex* pCurVert = (JCPerfDataRender::vertex*)cdata;
int nPanelW = pRender->m_nWidth;
auto it = m_vDatas.begin();
int nXOff = m_nMaxData - m_vDatas.size(); //必然>=0
float dx = ((float)nPanelW)/m_nMaxData;
float cx = nXOff*dx;
int num = 0;
for (; it != m_vDatas.end(); it++) {
cx += dx;
pCurVert->x = cx;
pCurVert->y = (*it)*m_fScale;
pCurVert++;
num++;
if (num > 100) {//超出上面的buffer的最大值了,先画一下。
pRender->draw2DLines((float*)cdata, num, m_nColor);
num = 0;
pCurVert = (JCPerfDataRender::vertex*)cdata;
}
}
if(num>0)
pRender->draw2DLines((float*)cdata, num, m_nColor);
m_DataLock.unlock();
}
void perfBarData::addData(double tm, float st, float ed) {
m_DataLock.lock();
m_vDatas.push_back({ tm,st,ed });
if (m_vDatas.size() > m_nMaxData) {
m_vDatas.pop_front();
}
m_DataLock.unlock();
}
void perfBarData::drawData(JCPerfDataRender* pRender) {
static dataType datas[100];
m_DataLock.lock();
int datanum = m_vDatas.size();
auto it = m_vDatas.begin();
int di = 0;
for (int i = 0; i < datanum; i++) {
datas[di++] = *it++;
if (di > 100) {
pRender->drawAsBarGraph((float*)datas, di, m_fScale, m_nColor);
di = 0;
}
}
if (di > 0) {
pRender->drawAsBarGraph((float*)datas, di, m_fScale, m_nColor);
}
m_DataLock.unlock();
}
ScopePerf::ScopePerf(int id)
{
m_t0 = tmGetCurms();
m_nid=id;
}
ScopePerf::~ScopePerf()
{
float dt = (float)(tmGetCurms()-m_t0);
JCPerfHUD::updateData(m_nid, dt);
}
void JCPerfHUD::init()
{
m_nMaxData=100;
memset(m_vDatas, 0, sizeof(m_vDatas));
addData(PHUD_FRAME_DELAY,0xffffffff,"PHUD_FRAME_DELAY", 1);
addData(PHUD_RENDER_DELAY,0xffff0000,"PHUD_RENDER_DELAY", 1);
addData(PHUD_JS_DELAY,0xff00ff00,"PHUD_JS_DELAY", 1);
/*
addData(new perfBarData(PHUD_BAR_JS_ONDRAW, 0x6600ff00, "jsbar",10.0f));
addData(new perfBarData(PHUD_BAR_RENDER, 0x66ff0000, "renderbar",10.0f));
addData(new perfBarData(PHUD_BAR_JSWAIT, 0x66003300, "jswait", 10.0f));
addData(new perfBarData(PHUD_BAR_GLWAIT, 0x66660000, "glwait", 10.0f));
*/
}
void JCPerfHUD::deleteInstance()
{
int nValidSize = JCPerfHUD::m_vValidID.size();
for( int i=0; i < nValidSize ; i++ )
{
PerfData* pData =(PerfData*)JCPerfHUD::m_vDatas[JCPerfHUD::m_vValidID[i]];
if( pData == NULL )continue;
delete pData;
}
m_vValidID.clear();
}
void JCPerfHUD::addVSyncFrame() {
m_nCurVsyncFrm++;
}
void JCPerfHUD::addOnDrawFrame() {
m_nCurDrawFrm++;
}
void JCPerfHUD::resetFrame() {
m_nCurVsyncFrm = 0;
m_nCurDrawFrm = 0;
}
PerfData* JCPerfHUD::addData( int p_nId, int p_nColor,float scale ,float p_fAlert)
{
return addData(p_nId, p_nColor, "", scale, p_fAlert);
}
PerfData* JCPerfHUD::addData( int p_nId, int p_nColor,const char* p_sDesc,float scale, float p_fAlert )
{
if( p_nId < 0 || p_nId >= MAXPERFDATA )
{
LOGE("CPerfHUD::AddData超出最大数量 max=%d,cur=%d", MAXPERFDATA, p_nId );
return NULL;
}
PerfData* pData = (PerfData*)m_vDatas[p_nId];
if( pData == NULL )
{
pData = new PerfData( p_nId,p_nColor,p_sDesc );
m_vDatas[p_nId]=pData;
m_vValidID.push_back( p_nId );
}
pData->m_fScale = scale*m_fGlobalScale;
pData->m_nMaxData=m_nMaxData;
pData->m_nColor=p_nColor;
pData->m_fAlert = p_fAlert;
return pData;
}
PerfDataBase* JCPerfHUD::addData(PerfDataBase* pData) {
if (!pData)
return nullptr;
int id = pData->m_nID;
pData->m_nMaxData = m_nMaxData;
if (id < 0 || id >= MAXPERFDATA){
LOGE("CPerfHUD::AddData超出最大数量 max=%d,cur=%d", MAXPERFDATA, id);
return nullptr;
}
PerfDataBase* pCurData = m_vDatas[id];
if (pCurData == NULL){
m_vDatas[id] = pData;
m_vValidID.push_back(id);
}
else {
LOGE("已经存在数据了 %d , %s",((int)pCurData->m_nID), (pCurData->m_strDesc.c_str()));
return pCurData;
}
return pData;
}
void JCPerfHUD::delData(int p_nId)
{
if( p_nId < 0 || p_nId >= MAXPERFDATA )
{
return ;
}
PerfDataBase* pData = m_vDatas[p_nId];
if( pData != NULL )
{
delete m_vDatas[p_nId];
m_vDatas[p_nId]=NULL;
}
std::vector<short>::iterator it = m_vValidID.begin();
while( it!=m_vValidID.end() )
{
if(*it==p_nId)
{
it=m_vValidID.erase(it);
}
else
{
it++;
}
}
}
//----------------------------------------------------------------------------
PerfDataBase* JCPerfHUD::getData( int id )
{
if( id<0 || id>=MAXPERFDATA){
LOGE("JCPerfHUD::getData超出最大数量 max=%d,cur=%d", MAXPERFDATA, id );
return NULL;
}
return m_vDatas[id];
}
//----------------------------------------------------------------------------
void JCPerfHUD::updateData( int p_nDataID, float p_fData )
{
if( p_nDataID<0 || p_nDataID>=MAXPERFDATA)
{
LOGE("JCPerfHUD::updateData超出最大数量 max=%d,cur=%d", MAXPERFDATA, p_nDataID );
return ;
}
if(m_vDatas[p_nDataID])
{
((PerfData*)m_vDatas[p_nDataID])->updateData(p_fData);
}
}
//----------------------------------------------------------------------------
JCPerfDataRender::JCPerfDataRender()
{
m_nOffY = 100;
m_nOffX = 100;
m_nWidth = 400;
m_nHeight = 400;
m_nProgram = 0;
m_nVSShader = 0;
m_nPSShader = 0;
m_sVSShader = R"(
attribute vec3 g_Position;
void main(){
gl_Position = vec4(g_Position.x, g_Position.y, g_Position.z, 1.0);
})";
m_sPSShader = R"(
precision mediump float;
uniform vec4 color;
void main(){
gl_FragColor = color;
})";
}
JCPerfDataRender::~JCPerfDataRender()
{
m_kVBOManager.ReleaseVBO();
releaseGPUShader();
}
void JCPerfDataRender::validateGPUShader()
{
if (m_nProgram <= 0)
{
m_nVSShader = glCreateShader(GL_VERTEX_SHADER);
const GLchar* sVSSource = m_sVSShader.c_str();
glShaderSource(m_nVSShader, 1, &sVSSource, NULL);
glCompileShader(m_nVSShader);
m_nPSShader = glCreateShader(GL_FRAGMENT_SHADER);
const GLchar* sPSSource = m_sPSShader.c_str();
glShaderSource(m_nPSShader, 1, &sPSSource, NULL);
glCompileShader(m_nPSShader);
m_nProgram = glCreateProgram();
glAttachShader(m_nProgram, m_nVSShader);
glAttachShader(m_nProgram, m_nPSShader);
glLinkProgram(m_nProgram);
}
}
void JCPerfDataRender::releaseGPUShader()
{
if (m_nProgram)glDeleteProgram(m_nProgram);
if (m_nProgram)glDeleteShader(m_nVSShader);
if (m_nProgram)glDeleteShader(m_nPSShader);
m_nProgram = 0;
m_nVSShader = 0;
m_nPSShader = 0;
}
void JCPerfDataRender::drawData()
{
m_tmDrawTm = tmGetCurms();
GLint last_program; glGetIntegerv(GL_CURRENT_PROGRAM, &last_program);
GLint last_array_buffer; glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &last_array_buffer);
GLint last_element_array_buffer; glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &last_element_array_buffer);
GLint last_vertex_array; glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &last_vertex_array);
//last_polygon_mode[2]; glGetIntegerv(GL_POLYGON_MODE, last_polygon_mode);
GLint last_viewport[4]; glGetIntegerv(GL_VIEWPORT, last_viewport);
GLint last_scissor_box[4]; glGetIntegerv(GL_SCISSOR_BOX, last_scissor_box);
GLenum last_blend_src_rgb; glGetIntegerv(GL_BLEND_SRC_RGB, (GLint*)&last_blend_src_rgb);
GLenum last_blend_dst_rgb; glGetIntegerv(GL_BLEND_DST_RGB, (GLint*)&last_blend_dst_rgb);
GLenum last_blend_src_alpha; glGetIntegerv(GL_BLEND_SRC_ALPHA, (GLint*)&last_blend_src_alpha);
GLenum last_blend_dst_alpha; glGetIntegerv(GL_BLEND_DST_ALPHA, (GLint*)&last_blend_dst_alpha);
GLenum last_blend_equation_rgb; glGetIntegerv(GL_BLEND_EQUATION_RGB, (GLint*)&last_blend_equation_rgb);
GLenum last_blend_equation_alpha; glGetIntegerv(GL_BLEND_EQUATION_ALPHA, (GLint*)&last_blend_equation_alpha);
GLboolean last_enable_blend = glIsEnabled(GL_BLEND);
GLboolean last_enable_cull_face = glIsEnabled(GL_CULL_FACE);
GLboolean last_enable_depth_test = glIsEnabled(GL_DEPTH_TEST);
GLboolean last_enable_scissor_test = glIsEnabled(GL_SCISSOR_TEST);
GLboolean last_color_write_mask[4];
glGetBooleanv(GL_COLOR_WRITEMASK, last_color_write_mask);
GLint vb0enabled = 0;
GLint vb0size = 0;
GLint vb0type = 0;
GLint vb0normalized = 0;
GLint vb0stride = 0;
GLint vb0bufferbinding = 0;
void *vb0pointer = 0;
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &vb0enabled);
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_SIZE, &vb0size);
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_TYPE, &vb0type);
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &vb0normalized);
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &vb0stride);
glGetVertexAttribiv(0, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &vb0bufferbinding);
glGetVertexAttribPointerv(0, GL_VERTEX_ATTRIB_ARRAY_POINTER, &vb0pointer);
glColorMask(true, true, true, true);
JCLayaGL::_bindVertexArray(0);
glEnable(GL_BLEND);
glBlendEquation(GL_FUNC_ADD);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);
glDisable(GL_DEPTH_TEST);
glDisable(GL_SCISSOR_TEST);
glViewport(0, 0, JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth, JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight);
validateGPUShader();
glUseProgram(m_nProgram);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
draw2DRect(0,0,(float)m_nWidth,(float)m_nHeight,0x66000000 );
//刻度
float maxx= (float)m_nWidth;
float k[4];
k[0] = 0;
k[1] = 0;
k[2]=maxx;
k[3] = 0;
draw2DLines( k,2,0xff336633);
k[0] = 0;
k[1] = 10.0f*JCPerfHUD::m_fGlobalScale;
k[2]=maxx;
k[3] = 10.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k,2, 0x55ffff00);
k[0] = 0;
k[1] = 16.0f*JCPerfHUD::m_fGlobalScale;
k[2]=maxx;
k[3] = 16.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k,2,0x55ff0000);
k[0] = 0;
k[1] = 33.0f*JCPerfHUD::m_fGlobalScale;
k[2] = maxx;
k[3] = 33.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k, 2, 0x55ffff00);
k[0] = 0;
k[1] = 50.0f*JCPerfHUD::m_fGlobalScale;
k[2]=maxx;
k[3] = 50.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k,2, 0x550000ff);
k[0] = 0;
k[1] = 100.0f*JCPerfHUD::m_fGlobalScale;
k[2]=maxx;
k[3] = 100.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k,2, 0x550000ff);
k[0] = 0;
k[1] = 167.0f*JCPerfHUD::m_fGlobalScale;
k[2] = maxx;
k[3] = 167.0f*JCPerfHUD::m_fGlobalScale;
draw2DLines(k, 2, 0x550000ff);
//数据
int nValidSize = JCPerfHUD::m_vValidID.size();
for( int i=0; i < nValidSize ; i++ ){
PerfDataBase* pData =JCPerfHUD::m_vDatas[JCPerfHUD::m_vValidID[i]];
if( pData == NULL )continue;
pData->drawData(this);
}
// Restore
glUseProgram(last_program);
JCLayaGL::_bindVertexArray(last_vertex_array);
if (vb0enabled)
{
glBindBuffer(GL_ARRAY_BUFFER, last_array_buffer);
glVertexAttribPointer(0, vb0size, vb0type, vb0normalized, vb0stride, vb0pointer);
}
else
{
glDisableVertexAttribArray(0);
}
glColorMask(last_color_write_mask[0], last_color_write_mask[1], last_color_write_mask[2], last_color_write_mask[3]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, last_element_array_buffer);
glBlendEquationSeparate(last_blend_equation_rgb, last_blend_equation_alpha);
glBlendFuncSeparate(last_blend_src_rgb, last_blend_dst_rgb, last_blend_src_alpha, last_blend_dst_alpha);
if (last_enable_blend) glEnable(GL_BLEND); else glDisable(GL_BLEND);
if (last_enable_cull_face) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE);
if (last_enable_depth_test) glEnable(GL_DEPTH_TEST); else glDisable(GL_DEPTH_TEST);
if (last_enable_scissor_test) glEnable(GL_SCISSOR_TEST); else glDisable(GL_SCISSOR_TEST);
glViewport(last_viewport[0], last_viewport[1], (GLsizei)last_viewport[2], (GLsizei)last_viewport[3]);
//glScissor(last_scissor_box[0], last_scissor_box[1], (GLsizei)last_scissor_box[2], (GLsizei)last_scissor_box[3]);
}
void JCPerfDataRender::invalidGLRes()
{
m_kVBOManager.freeGLResource();
releaseGPUShader();
}
/*
数据的x轴单位是帧
*/
void JCPerfDataRender::draw2DLines( float* p_pVerts, int vertnum, unsigned int p_nColor)
{
if (vertnum < 2)
return;
int nVBO = m_kVBOManager.GetVBO();
if (nVBO <= 0)
{
LOGE("JCPerfDataRender::draw2DLines error, createvbo error!");
return;
}
static vertex tmpvertex[1000];
float color[4];
color[3] = ((p_nColor & 0xff000000) >> 24) / 255.0f;;
color[0] = ((p_nColor & 0x00ff0000) >> 16) / 255.0f; //r
color[1] = ((p_nColor & 0x0000ff00) >> 8) / 255.0f; //g
color[2] = (p_nColor & 0x000000ff) / 255.0f; //b
int nVertNum = vertnum > 1000 ? 1000 : vertnum;
for (int i = 0; i < nVertNum; i++)
{
float cx = *p_pVerts++;
float cy = *p_pVerts++;
cx = m_nOffX+cx;
cy = m_nOffY + m_nHeight - cy;
cx = (float)((cx*2.0 / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0);
cy = (float)(-(cy*2.0 / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0);
tmpvertex[i].x = cx;
tmpvertex[i].y = cy;
}
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, nVertNum*sizeof(vertex), tmpvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glUniform4fv(0, 1, color);
glDrawArrays(GL_LINE_STRIP, 0, vertnum);
}
//------------------------------------------------------------------------------
void JCPerfDataRender::draw2DRect(float x, float y, float w, float h, unsigned int p_nColor)
{
int nVBO = m_kVBOManager.GetVBO();
if (nVBO <= 0)
{
LOGE("JCPerfDataRender::draw2DRect error, createvbo error!");
return;
}
float color[4];
color[3] = ((p_nColor & 0xff000000)>>24)/ 255.0f;
color[0] = ((p_nColor & 0x00ff0000) >> 16) / 255.0f; //r
color[1] = ((p_nColor & 0x0000ff00) >> 8) / 255.0f; //g
color[2] = (p_nColor & 0x000000ff) / 255.0f; //b
static vertex tmpvertex[4];
int nVertNum = 4;
//下面的是错误的。可能会导致严重的丢失精度
tmpvertex[0].x = x;
tmpvertex[0].y = y;
tmpvertex[1].x = (x + w);
tmpvertex[1].y = y;
tmpvertex[2].x = (x + w);
tmpvertex[2].y = (y + h);
tmpvertex[3].x = x;
tmpvertex[3].y = (y + h);
for (int i = 0; i < 4; i++)
{
float cx = tmpvertex[i].x+m_nOffX;
float cy = tmpvertex[i].y+m_nOffY;
cx = (float)((cx*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0f);
cy = (float)(-(cy*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0f);
tmpvertex[i].x = cx;
tmpvertex[i].y = cy;
}
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, nVertNum*sizeof(vertex), tmpvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glUniform4fv(0, 1, color);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
}
/*
数据的x轴单位是时间,ms。
*/
void JCPerfDataRender::drawAsBarGraph(float* pData, int p_nDataNum, float scale, unsigned int p_nColor) {
if (p_nDataNum <= 1)
return;
int nVBO = m_kVBOManager.GetVBO();
if (nVBO <= 0){
LOGE("JCPerfDataRender::draw2DLines error, createvbo error!");
return;
}
static vertex tmpvertex[1000];
vertex* pCurVert = tmpvertex;
float color[4];
color[3] = ((p_nColor & 0xff000000) >> 24) / 255.0f;
color[0] = ((p_nColor & 0x00ff0000) >> 16) / 255.0f; //r
color[1] = ((p_nColor & 0x0000ff00) >> 8) / 255.0f; //g
color[2] = (p_nColor & 0x000000ff) / 255.0f; //b
perfBarData::dataType* pBarData = (perfBarData::dataType*)pData;
//从当前时间倒退displayDuration ms,整个图形的,左边是m_tmDrawTm - displayDuration 右边是 m_tmDrawTm
static double displayDuration = 4000.0;
double sttm = m_tmDrawTm - displayDuration;// pBarData[0].tm;
//float edtm = pBarData[p_nDataNum - 1].tm;
float dataduration = (float)displayDuration;//固定4秒钟。 edtm - sttm + 16.667f; //左右各加半个
float barwidth = m_nWidth/(dataduration/16.6667f);
float foffx = (float)m_nOffX;
float foffy = (float)m_nOffY;
int nVertNum = 0;
for (int i = 0; i < p_nDataNum; i++, pBarData++) {
if (pBarData->tm < sttm)
continue;
float cx = foffx + ((float)(pBarData->tm - sttm))*m_nWidth/ dataduration;
float ltx = cx;
float lty = foffy + m_nHeight - (pBarData->start + pBarData->duration)*scale;
float rbx = cx + barwidth;
float rby = foffy + m_nHeight - pBarData->start*scale;
if (rby - lty < 1.0f)//大小不要为0,否则看不到了
rby = lty + 1.0f;
ltx = ((ltx*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0f);
lty = (-(lty*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0f);
rbx = ((rbx*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0f);
rby = (-(rby*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0f);
pCurVert->x = ltx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = rby; pCurVert++;
pCurVert->x = ltx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = rby; pCurVert++;
pCurVert->x = ltx; pCurVert->y = rby; pCurVert++;
nVertNum += 6;
if (nVertNum >= 1000 - 6) {
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, nVertNum*sizeof(vertex), tmpvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glUniform4fv(0, 1, color);
glDrawArrays(GL_TRIANGLES, 0, nVertNum);
nVertNum = 0;
pCurVert = tmpvertex;
}
//再把下一段画到上面
if (true) {
perfBarData::dataType* pBarDataN =(i<p_nDataNum-1)?(pBarData + 1):pBarData;
float cx = foffx + ((float)(pBarData->tm - sttm))*m_nWidth / dataduration;//这个时间要用当前的
float ltx = cx;
float lty = foffy + m_nHeight - (pBarDataN->start + pBarDataN->duration+16.6667f)*scale;
float rbx = cx + barwidth;
float rby = foffy + m_nHeight - (pBarDataN->start+(float)(pBarDataN->tm-pBarData->tm))*scale;
if (rby - lty < 1.0f)//大小不要为0,否则看不到了
rby = lty + 1.0f;
ltx = ((ltx*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0f);
lty = (-(lty*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0f);
rbx = ((rbx*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasWidth) - 1.0f);
rby = (-(rby*2.0f / JCPerfHUD::m_pLayaGL->m_nMainCanvasHeight) + 1.0f);
pCurVert->x = ltx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = rby; pCurVert++;
pCurVert->x = ltx; pCurVert->y = lty; pCurVert++;
pCurVert->x = rbx; pCurVert->y = rby; pCurVert++;
pCurVert->x = ltx; pCurVert->y = rby; pCurVert++;
nVertNum += 6;
if (nVertNum >= 1000 - 6) {
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, nVertNum*sizeof(vertex), tmpvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glUniform4fv(0, 1, color);
glDrawArrays(GL_TRIANGLES, 0, nVertNum);
nVertNum = 0;
pCurVert = tmpvertex;
}
}
}
if (nVertNum > 0) {
glBindBuffer(GL_ARRAY_BUFFER, nVBO);
glBufferSubData(GL_ARRAY_BUFFER, 0, nVertNum*sizeof(vertex), tmpvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);
glUniform4fv(0, 1, color);
glDrawArrays(GL_TRIANGLES, 0, nVertNum);
}
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
+206
View File
@@ -0,0 +1,206 @@
/**
@file JCPerfHUD.h
@brief
@author James
@version 1.0
@date 2016_5_18
*/
#ifndef __JCPerfHUD_H__
#define __JCPerfHUD_H__
#include <list>
#include <string>
#include <vector>
#include <stdint.h>
#include "JCVBOManager.h"
#include <mutex>
#include <util/Log.h>
#define USEPERF
namespace laya
{
class JCLayaGL;
class JCPerfDataRender;
struct PerfDataBase{
short m_nID=0;
int m_nColor=0xff000000;
std::string m_strDesc;
unsigned short m_nMaxData=100;
float m_fScale=1.0f; //渲染时候用
virtual void drawData(JCPerfDataRender*) {};
};
/*
记录一些变量的一定个数的历史记录。并提供画出来的功能。
需要效率尽量高,因此,没有足够的封装和保护
用数组而没用map
每次updatedata都是累加数据,渲染完了之后,就会清0
*/
#define MAXPERFDATA 256
struct PerfData:public PerfDataBase{
PerfData(int id,int color, const char* pdesc){
m_nID=id;
m_strDesc=pdesc;
m_nColor = color;
}
//添加或者累加数据 如果是新的一帧就添加,如果本帧已经有数据了,就累加
void updateData( float dt);
virtual void drawData(JCPerfDataRender* pRender);
public:
std::list<float> m_vDatas;
float m_fAlert=0.0f;
std::mutex m_DataLock;
};
class perfBarData :public PerfDataBase {
public:
struct dataType{
double tm;
float start, duration;
dataType() {
tm = start = duration = 0.0f;
}
dataType(double t, float st, float ed) {
tm = t;
start = st;
duration = ed - st;
}
};
perfBarData(int id, int color, const char* pdesc,float scale) {
m_nID = id;
m_strDesc = pdesc;
m_nColor = color;
m_fScale = scale;
}
void addData(double tm, float st, float ed);
virtual void drawData(JCPerfDataRender* pRender);
private:
std::list<dataType> m_vDatas;
std::mutex m_DataLock;
};
/** @brief RenderGroup组的定义
*
*/
class ScopePerf
{
public:
double m_t0;
int m_nid;
ScopePerf(int id);
~ScopePerf();
};
#ifdef USEPERF
#define PERF_INITVAR(var) auto var = tmGetCurms();
#define PERF_UPDATE_DTIME(dataid,var,dt) \
{ auto curtm = tmGetCurms(); \
if( var==0)var = curtm; \
dt = (curtm-var); \
JCPerfHUD::updateData(dataid,dt); \
var = curtm;}
#define PERF_UPDATE_DATA(dataid,val) {JCPerfHUD::updateData(dataid,val);}
#define PERF_SCOPE(id) ScopePerf scopeperf(id);
#else
#define PERF_INITVAR(var)
#define PERF_UPDATE_DTIME(dataid,var)
#define PERF_UPDATE_DATA(dataid,val)
#define PERF_SCOPE(id)
#endif
class JCPerfHUD
{
public:
enum PERFHUD_TYPE
{
PHUD_FRAME_DELAY=0,
PHUD_RENDER_DELAY,
PHUD_JS_DELAY,
PHUD_BAR_JS_ONDRAW,
PHUD_BAR_RENDER,
PHUD_BAR_JSWAIT,
PHUD_BAR_GLWAIT,
//TODO 现在只是内部使用。导出给js以后,要注意id的冲突的问题。
};
public:
static void init();
static void deleteInstance();
static PerfData* addData(int id, int color,float scale, float p_fAlert=0);
static PerfData* addData(int id, int color,const char* pdesc, float scale, float p_fAlert=0);
static PerfDataBase* addData(PerfDataBase* pPerfData);
static void delData(int id);
static PerfDataBase* getData(int id);
static void updateData(int p_nDataID, float p_fData);
static void addOnDrawFrame();
static void addVSyncFrame();
static void resetFrame();
public:
static PerfDataBase* m_vDatas[MAXPERFDATA];
static std::vector<short> m_vValidID; //有效ID,避免遍历m_Datas
static int m_nMaxData;
static double m_tmCurRender;
static double m_tmDelayTime;
static double m_tmCurJs;
static double m_tmVSYNC;
static unsigned int m_nCurVsyncFrm; //vsync帧数
static unsigned int m_nCurDrawFrm; //实际触发onDraw的帧数
static float m_fGlobalScale;
static JCLayaGL* m_pLayaGL;
};
class JCPerfDataRender
{
public:
struct vertex {
float x, y;
};
JCPerfDataRender();
~JCPerfDataRender();
void drawData();
void draw2DLines(float* p_pVerts, int vertnum, unsigned int p_nColor);
void draw2DRect(float x, float y, float w, float h, unsigned int p_nColor );
/*
data:
start,height 都是绝对值。与面板的大小同一单位
*/
void drawAsBarGraph(float* pData, int p_nDataNum, float scale, unsigned int p_nColor);
void invalidGLRes();
private:
void validateGPUShader();
void releaseGPUShader();
private:
JCVBOManager m_kVBOManager;
int m_nOffY;
int m_nOffX;
std::string m_sVSShader;
std::string m_sPSShader;
GLuint m_nVSShader;
GLuint m_nPSShader;
GLuint m_nProgram;
double m_tmDrawTm; //当前渲染的时候的时间。用来处理跟时间相关的数据
public:
int m_nWidth; //面板的大小
int m_nHeight; //面板的大小
};
}
#endif //__JCPerfHUD_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,66 @@
/**
@file JCVBOMgr.cpp
@brief
@author James
@version 1.0
@date 2016_5_18
*/
#include "JCVBOManager.h"
namespace laya
{
JCVBOManager::JCVBOManager()
{
m_nVBOSize = 10240;
m_nCurVBOId = 0;
m_vVBO.resize(20);
m_bInited = false;
}
int JCVBOManager::GetVBO()
{
if (!m_bInited)
{
int nSize = m_vVBO.size();
for (int i = 0; i < nSize; i++)
{
m_vVBO[i] = createVertexBuffer(m_nVBOSize);
}
m_bInited = true;
}
int vbo = m_vVBO[m_nCurVBOId];
m_nCurVBOId++;
if (m_vVBO.size())
{
m_nCurVBOId %= m_vVBO.size();
}
else
{
m_nCurVBOId = 0;
}
return vbo;
}
void JCVBOManager::freeGLResource()
{
int nSize = m_vVBO.size();
glDeleteBuffers(nSize, (const GLuint*)&m_vVBO[0]);
m_bInited = false;
}
void JCVBOManager::ReleaseVBO()
{
m_bInited = false;
m_nCurVBOId = 0;
}
unsigned int JCVBOManager::createVertexBuffer( int totalSize )
{
unsigned int vbo = 0;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER,totalSize,0,GL_DYNAMIC_DRAW);
return vbo;
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,50 @@
/**
@file JCVBOMgr.h
@brief
@author James
@version 1.0
@date 2016_5_18
*/
#ifndef __JCVBOMgr_H__
#define __JCVBOMgr_H__
#include <stdio.h>
#include <vector>
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#include <OpenGLES/ES3/glext.h>
#else
#include <GLES3/gl3.h>
#endif
namespace laya
{
class JCVBOManager
{
public:
JCVBOManager();
int GetVBO();
void ReleaseVBO();
unsigned int createVertexBuffer( int totalSize );
void freeGLResource();
public:
std::vector<int> m_vVBO; //VBO
int m_nVBOSize; //VBO的大小
int m_nCurVBOId; //当前VBO的ID
bool m_bInited; //是否初始化
};
};
//------------------------------------------------------------------------------
#endif //__JCVBOMgr_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,308 @@
/**
@file JCGlobalValue.cpp
@brief
@author James
@version 1.0
@date 2018_5_30
*/
#include "JCGlobalValue.h"
#include <util/Log.h>
#include <math/Matrix32.h>
#include <memory.h>
#include <string.h>
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#include <OpenGLES/ES3/glext.h>
#else
#include <GLES3/gl3.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
//------------------------------------------------------------------------------
namespace laya
{
#define SAVE_DATA_NUM 20
JCGlobalValue::JCGlobalValue()
{
m_nStrideSize = 0;
m_pCurrentValue = NULL;
m_pBuffer = NULL;
m_nCurrentBufferPos = 0;
m_nSaveDataSize = 0;
m_pDefaultValue = NULL;
}
JCGlobalValue::~JCGlobalValue()
{
for (int i = 0, n = m_vValueDesc.size(); i < n; i++)
{
delete m_vValueDesc[i];
m_vValueDesc[i] = NULL;
}
m_vValueDesc.clear();
if (m_pBuffer)
{
delete[] m_pBuffer;
m_pBuffer = NULL;
}
if (m_pDefaultValue)
{
delete m_pDefaultValue;
m_pDefaultValue = NULL;
}
m_pCurrentValue = NULL;
}
ValueDesc* JCGlobalValue::getValueDesc(int nID)
{
return m_vValueDesc[nID];
}
void JCGlobalValue::createDefaultValue()
{
//计算总体的大小
ValueDesc* pLast = m_vValueDesc[m_vValueDesc.size() - 1];
m_nStrideSize = pLast->m_nOffset + pLast->m_nDataSize;
//分配好默认的值
m_pDefaultValue = new char[m_nStrideSize];
for (int i = 0, n = m_vValueDesc.size(); i < n; i++)
{
ValueDesc* pValueDesc = m_vValueDesc[i];
memcpy(m_pDefaultValue + pValueDesc->m_nOffset, pValueDesc->m_pDefaultValue, pValueDesc->m_nDataSize);
//这段数据可以不要了
delete pValueDesc->m_pDefaultValue;
pValueDesc->m_pDefaultValue = NULL;
}
}
void JCGlobalValue::clone(JCGlobalValue* pValueData)
{
m_nStrideSize = pValueData->m_nStrideSize;
m_pDefaultValue = new char[m_nStrideSize];
memcpy(m_pDefaultValue,pValueData->m_pDefaultValue,m_nStrideSize);
int n = pValueData->m_vValueDesc.size();
m_vValueDesc.resize(n);
for (int i = VALUE_INTERIOR_TYPE_COUNT; i < n; i++)
{
ValueDesc* pTemp = pValueData->m_vValueDesc[i];
ValueDesc* pValueDesc = new ValueDesc();
pValueDesc->m_nModifyType = pTemp->m_nModifyType;
pValueDesc->m_nDataType = pTemp->m_nDataType;
pValueDesc->m_nSize = pTemp->m_nSize;
pValueDesc->m_nDataSize = pTemp->m_nDataSize;
pValueDesc->m_nOffset = pTemp->m_nOffset;
pValueDesc->m_pDefaultValue = NULL;
m_vValueDesc[i] = pValueDesc;
}
//分配整体的buffer
m_nSaveDataSize = SAVE_DATA_NUM * m_nStrideSize;
m_pBuffer = new char[m_nSaveDataSize];
reset();
}
void JCGlobalValue::endValueDefine()
{
createDefaultValue();
//分配整体的buffer
m_nSaveDataSize = SAVE_DATA_NUM * m_nStrideSize;
m_pBuffer = new char[m_nSaveDataSize];
reset();
}
int JCGlobalValue::addValueDefine(VALUE_MODIFY_TYPE nModifyType, int nDataType, int nSize, char* pDefaultValue,int nDefaultValueSize)
{
ValueDesc* pValueDesc = new ValueDesc();
pValueDesc->m_nModifyType = nModifyType;
pValueDesc->m_nSize = nSize;
pValueDesc->m_nDataType = nDataType;
pValueDesc->m_nDataSize = nSize * 4;
//new 默认值
pValueDesc->m_pDefaultValue = new char[pValueDesc->m_nDataSize];
memset(pValueDesc->m_pDefaultValue, 0, pValueDesc->m_nDataSize);
if (nDefaultValueSize == pValueDesc->m_nDataSize)
{
memcpy(pValueDesc->m_pDefaultValue, pDefaultValue, pValueDesc->m_nDataSize);
}
int nVectorSize = m_vValueDesc.size();
if (nVectorSize == 0)
{
pValueDesc->m_nOffset = 0;
}
else
{
ValueDesc* pLast = m_vValueDesc[nVectorSize - 1];
pValueDesc->m_nOffset = pLast->m_nOffset + pLast->m_nDataSize;
}
m_vValueDesc.push_back(pValueDesc);
return nVectorSize;
}
bool JCGlobalValue::reset()
{
memset(m_pBuffer, 0, m_nSaveDataSize);
//放入一段默认的
memcpy(m_pBuffer, m_pDefaultValue, m_nStrideSize);
//当前的data指向默认
m_pCurrentValue = m_pBuffer;
m_nCurrentBufferPos = 0;
return true;
}
bool JCGlobalValue::save()
{
m_nCurrentBufferPos += m_nStrideSize;
if (m_nCurrentBufferPos >= m_nSaveDataSize )
{
int nEnlargeSize = SAVE_DATA_NUM * m_nStrideSize;
char* pBuffer = new char[m_nSaveDataSize + nEnlargeSize];
memset(pBuffer, 0, m_nSaveDataSize + nEnlargeSize);
memcpy(pBuffer, m_pBuffer, m_nSaveDataSize);
m_nSaveDataSize += nEnlargeSize;
memcpy(pBuffer + m_nCurrentBufferPos, m_pCurrentValue, m_nStrideSize);
if (m_pBuffer)
{
delete[] m_pBuffer;
m_pBuffer = NULL;
}
m_pBuffer = pBuffer;
}
else
{
memcpy(m_pBuffer + m_nCurrentBufferPos, m_pCurrentValue, m_nStrideSize);
}
//重新指向新的位置
m_pCurrentValue = m_pBuffer + m_nCurrentBufferPos;
return true;
}
bool JCGlobalValue::restore()
{
if (m_nCurrentBufferPos > 0)
{
m_nCurrentBufferPos -= m_nStrideSize;
m_pCurrentValue = m_pBuffer + m_nCurrentBufferPos;
return true;
}
else
{
LOGE("JCContextSaveData::restore save and restore don't make a pair.");
return false;
}
}
ValueDesc* JCGlobalValue::setValue(int nValueID, char* pData, VALUE_OPERATE_TYPE nOpreateType)
{
ValueDesc* pValueDesc = m_vValueDesc[nValueID];
if (pValueDesc->m_nDataType == GL_INT )
{
int* iCurData = (int*)(m_pCurrentValue + pValueDesc->m_nOffset);
int* iData = (int*)pData;
switch (nOpreateType)
{
case VALUE_OPERATE_ADD:
for (int i = 0; i < pValueDesc->m_nSize; i++)iCurData[i] *= iData[i];
break;
case VALUE_OPERATE_SUB:
for (int i = 0; i < pValueDesc->m_nSize; i++)iCurData[i] -= iData[i];
break;
case VALUE_OPERATE_MUL:
for (int i = 0; i < pValueDesc->m_nSize; i++)iCurData[i] *= iData[i];
break;
case VALUE_OPERATE_DIV:
for (int i = 0; i < pValueDesc->m_nSize; i++)iCurData[i] /= iData[i];
break;
case VALUE_OPERATE_SET:
for (int i = 0; i < pValueDesc->m_nSize; i++)iCurData[i] = iData[i];
break;
case VALUE_OPERATE_BYTE4_COLOR_MUL:
for (int i = 0; i < pValueDesc->m_nSize; i++)
{
int color1 = iCurData[i];
int color2 = iData[i];
int b = color1 & 255;
int g = (color1 >> 8) & 255;
int r = (color1 >> 16) & 255;
int a = (color1 >> 24) & 255;
int b1 = color2 & 255;
int g1 = (color2 >> 8) & 255;
int r1 = (color2 >> 16) & 255;
int a1 = (color2 >> 24) & 255;
b *= b1 / 255.0f;
g *= g1 / 255.0f;
r *= r1 / 255.0f;
a *= a1 / 255.0f;
iCurData[i] = (a << 24) + (r << 16) + (g << 8) + b;
}
break;
}
}
else if (pValueDesc->m_nDataType == GL_FLOAT)
{
float* fCurData = (float*)(m_pCurrentValue + pValueDesc->m_nOffset);
float* fData = (float*)pData;
switch (nOpreateType)
{
case VALUE_OPERATE_ADD:
for (int i = 0; i < pValueDesc->m_nSize; i++)fCurData[i] *= fData[i];
break;
case VALUE_OPERATE_SUB:
for (int i = 0; i < pValueDesc->m_nSize; i++)fCurData[i] -= fData[i];
break;
case VALUE_OPERATE_MUL:
for (int i = 0; i < pValueDesc->m_nSize; i++)fCurData[i] *= fData[i];
break;
case VALUE_OPERATE_DIV:
for (int i = 0; i < pValueDesc->m_nSize; i++)fCurData[i] /= fData[i];
break;
case VALUE_OPERATE_SET:
for (int i = 0; i < pValueDesc->m_nSize; i++)fCurData[i] = fData[i];
break;
case VALUE_OPERATE_M2_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M3_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M4_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M32_MUL:
Matrix32::mul(fCurData, fData,fCurData);
break;
case VALUE_OPERATE_M32_TRANSLATE:
Matrix32::translate(fCurData, fData[0], fData[1]);
break;
case VALUE_OPERATE_M32_SCALE:
Matrix32::scale(fCurData, fData[0], fData[1]);
break;
case VALUE_OPERATE_M32_ROTATE:
Matrix32::rotate(fCurData, fData[0]);
break;
case VALUE_OPERATE_M32_SCALE_PIVOT:
Matrix32::translate(fCurData,fData[2], fData[3]);
Matrix32::scale(fCurData, fData[0], fData[1]);
Matrix32::translate(fCurData, -fData[2], -fData[3]);
break;
case VALUE_OPERATE_M32_ROTATE_PIVOT:
Matrix32::translate(fCurData, fData[1], fData[2]);
Matrix32::rotate(fCurData, fData[0]);
Matrix32::translate(fCurData, -fData[1], -fData[2]);
break;
case VALUE_OPERATE_M32_TRANSFORM_PIVOT:
Matrix32::translate(fCurData, fData[6], fData[7]);
Matrix32::mul(fCurData, fData, fCurData);
Matrix32::translate(fCurData, -fData[6], -fData[7]);
break;
}
}
return pValueDesc;
}
void JCGlobalValue::copyValue(int nValueID, char* pData, int nDataLength)
{
ValueDesc* pValueDesc = m_vValueDesc[nValueID];
memcpy(m_pCurrentValue + pValueDesc->m_nOffset, pData, nDataLength);
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,197 @@
/**
@file JCGlobalValue.h
@brief
@author James
@version 1.0
@date 2018_5_30
*/
#ifndef __JCGlobalValue_H__
#define __JCGlobalValue_H__
#include <stdio.h>
#include <vector>
namespace laya
{
enum VALUE_TYPE
{
VALUE_TYPE_NORMAL,
VALUE_TYPE_MAT32,
VALUE_TYPE_MAT2,
VALUE_TYPE_MAT3,
VALUE_TYPE_MAT4,
};
enum EXECUTE_TYPE
{
EXECUTE_JS_TRHEAD_BUFFER = 0,
EXECUTE_RENDER_THREAD_BUFFER,
EXECUTE_COPY_TO_RENDER,
EXECUTE_COPY_TO_RENDER3D
};
enum VALUE_OPERATE_TYPE
{
VALUE_OPERATE_ADD = 0,
VALUE_OPERATE_SUB,
VALUE_OPERATE_MUL,
VALUE_OPERATE_DIV,
VALUE_OPERATE_M2_MUL,
VALUE_OPERATE_M3_MUL,
VALUE_OPERATE_M4_MUL,
VALUE_OPERATE_M32_MUL,
VALUE_OPERATE_SET,
VALUE_OPERATE_M32_TRANSLATE,
VALUE_OPERATE_M32_SCALE,
VALUE_OPERATE_M32_ROTATE,
VALUE_OPERATE_M32_SCALE_PIVOT,
VALUE_OPERATE_M32_ROTATE_PIVOT,
VALUE_OPERATE_M32_TRANSFORM_PIVOT,
VALUE_OPERATE_BYTE4_COLOR_MUL,
};
enum VALUE_MODIFY_TYPE
{
VALUE_MODIFY_MESH, //修改mesh的
VALUE_MODIFY_SHADER, //修改shader uniform的
VALUE_MODIFY_DATA_LOCATION, //数据区的位置
};
enum VALUE_INTERIOR_TYPE
{
VALUE_INTERIOR_TYPE_COUNT = 0,
};
struct ValueDesc
{
/*
* VALUE_MODIFY_MESH,VALUE_MODIFY_SHADER
*/
VALUE_MODIFY_TYPE m_nModifyType;
/*
* 只能是4字节对其的,不支持short
* GL_INT, GL_FLOAT
*/
int m_nDataType;
/*
* size传入的size
*/
int m_nSize;
/*
* dataSize,单位是byte
*/
int m_nDataSize;
/*
* offsetSize 偏移值为byte
*/
int m_nOffset;
/*
* offsetSize 偏移值为byte
*/
char* m_pDefaultValue;
/*
* 数据类型
*/
VALUE_TYPE m_nValueType;
ValueDesc()
{
m_nModifyType = VALUE_MODIFY_MESH;
m_nDataType = 0;
m_nSize = 0;
m_nDataSize = 0;
m_nOffset = 0;
m_pDefaultValue = NULL;
m_nValueType = VALUE_TYPE_NORMAL;
}
~ValueDesc()
{
if (m_pDefaultValue)
{
delete[] m_pDefaultValue;
m_pDefaultValue = NULL;
}
}
};
/**
* @brief
*/
class JCGlobalValue
{
public:
struct Point
{
float x, y;
};
public:
/** @brief构造函数
*/
JCGlobalValue();
/** @brief析构函数
*/
~JCGlobalValue();
bool reset();
/** @brief save保存状态
* @return 返回成功失败
*/
bool save();
/** @brief 恢复函数
* @return 返回成功失败
*/
bool restore();
public:
ValueDesc* getValueDesc(int nID);
int addValueDefine(VALUE_MODIFY_TYPE nModifyType, int nDataType, int nSize,char* pDefaultValue,int nDefaultValueSize);
void endValueDefine();
void clone( JCGlobalValue* pValueData );
ValueDesc* setValue(int nValueID, char* pData, VALUE_OPERATE_TYPE nOpreateType);
void copyValue(int nValueID, char* pData,int nDataLenght);
private:
void createDefaultValue();
public:
char* m_pCurrentValue; ///<当前的ValueData
public:
char* m_pBuffer; ///<保存的buffer
int m_nCurrentBufferPos; ///<当前的bufferPos
int m_nSaveDataSize; ///<存储的dataSize
int m_nStrideSize; ///<单个save的数据长度
std::vector<ValueDesc*> m_vValueDesc; ///<数据描述信息
char* m_pDefaultValue; ///<数据默认值
};
}
//------------------------------------------------------------------------------
#endif //__JCGlobalValue_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,204 @@
/**
@file JCGpuProgram.cpp
@brief
@author James
@version 1.0
@date 2017_11_28
*/
#include "JCGpuProgram.h"
#include <util/Log.h>
#include <stdio.h>
namespace laya{
JCGpuProgramTemplate::JCGpuProgramTemplate(const char* sVS, const char* sPS, std::vector<std::string>& vBindAtrrib)
{
setSrc(sVS, sPS);
m_vAttribBind = vBindAtrrib;
}
JCGpuProgramTemplate::~JCGpuProgramTemplate()
{
freeGLResource();
for (auto& v : m_vShaderCache)
{
delete v.second;
}
m_vShaderCache.clear();
}
void JCGpuProgramTemplate::setSrc(const char* sVS, const char* sPS)
{
if (!sVS || !sPS)return;
m_sVS = sVS;
m_sPS = sPS;
}
JCGpuProgram* JCGpuProgramTemplate::getInstance(const char* sMacro)
{
std::map<std::string, JCGpuProgram*>::iterator iter = m_vShaderCache.find(sMacro);
if (iter != m_vShaderCache.end())
{
return (*iter).second;
}
JCGpuProgram* pRet = new JCGpuProgram();
pRet->m_sMacro = sMacro ? sMacro : "";
m_vShaderCache[sMacro] = pRet;
pRet->m_pTemplate = this;
return pRet;
}
void JCGpuProgramTemplate::freeGLResource()
{
for (auto& v : m_vShaderCache)
{
(v.second)->freeGLResource();
}
}
JCGpuProgram::JCGpuProgram()
{
m_nVS = m_nPS = m_nProgram = 0;
m_pTemplate = NULL;
m_pUniformDesc = NULL;
}
JCGpuProgram::~JCGpuProgram()
{
freeGLResource();
if (m_pUniformDesc)
{
delete (void *)m_pUniformDesc;
}
}
bool JCGpuProgram::checkCompile(int nShader, char* sDesc)
{
GLint compiled = 0;
glGetShaderiv(nShader, GL_COMPILE_STATUS, &compiled);
if (!compiled)
{
GLint infoLen = 0;
glGetShaderiv(nShader, GL_INFO_LOG_LENGTH, &infoLen);
if (infoLen)
{
char* buf = new char[infoLen];
if (buf)
{
glGetShaderInfoLog(nShader, infoLen, NULL, buf);
LOGE("JCGpuProgram::checkCompile Could not compile shader %s:\n%s\n", sDesc ? sDesc : "", buf);
delete[] buf;
}
glDeleteShader(nShader);
}
return false;
}
return true;
}
void JCGpuProgram::useProgram()
{
if( m_nProgram <= 0 )
{
compile();
if(m_nProgram<=0)return;
}
glUseProgram( m_nProgram );
}
void JCGpuProgram::freeGLResource()
{
if( m_nVS>0 )
{
glDeleteShader(m_nVS);
m_nVS = 0;
}
if( m_nPS )
{
glDeleteShader( m_nPS);
m_nPS = 0;
}
glDeleteProgram( m_nProgram );
m_nProgram = 0;
}
bool JCGpuProgramTemplate::splitKeyValue(const char* pSems, std::map<std::string, std::string>& vOut)
{
char strVarName[64];
const char* pCur = pSems;
char* pDes = strVarName;
std::string* pSemNameInMap = nullptr;
while (true)
{
if (*pCur != ',' && *pCur != 0)
{
*pDes++ = *pCur;
}
else
{
*pDes = 0;
if (pSemNameInMap == nullptr)
pSemNameInMap = &(vOut[strVarName]);
else
{
*pSemNameInMap = strVarName;
pSemNameInMap = nullptr;
}
pDes = strVarName;
if (*pCur == 0)
break;
}
pCur++;
}
return true;
}
bool JCGpuProgram::compile()
{
int nGLVS, nGLPS;
nGLVS = glCreateShader(GL_VERTEX_SHADER);
const char* strShaders[2] = { m_sMacro.c_str(), m_pTemplate->m_sVS.c_str() };
glShaderSource(nGLVS, 2, strShaders, NULL);
glCompileShader(nGLVS);
if (!checkCompile(nGLVS, "VS"))return false;
nGLPS = glCreateShader(GL_FRAGMENT_SHADER);
strShaders[1] = m_pTemplate->m_sPS.c_str();
glShaderSource(nGLPS, 2, strShaders, NULL);
glCompileShader(nGLPS);
if (!checkCompile(nGLPS, "PS"))return false;
int nProgram = glCreateProgram();
glAttachShader(nProgram, nGLVS);
glAttachShader(nProgram, nGLPS);
//bind attribute location
for (size_t i = 0; i < m_pTemplate->m_vAttribBind.size(); i++)
{
glBindAttribLocation(nProgram, i, m_pTemplate->m_vAttribBind[i].c_str());
}
glLinkProgram(nProgram);
GLint linkStatus = GL_FALSE;
glGetProgramiv(nProgram, GL_LINK_STATUS, &linkStatus);
if (linkStatus != GL_TRUE)
{
GLint bufLength = 0;
glGetProgramiv(nProgram, GL_INFO_LOG_LENGTH, &bufLength);
if (bufLength)
{
char* buf = new char[bufLength];
if (buf)
{
glGetProgramInfoLog(nProgram, bufLength, NULL, buf);
LOGE("JCGpuProgram::compile Could not link program:\n%s\n", buf);
delete[] buf;
}
}
glDeleteProgram(nProgram);
nProgram = 0;
}
m_nVS = nGLVS;
m_nPS = nGLPS;
m_nProgram = nProgram;
return true;
}
GLuint JCGpuProgram::getGpuProgram()
{
if (m_nProgram > 0)return m_nProgram;
compile();
return m_nProgram;
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,86 @@
/**
@file JCGpuProgram.h
@brief
@author James
@version 1.0
@date 2017_11_28
*/
#ifndef __JCGpuProgram_H__
#define __JCGpuProgram_H__
#if __APPLE__
#include <OpenGLES/ES3/gl.h>
#include <OpenGLES/ES3/glext.h>
#else
#include <GLES3/gl3.h>
#endif
#include <string>
#include <map>
#include <vector>
namespace laya
{
class JCNamedData;
class JCGpuProgram;
class JCGpuProgramTemplate
{
public:
JCGpuProgramTemplate(const char* sVS, const char* sPS, std::vector<std::string>& vBindAtrrib);
~JCGpuProgramTemplate();
void setSrc(const char* sVS, const char* sPS);
JCGpuProgram* getInstance(const char* sMacro);
void freeGLResource();
bool splitKeyValue(const char* sBuffer, std::map<std::string, std::string>& vOut);
public:
std::string m_sVS;
std::string m_sPS;
std::map<std::string, JCGpuProgram*> m_vShaderCache;
std::vector<std::string> m_vAttribBind;
};
/*
gpuProgram 是一种资源,为了恢复,需要保留源代码或者对应的文件
*/
class JCGpuProgram
{
public:
JCGpuProgram();
~JCGpuProgram();
bool checkCompile(int nShader, char* sDesc);
void freeGLResource();
void useProgram();
GLuint getGpuProgram();
bool compile();
public:
int m_nVS;
int m_nPS;
JCGpuProgramTemplate* m_pTemplate;
JCNamedData* m_pUniformDesc;
std::string m_sMacro;
private:
GLuint m_nProgram;
};
}
//------------------------------------------------------------------------------
#endif //__JCGpuProgram_H__
//-----------------------------END FILE--------------------------------
@@ -0,0 +1,35 @@
/**
@file JCRegister.cpp
@brief
@author James
@version 1.0
@date 2018_6_25
*/
#include "JCRegister.h"
namespace laya
{
JCRegister::JCRegister(int nRegNum)
{
m_nRegNum = nRegNum;
m_vRegPool.resize(m_nRegNum);
int nMaxSize = sizeof(float) * 16;
for (int i = 0; i < m_nRegNum; i++)
{
m_vRegPool[i] = new char[nMaxSize];
}
}
JCRegister::~JCRegister()
{
for (int i = 0; i < m_nRegNum; i++)
{
delete[] m_vRegPool[i];
}
m_vRegPool.clear();
}
}
//------------------------------------------------------------------------------
//-----------------------------END FILE--------------------------------
+149
View File
@@ -0,0 +1,149 @@
/**
@file JCRegister.h
@brief
@author James
@version 1.0
@date 2018_6_25
*/
#ifndef __JCRegister_H__
#define __JCRegister_H__
#include <stdio.h>
#include <string>
#include <vector>
#include <math/Matrix32.h>
#include "JCGlobalValue.h"
#if __APPLE__
#include <OpenGLES/ES2/gl.h>
#include <OpenGLES/ES2/glext.h>
#else
#include <GLES3/gl3.h>
#include <EGL/egl.h>
#include <EGL/eglext.h>
#endif
namespace laya
{
enum RELATION_ZERO
{
RZ_LESS = 0, //小于
RZ_EQUAL, //等于
RZ_GREATER, //大于
RZ_LEQUAL, //小于等于
RZ_GEQUAL, //大于等于
RZ_NOTEQUAL //不等于
};
class JCRegister
{
public:
JCRegister(int nRegNum=32);
virtual ~JCRegister();
inline char* getReg(int nIndex)
{
return m_vRegPool[nIndex];
}
inline bool loadData(int nIndex, char* pData, int nDataSize)
{
char* pReg = m_vRegPool[nIndex];
memcpy(pReg, pData, nDataSize);
return true;
}
inline bool storeData(int nIndex, char* pData, int nDataSize)
{
if (nIndex >= m_nRegNum) return false;
char* pReg = m_vRegPool[nIndex];
memcpy(pData, pReg, nDataSize);
return true;
}
inline bool operateReg(int nRegOut, int nReg1, int nReg2, int nSize, VALUE_OPERATE_TYPE nOperateType, int nDataType)
{
if (nRegOut >= m_nRegNum || nReg1 >= m_nRegNum || nReg2 >= m_nRegNum) return false;
char* pReg1 = m_vRegPool[nReg1];
char* pReg2 = m_vRegPool[nReg2];
char* pRegOut = m_vRegPool[nRegOut];
if (nDataType == GL_INT)
{
int* iReg1 = (int*)pReg1;
int* iReg2 = (int*)pReg2;
int* iRegOut = (int*)pRegOut;
int size = nSize / sizeof(int);
switch (nOperateType)
{
case VALUE_OPERATE_ADD:
for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] + iReg2[i];
break;
case VALUE_OPERATE_SUB:
for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] - iReg2[i];
break;
case VALUE_OPERATE_MUL:
for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] / iReg2[i];
break;
case VALUE_OPERATE_DIV:
for (int i = 0; i < size; i++)iRegOut[i] = iReg1[i] * iReg2[i];
break;
default:
break;
}
}
else if (nDataType == GL_FLOAT)
{
float* fReg1 = (float*)pReg1;
float* fReg2 = (float*)pReg2;
float* fRegOut = (float*)pRegOut;
int size = nSize / sizeof(float);
switch (nOperateType)
{
case VALUE_OPERATE_ADD:
for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] + fReg2[i];
break;
case VALUE_OPERATE_SUB:
for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] - fReg2[i];
break;
case VALUE_OPERATE_MUL:
for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] * fReg2[i];
break;
case VALUE_OPERATE_DIV:
for (int i = 0; i < size; i++)fRegOut[i] = fReg1[i] / fReg2[i];
break;
case VALUE_OPERATE_M2_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M3_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M4_MUL:
{
//TODO
}
break;
case VALUE_OPERATE_M32_MUL:
Matrix32::mul(fRegOut, fReg1, fReg2);
break;
}
}
return true;
}
private:
int m_nRegNum; ///<寄存器的个数
std::vector<char*> m_vRegPool; ///<寄存器的池子
};
}
//------------------------------------------------------------------------------
#endif //__JCRegister_H__
//-----------------------------END FILE--------------------------------