Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix black panel AMD GPU #42

Merged
merged 7 commits into from
Jun 7, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## [0.6.1] - 2021-06-07
### Fixed
* Fix black panel on AMD and Intel GPU

## [0.6.0] - 2021-05-20
### Added
* Export
Expand Down
5 changes: 3 additions & 2 deletions Elit3d/installation_dir/Configuration/Configuration.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"App": {
"name": "Elit3d",
"version": "0.6.0"
"version": "0.6.1"
},
"Camera3D": {
"FOV": 60.0,
Expand All @@ -19,7 +19,8 @@
"Objects": null,
"Render3D": {
"major_version": 3,
"minor_version": 3
"minor_version": 1,
"samples": 4
},
"Resources": null,
"Scene": null,
Expand Down
142 changes: 134 additions & 8 deletions Elit3d/src/Modules/m1Render3D.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@

#include "ExternalTools/mmgr/mmgr.h"

#ifdef _WIN32
#include <windows.h>
#else
#define APIENTRY
#endif
m1Render3D::m1Render3D(bool start_enabled) : Module("Render3D", start_enabled)
{
}
Expand All @@ -30,16 +35,21 @@ m1Render3D::~m1Render3D()
delete (*i).second;
}

void APIENTRY GLDebugMessageCallback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* msg, const void* data);

bool m1Render3D::Init(const nlohmann::json& node)
{
PROFILE_FUNCTION();
bool ret = true;

/*
* TODO: Fix texture issue on OpenGL version changes
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, node.value("major_version", 3));
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, node.value("minor_version", 3));*/

//TODO: Fix texture issue on OpenGL version changes
int major = node.value("major_version", 3);
int minor = node.value("minor_version", 1);
if (major > 0 && minor >= 0) {
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, major);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, minor);
}

context = SDL_GL_CreateContext(App->window->window);

Expand Down Expand Up @@ -68,7 +78,7 @@ bool m1Render3D::Init(const nlohmann::json& node)

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, node.value("major_version", 3));
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, node.value("minor_version", 3));
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, node.value("minor_version", 1));

SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8);
Expand All @@ -78,8 +88,16 @@ bool m1Render3D::Init(const nlohmann::json& node)
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

smaa = node.value("samples", 4);
GLint maxSamples = 0;
glGetIntegerv(GL_MAX_SAMPLES, &maxSamples);
if (smaa > maxSamples)
smaa = maxSamples;
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 8);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, smaa);

glEnable(GL_DEBUG_OUTPUT);
glDebugMessageCallback(GLDebugMessageCallback, nullptr);

glClearColor(0.2f, 0.2f, 0.2f, 1.0f);

Expand All @@ -104,7 +122,7 @@ UpdateStatus m1Render3D::PreUpdate()
if ((*i).second->drawGrid)
(*i).second->DrawGrid();
}

return UpdateStatus::UPDATE_CONTINUE;
}

Expand Down Expand Up @@ -205,3 +223,111 @@ void m1Render3D::LoadShaders()
programs[name] = shader;
}
}

