1
0
mirror of https://github.com/blawar/GLideN64.git synced 2024-07-02 09:03:37 +00:00

Make glBlendFuncSeparate() available

This commit is contained in:
S2S 2020-05-10 10:11:59 +02:00 committed by Sergey Lipskiy
parent 4c8a40c6d8
commit 3df3df9964
12 changed files with 92 additions and 0 deletions

View File

@ -100,6 +100,11 @@ void Context::setBlending(BlendParam _sfactor, BlendParam _dfactor)
m_impl->setBlending(_sfactor, _dfactor);
}
void graphics::Context::setBlendingSeparate(BlendParam _sfactorcolor, BlendParam _dfactorcolor, BlendParam _sfactoralpha, BlendParam _dfactoralpha)
{
m_impl->setBlendingSeparate(_sfactorcolor, _dfactorcolor, _sfactoralpha, _dfactoralpha);
}
void Context::setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha)
{
m_impl->setBlendColor(_red, _green, _blue, _alpha);

View File

@ -69,6 +69,8 @@ namespace graphics {
void setBlending(BlendParam _sfactor, BlendParam _dfactor);
void setBlendingSeparate(BlendParam _sfactorcolor, BlendParam _dfactorcolor, BlendParam _sfactoralpha, BlendParam _dfactoralpha);
void setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha);
void clearColorBuffer(f32 _red, f32 _green, f32 _blue, f32 _alpha);

View File

@ -22,6 +22,7 @@ namespace graphics {
virtual void setViewport(s32 _x, s32 _y, s32 _width, s32 _height) = 0;
virtual void setScissor(s32 _x, s32 _y, s32 _width, s32 _height) = 0;
virtual void setBlending(BlendParam _sfactor, BlendParam _dfactor) = 0;
virtual void setBlendingSeparate(BlendParam _sfactorcolor, BlendParam _dfactorcolor, BlendParam _sfactoralpha, BlendParam _dfactoralpha) = 0;
virtual void setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha) = 0;
virtual void clearColorBuffer(f32 _red, f32 _green, f32 _blue, f32 _alpha) = 0;
virtual void clearDepthBuffer() = 0;

View File

@ -62,6 +62,7 @@ static void* IOSGLGetProcAddress (const char *name)
//GL Functions
PFNGLBLENDFUNCPROC ptrBlendFunc;
PFNGLBLENDFUNCSEPARATEPROC ptrBlendFuncSeparate;
PFNGLPIXELSTOREIPROC ptrPixelStorei;
PFNGLCLEARCOLORPROC ptrClearColor;
PFNGLCULLFACEPROC ptrCullFace;
@ -388,4 +389,7 @@ void initGLFunctions()
GL_GET_PROC_ADR(PFNGLEGLIMAGETARGETTEXTURE2DOESPROC, EGLImageTargetTexture2DOES);
GL_GET_PROC_ADR(PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC, EGLImageTargetRenderbufferStorageOES);
GL_GET_PROC_ADR(PFNGLBLENDFUNCSEPARATEPROC, BlendFuncSeparate);
}

View File

