mirror of
https://github.com/MobileGL-Dev/MobileGL
synced 2026-09-11 05:38:31 +09:00
[Feat] (DiligentEngine): Implement most rendering by DiligentEngine.
This commit is contained in:
@@ -6,19 +6,73 @@
|
||||
|
||||
namespace MG_GL::GL {
|
||||
void Clear(GLbitfield mask) {
|
||||
MG_Util::Debug::LogD("glClear, mask: 0x%X", mask);
|
||||
GLenum result = MG_State::glClear(mask);
|
||||
if (result == GL_NO_ERROR) {
|
||||
GLuint drawFramebuffer = MG_State_T::framebufferState->currentBindings_[GL_DRAW_FRAMEBUFFER];
|
||||
if (drawFramebuffer == 0) {
|
||||
drawFramebuffer = 0;
|
||||
}
|
||||
|
||||
auto it = MG_Diligent::g_FramebufferMap.find(drawFramebuffer);
|
||||
if (it == MG_Diligent::g_FramebufferMap.end()) {
|
||||
MG_Util::Debug::LogE("Framebuffer not found: %u", drawFramebuffer);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error clearing buffers: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
|
||||
MG_Diligent::GLFramebufferInfo& fbInfo = it->second;
|
||||
auto& commonState = *MG_State_T::commonState;
|
||||
|
||||
/*if (!MG_Diligent::IsInRenderPass) {
|
||||
if (fbInfo.pRenderPass && fbInfo.pFramebuffer) {
|
||||
Diligent::BeginRenderPassAttribs beginRenderPassAttribs;
|
||||
beginRenderPassAttribs.pFramebuffer = fbInfo.pFramebuffer;
|
||||
beginRenderPassAttribs.pRenderPass = fbInfo.pRenderPass;
|
||||
beginRenderPassAttribs.StateTransitionMode = Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION;
|
||||
beginRenderPassAttribs.ClearValueCount = fbInfo.ClearValues.size();
|
||||
beginRenderPassAttribs.pClearValues = fbInfo.ClearValues.data();
|
||||
|
||||
MG_Diligent::g_pContext->BeginRenderPass(beginRenderPassAttribs);
|
||||
MG_Diligent::IsInRenderPass = true;
|
||||
} else {
|
||||
MG_Util::Debug::LogE("Cannot begin render pass for framebuffer: %u", drawFramebuffer);
|
||||
return;
|
||||
}
|
||||
}*/
|
||||
|
||||
if (mask & GL_COLOR_BUFFER_BIT) {
|
||||
for (size_t i = 0; i < fbInfo.ColorRTVs.size(); ++i) {
|
||||
if (fbInfo.ColorRTVs[i]) {
|
||||
MG_Diligent::g_pContext->ClearRenderTarget(
|
||||
fbInfo.ColorRTVs[i],
|
||||
commonState.clearColor,
|
||||
Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (mask & (GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT)) {
|
||||
if (fbInfo.pDepthStencilRTV) {
|
||||
Diligent::Uint32 clearFlags = 0;
|
||||
if (mask & GL_DEPTH_BUFFER_BIT) clearFlags |= Diligent::CLEAR_DEPTH_FLAG;
|
||||
if (mask & GL_STENCIL_BUFFER_BIT) clearFlags |= Diligent::CLEAR_STENCIL_FLAG;
|
||||
|
||||
MG_Diligent::g_pContext->ClearDepthStencil(
|
||||
fbInfo.pDepthStencilRTV,
|
||||
static_cast<Diligent::CLEAR_DEPTH_STENCIL_FLAGS>(clearFlags),
|
||||
commonState.clearDepth,
|
||||
0,
|
||||
Diligent::RESOURCE_STATE_TRANSITION_MODE_TRANSITION
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Enable(GLenum cap) {
|
||||
MG_Util::Debug::LogD("glEnable, cap: %s", MG_Util::Debug::GLEnumToString(cap));
|
||||
GLenum result = MG_State::glEnable(cap);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error enabling capability: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -26,7 +80,10 @@ namespace MG_GL::GL {
|
||||
void Disable(GLenum cap) {
|
||||
MG_Util::Debug::LogD("glDisable, cap: %s", MG_Util::Debug::GLEnumToString(cap));
|
||||
GLenum result = MG_State::glDisable(cap);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error disabling capability: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -36,7 +93,10 @@ namespace MG_GL::GL {
|
||||
MG_Util::Debug::GLEnumToString(sfactor),
|
||||
MG_Util::Debug::GLEnumToString(dfactor));
|
||||
GLenum result = MG_State::glBlendFunc(sfactor, dfactor);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting blend func: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -48,7 +108,10 @@ namespace MG_GL::GL {
|
||||
MG_Util::Debug::GLEnumToString(srcAlpha),
|
||||
MG_Util::Debug::GLEnumToString(dstAlpha));
|
||||
GLenum result = MG_State::glBlendFuncSeparate(srcRGB, dstRGB, srcAlpha, dstAlpha);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting separate blend func: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -56,7 +119,10 @@ namespace MG_GL::GL {
|
||||
void ClearColor(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha) {
|
||||
MG_Util::Debug::LogD("glClearColor, rgba: [%.2f, %.2f, %.2f, %.2f]", red, green, blue, alpha);
|
||||
GLenum result = MG_State::glClearColor(red, green, blue, alpha);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting clear color: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -64,7 +130,10 @@ namespace MG_GL::GL {
|
||||
void ClearDepth(GLdouble depth) {
|
||||
MG_Util::Debug::LogD("glClearDepth, depth: %.3f", depth);
|
||||
GLenum result = MG_State::glClearDepth(depth);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting clear depth: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -72,7 +141,10 @@ namespace MG_GL::GL {
|
||||
void ColorMask(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) {
|
||||
MG_Util::Debug::LogD("glColorMask, rgba: [%d, %d, %d, %d]", red, green, blue, alpha);
|
||||
GLenum result = MG_State::glColorMask(red, green, blue, alpha);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting color mask: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -80,7 +152,10 @@ namespace MG_GL::GL {
|
||||
void DepthFunc(GLenum func) {
|
||||
MG_Util::Debug::LogD("glDepthFunc, func: %s", MG_Util::Debug::GLEnumToString(func));
|
||||
GLenum result = MG_State::glDepthFunc(func);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting depth func: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -88,7 +163,10 @@ namespace MG_GL::GL {
|
||||
void DepthMask(GLboolean flag) {
|
||||
MG_Util::Debug::LogD("glDepthMask, flag: %d", flag);
|
||||
GLenum result = MG_State::glDepthMask(flag);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting depth mask: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -97,7 +175,9 @@ namespace MG_GL::GL {
|
||||
MG_Util::Debug::LogD("glViewport, x: %d, y: %d, width: %d, height: %d",
|
||||
x, y, width, height);
|
||||
GLenum result = MG_State::glViewport(x, y, width, height);
|
||||
if (result == GL_NO_ERROR) return;
|
||||
if (result == GL_NO_ERROR) {
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error setting viewport: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
@@ -105,8 +185,10 @@ namespace MG_GL::GL {
|
||||
void PixelStorei(GLenum pname, GLint param) {
|
||||
MG_Util::Debug::LogD("glPixelStorei, pname: %d, param: %d", pname, param);
|
||||
GLenum result = MG_State::SetPixelStoreInt(pname,param);
|
||||
if (result == GL_NO_ERROR)
|
||||
if (result == GL_NO_ERROR) {
|
||||
MG_Diligent::g_PSOManager.MarkPSODirty(MG_State_T::programState->currentProgram_);
|
||||
return;
|
||||
}
|
||||
MG_State::SetError(result);
|
||||
MG_Util::Debug::LogE("Error from MG State: %s", MG_Util::Debug::GLEnumToString(result));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user