void APIENTRY GLDebugMessageCallback(GLenum source, GLenum type, GLuint id,
GLenum severity, GLsizei length,
const GLchar* msg, const void* data)
{
const char* _source;
const char* _type;
const char* _severity;

switch (source) {
case GL_DEBUG_SOURCE_API:
_source = "API";
break;

case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
_source = "WINDOW SYSTEM";
break;

case GL_DEBUG_SOURCE_SHADER_COMPILER:
_source = "SHADER COMPILER";
break;

case GL_DEBUG_SOURCE_THIRD_PARTY:
_source = "THIRD PARTY";
break;

case GL_DEBUG_SOURCE_APPLICATION:
_source = "APPLICATION";
break;

case GL_DEBUG_SOURCE_OTHER:
_source = "UNKNOWN";
break;

default:
_source = "UNKNOWN";
break;
}

switch (type) {
case GL_DEBUG_TYPE_ERROR:
_type = "ERROR";
break;

case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR:
_type = "DEPRECATED BEHAVIOR";
break;

case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR:
_type = "UDEFINED BEHAVIOR";
break;

case GL_DEBUG_TYPE_PORTABILITY:
_type = "PORTABILITY";
break;

case GL_DEBUG_TYPE_PERFORMANCE:
_type = "PERFORMANCE";
break;

case GL_DEBUG_TYPE_OTHER:
_type = "OTHER";
break;

case GL_DEBUG_TYPE_MARKER:
_type = "MARKER";
break;

default:
_type = "UNKNOWN";
break;
}

switch (severity) {
case GL_DEBUG_SEVERITY_HIGH:
_severity = "HIGH";
break;

case GL_DEBUG_SEVERITY_MEDIUM:
_severity = "MEDIUM";
break;

case GL_DEBUG_SEVERITY_LOW:
_severity = "LOW";
break;

case GL_DEBUG_SEVERITY_NOTIFICATION:
_severity = "NOTIFICATION";
break;

default:
_severity = "UNKNOWN";
break;
}

// ignore notification severity (you can add your own ignores)
// + Adds __debugbreak if _DEBUG is defined (automatic in visual studio)
// note: __debugbreak is specific for MSVC, won't work with gcc/clang
// -> in that case remove it and manually set breakpoints
if (_severity != "NOTIFICATION") {
LOGNE("OpenGL error [%d]: %s of %s severity, raised from %s: %s",
id, _type, _severity, _source, msg);
#ifdef _DEBUG
std::string s = "OpenGL error [" + std::to_string(id) + "]: " + _type + " of " + _severity + " severity, raised from " + _source + ": " + msg + "\n";
OutputDebugString(s.c_str()); //Log in IDE Output window
#endif
}
}
4 changes: 3 additions & 1 deletion Elit3d/src/Modules/m1Render3D.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ class m1Render3D :
private:
void LoadShaders();

public:
int smaa = 4;

private:
SDL_GLContext context = nullptr;

Expand All @@ -44,4 +47,3 @@ class m1Render3D :
std::map<std::string, unsigned int> shaders;
std::map<std::string, r1Shader*> programs;
};

7 changes: 4 additions & 3 deletions Elit3d/src/Resources/r1Texture.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,9 @@ void r1Texture::Load()
ilBindImage(image_id);

ilutRenderer(ILUT_OPENGL);

if (ilLoad(IL_PNG, path.c_str())) { // TODO: load for different types

//if (ilLoad(IL_PNG, path.c_str())) { // TODO: load for different types
if (iluLoadImage(path.c_str())) { // TODO: load for different types
width = ilGetInteger(IL_IMAGE_WIDTH);
height = ilGetInteger(IL_IMAGE_HEIGHT);

Expand Down Expand Up @@ -145,7 +146,7 @@ void r1Texture::Edit(int row, int col, int r, int g, int b)
{
Bind();
unsigned char bits[3] = { r, g, b };
glTexSubImage2D(GL_TEXTURE_2D, 0, col, row, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, bits);
glTexSubImage2D(GL_TEXTURE_2D, 0, col, row, 1, 1, GL_RGB8, GL_UNSIGNED_BYTE, bits);
ilEnable(IL_FILE_OVERWRITE);
if (!ilutGLSaveImage((char*)"./Assets/Maps/testtilemap.png", id)) {
LOGE("Failed to load texture %s, error: %s", name.c_str(), ilGetString(ilGetError()));
Expand Down
26 changes: 24 additions & 2 deletions Elit3d/src/Tools/OpenGL/OpenGLHelper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ void oglh::_HandleError(const char* func)
default:
break;
}
LOGNW("OpenGL error %i (%s) on %s", err, error_type.c_str(), func);
LOGNE("OpenGL error %i (%s) on %s", err, error_type.c_str(), func);
err = glGetError();
}
}
Expand Down Expand Up @@ -214,7 +214,10 @@ void oglh::GenTextureData(unsigned int& id, Wrap wrap, Filter filter, unsigned i
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, FilterEnumToGLEnum(filter));
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, FilterEnumToGLEnum(filter));

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size_x, size_y, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB8, size_x, size_y, 0, GL_RGB, GL_UNSIGNED_BYTE, data);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

Expand Down Expand Up @@ -244,6 +247,25 @@ void oglh::PolygonMode(bool line)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
}