@ -52,6 +52,7 @@ typedef void (APIENTRYP PFNGLCOPYTEXIMAGE2DPROC) (GLenum target, GLint level, GL
#endif
extern PFNGLBLENDFUNCPROC ptrBlendFunc;
extern PFNGLBLENDFUNCSEPARATEPROC ptrBlendFuncSeparate;
extern PFNGLPIXELSTOREIPROC ptrPixelStorei;
extern PFNGLCLEARCOLORPROC ptrClearColor;
extern PFNGLCULLFACEPROC ptrCullFace;
@ -203,6 +204,7 @@ void initGLFunctions();
#define glGetError(...) opengl::FunctionWrapper::wrGetError(__VA_ARGS__)
#define glBlendFunc(...) opengl::FunctionWrapper::wrBlendFunc(__VA_ARGS__)
#define glBlendFuncSeparate(...) opengl::FunctionWrapper::wrBlendFuncSeparate(__VA_ARGS__)
#define glPixelStorei(...) opengl::FunctionWrapper::wrPixelStorei(__VA_ARGS__)
#define glClearColor(...) opengl::FunctionWrapper::wrClearColor(__VA_ARGS__)
#define glCullFace(...) opengl::FunctionWrapper::wrCullFace(__VA_ARGS__)

View File

@ -58,6 +58,42 @@ private:
GLenum m_dfactor;
};
class GlBlendFuncSeparateCommand : public OpenGlCommand
{
public:
GlBlendFuncSeparateCommand() :
OpenGlCommand(false, false, "glBlendFuncSeparate")
{
}
static std::shared_ptr<OpenGlCommand> get(GLenum sfactorcolor, GLenum dfactorcolor, GLenum sfactoralpha, GLenum dfactoralpha)
{
static int poolId = OpenGlCommandPool::get().getNextAvailablePool();
auto ptr = getFromPool<GlBlendFuncSeparateCommand>(poolId);
ptr->set(sfactorcolor, dfactorcolor, sfactoralpha, dfactoralpha);
return ptr;
}
void commandToExecute() override
{
ptrBlendFuncSeparate(m_sfactorcolor, m_dfactorcolor, m_sfactoralpha, m_dfactoralpha);
}
private:
void set(GLenum sfactorcolor, GLenum dfactorcolor, GLenum sfactoralpha, GLenum dfactoralpha)
{
m_sfactorcolor = sfactorcolor;
m_dfactorcolor = dfactorcolor;
m_sfactoralpha = sfactoralpha;
m_dfactoralpha = dfactoralpha;
}
GLenum m_sfactorcolor;
GLenum m_dfactorcolor;
GLenum m_sfactoralpha;
GLenum m_dfactoralpha;
};
class GlPixelStoreiCommand : public OpenGlCommand
{
public:

View File

@ -144,6 +144,15 @@ namespace opengl {
ptrBlendFunc(sfactor, dfactor);
}
void FunctionWrapper::wrBlendFuncSeparate(GLenum sfactorcolor, GLenum dfactorcolor, GLenum sfactoralpha, GLenum dfactoralpha)
{
if (m_threaded_wrapper)
executeCommand(GlBlendFuncSeparateCommand::get(sfactorcolor, dfactorcolor, sfactoralpha, dfactoralpha));
else
ptrBlendFuncSeparate(sfactorcolor, dfactorcolor, sfactoralpha, dfactoralpha);
}
void FunctionWrapper::wrPixelStorei(GLenum pname, GLint param)
{
if (m_threaded_wrapper)

View File

@ -59,6 +59,7 @@ namespace opengl {
static void setThreadedMode(u32 _threaded);
static void wrBlendFunc(GLenum sfactor, GLenum dfactor);
static void wrBlendFuncSeparate(GLenum sfactorcolor, GLenum dfactorcolor, GLenum sfactoralpha, GLenum dfactoralpha);
static void wrPixelStorei(GLenum pname, GLint param);
static void wrClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
static void wrCullFace(GLenum mode);

View File

@ -119,6 +119,15 @@ void CachedBlending::setBlending(Parameter _sfactor, Parameter _dfactor)
glBlendFunc(GLenum(_sfactor), GLenum(_dfactor));
}
/*---------------CachedBlendingSeparate-------------*/
void CachedBlendingSeparate::setBlendingSeparate(Parameter _sfactorcolor, Parameter _dfactorcolor, Parameter _sfactoralpha, Parameter _dfactoralpha)
{
if (update(_sfactorcolor, _dfactorcolor, _sfactoralpha, _dfactoralpha))
glBlendFuncSeparate(GLenum(_sfactorcolor), GLenum(_dfactorcolor), GLenum(_sfactoralpha), GLenum(_dfactoralpha));
}
/*---------------CachedBlendColor-------------*/
void CachedBlendColor::setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha)
@ -269,6 +278,12 @@ CachedBlending * CachedFunctions::getCachedBlending()
return &m_blending;
}
CachedBlendingSeparate * CachedFunctions::getCachedBlendingSeparate()
{
return &m_blendingseparate;
}
CachedBlendColor * CachedFunctions::getCachedBlendColor()
{
return &m_blendColor;

View File

@ -170,6 +170,13 @@ namespace opengl {
void setBlending(graphics::Parameter _sfactor, graphics::Parameter _dfactor);
};
class CachedBlendingSeparate : public Cached4 //<graphics::Parameter, graphics::Parameter, graphics::Parameter, graphics::Parameter>
{
public:
void setBlendingSeparate(graphics::Parameter _sfactorcolor, graphics::Parameter _dfactorcolor, graphics::Parameter _sfactoralpha, graphics::Parameter _dfactoralpha);
};
class CachedBlendColor : public Cached4
{
public:
@ -246,6 +253,8 @@ namespace opengl {
CachedScissor * getCachedScissor();
CachedBlending * getCachedBlending();
CachedBlendingSeparate * getCachedBlendingSeparate();
CachedBlendColor * getCachedBlendColor();
@ -274,6 +283,7 @@ namespace opengl {
CachedViewport m_viewport;
CachedScissor m_scissor;
CachedBlending m_blending;
CachedBlendingSeparate m_blendingseparate;
CachedBlendColor m_blendColor;
CachedClearColor m_clearColor;
CachedVertexAttribArray m_attribArray;

View File

@ -158,6 +158,11 @@ void ContextImpl::setBlending(graphics::BlendParam _sfactor, graphics::BlendPara
m_cachedFunctions->getCachedBlending()->setBlending(_sfactor, _dfactor);
}
void ContextImpl::setBlendingSeparate(graphics::BlendParam _sfactorcolor, graphics::BlendParam _dfactorcolor, graphics::BlendParam _sfactoralpha, graphics::BlendParam _dfactoralpha)
{
m_cachedFunctions->getCachedBlendingSeparate()->setBlendingSeparate(_sfactorcolor, _dfactorcolor, _sfactoralpha, _dfactoralpha);
}
void ContextImpl::setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha)
{
m_cachedFunctions->getCachedBlendColor()->setBlendColor(_red, _green, _blue, _alpha);

View File

@ -44,6 +44,8 @@ namespace opengl {
void setBlending(graphics::BlendParam _sfactor, graphics::BlendParam _dfactor) override;
void setBlendingSeparate(graphics::BlendParam _sfactorcolor, graphics::BlendParam _dfactorcolor, graphics::BlendParam _sfactoralpha, graphics::BlendParam _dfactoralpha) override;
void setBlendColor(f32 _red, f32 _green, f32 _blue, f32 _alpha) override;
void clearColorBuffer(f32 _red, f32 _green, f32 _blue, f32 _alpha) override;