void oglh::CheckFramebufferStatus()
{
GLenum framebufferStatus = glCheckFramebufferStatus(GL_FRAMEBUFFER);
if (framebufferStatus != GL_FRAMEBUFFER_COMPLETE) {
switch (framebufferStatus)
{
case GL_FRAMEBUFFER_UNDEFINED: LOGE("GL_FRAMEBUFFER_UNDEFINED"); break;
case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT: LOGE("GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT"); break;
case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT: LOGE("GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT"); break;
case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER: LOGE("GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER"); break;
case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER: LOGE("GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER"); break;
case GL_FRAMEBUFFER_UNSUPPORTED: LOGE("GL_FRAMEBUFFER_UNSUPPORTED"); break;
case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE: LOGE("GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE"); break;
case GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS: LOGE("GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS"); break;
default: LOGE("Unknown franebuffer status error | %i", framebufferStatus);
}
}
}

void oglh::EnableCullFace(bool active)
{
(active) ? glEnable(GL_CULL_FACE) : glDisable(GL_CULL_FACE);
Expand Down
2 changes: 2 additions & 0 deletions Elit3d/src/Tools/OpenGL/OpenGLHelper.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ class oglh
*/
static void PolygonMode(bool line);

static void CheckFramebufferStatus();

static void EnableCullFace(bool active);

static void DepthEnable(bool active);
Expand Down
14 changes: 6 additions & 8 deletions Elit3d/src/Tools/OpenGL/Viewport.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,15 @@ Viewport::Viewport()
// generate texture
glGenTextures(1, &ID[TEXTURE_MS]);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS]);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, smaa, GL_RGB, 1, 1, GL_TRUE);
//glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D_MULTISAMPLE, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, App->render->smaa, GL_RGBA, 1, 1, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

// attach it to currently bound framebuffer object
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS], 0);

glGenRenderbuffers(1, &ID[RBO_MS]);
glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO_MS]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, smaa, GL_DEPTH24_STENCIL8, 1, 1);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, App->render->smaa, GL_DEPTH24_STENCIL8, 1, 1);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO_MS]);
Expand All @@ -41,7 +39,7 @@ Viewport::Viewport()
// generate texture
glGenTextures(1, &ID[TEXTURE]);
glBindTexture(GL_TEXTURE_2D, ID[TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 1, 1, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
Expand Down Expand Up @@ -77,14 +75,14 @@ void Viewport::Update()
glBindFramebuffer(GL_FRAMEBUFFER, ID[FBO_MS]);

glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS]);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, smaa, GL_RGB, size.x, size.y, GL_TRUE);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, App->render->smaa, GL_RGBA8, size.x, size.y, GL_TRUE);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0);

// attach it to currently bound framebuffer object
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D_MULTISAMPLE, ID[TEXTURE_MS], 0);

glBindRenderbuffer(GL_RENDERBUFFER, ID[RBO_MS]);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, smaa, GL_DEPTH24_STENCIL8, size.x, size.y);
glRenderbufferStorageMultisample(GL_RENDERBUFFER, App->render->smaa, GL_DEPTH24_STENCIL8, size.x, size.y);
glBindRenderbuffer(GL_RENDERBUFFER, 0);

glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_RENDERBUFFER, ID[RBO_MS]);
Expand All @@ -95,7 +93,7 @@ void Viewport::Update()

// generate texture
glBindTexture(GL_TEXTURE_2D, ID[TEXTURE]);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, size.x, size.y, 0, GL_RGB, GL_UNSIGNED_BYTE, 0);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, size.x, size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindTexture(GL_TEXTURE_2D, 0);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ID[TEXTURE], 0);
Expand Down
1 change: 0 additions & 1 deletion Elit3d/src/Tools/OpenGL/Viewport.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ class Viewport
Camera* camera = nullptr;

private:
int smaa = 32;
int2 size;

enum FBOIDS
Expand Down
2 changes: 1 addition & 1 deletion example/Example/App.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ class App

private:
SDL_Window* window = nullptr;
SDL_GLContext context = nullptr;
void* context = nullptr;
};

3 changes: 2 additions & 1 deletion premake5.lua
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ project "Elit3d"
excludes {
"%{wks.location}/Elit3d/src/ExternalTools/ImGui/misc/**.cpp",
"%{wks.location}/Elit3d/src/ExternalTools/ImGui/misc/**.h",
"%{wks.location}/Elit3d/src/ExternalTools/DevIL/include/IL/luadevil.c"
"%{wks.location}/Elit3d/src/ExternalTools/DevIL/include/IL/luadevil.c",
"**/example/**"
}

filter "configurations:Debug"
Expand Down
Loading