GL: fix and clean up some code

This commit is contained in:
sfan5 2024-11-28 10:39:07 +01:00
parent 36edc3f161
commit 1fb7202028
17 changed files with 54 additions and 177 deletions

@ -109,11 +109,6 @@ protected:
//! Driver type of render target. //! Driver type of render target.
E_DRIVER_TYPE DriverType; E_DRIVER_TYPE DriverType;
private:
// no copying (IReferenceCounted still allows that for reasons which take some time to work around)
IRenderTarget(const IRenderTarget &);
IRenderTarget &operator=(const IRenderTarget &);
}; };
} }

@ -55,9 +55,6 @@ enum E_SCENE_NODE_RENDER_PASS
//! Camera pass. The active view is set up here. The very first pass. //! Camera pass. The active view is set up here. The very first pass.
ESNRP_CAMERA = 1, ESNRP_CAMERA = 1,
//! In this pass, lights are transformed into camera space and added to the driver
ESNRP_LIGHT = 2,
//! This is used for sky boxes. //! This is used for sky boxes.
ESNRP_SKY_BOX = 4, ESNRP_SKY_BOX = 4,
@ -85,9 +82,6 @@ enum E_SCENE_NODE_RENDER_PASS
//! Transparent effect scene nodes, drawn after Transparent nodes. They are sorted from back to front and drawn in that order. //! Transparent effect scene nodes, drawn after Transparent nodes. They are sorted from back to front and drawn in that order.
ESNRP_TRANSPARENT_EFFECT = 32, ESNRP_TRANSPARENT_EFFECT = 32,
//! Drawn after the solid nodes, before the transparent nodes, the time for drawing shadow volumes
ESNRP_SHADOW = 64,
//! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves). //! Drawn after transparent effect nodes. For custom gui's. Unsorted (in order nodes registered themselves).
ESNRP_GUI = 128 ESNRP_GUI = 128
@ -602,12 +596,6 @@ public:
for details. */ for details. */
virtual ISkinnedMesh *createSkinnedMesh() = 0; virtual ISkinnedMesh *createSkinnedMesh() = 0;
//! Sets ambient color of the scene
virtual void setAmbientLight(const video::SColorf &ambientColor) = 0;
//! Get ambient color of the scene
virtual const video::SColorf &getAmbientLight() const = 0;
//! Get current render pass. //! Get current render pass.
virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const = 0; virtual E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const = 0;

@ -131,7 +131,6 @@ public:
/** The following names can be queried for the given types: /** The following names can be queried for the given types:
MaxTextures (int) The maximum number of simultaneous textures supported by the driver. This can be less than the supported number of textures of the driver. Use _IRR_MATERIAL_MAX_TEXTURES_ to adapt the number. MaxTextures (int) The maximum number of simultaneous textures supported by the driver. This can be less than the supported number of textures of the driver. Use _IRR_MATERIAL_MAX_TEXTURES_ to adapt the number.
MaxSupportedTextures (int) The maximum number of simultaneous textures supported by the fixed function pipeline of the (hw) driver. The actual supported number of textures supported by the engine can be lower. MaxSupportedTextures (int) The maximum number of simultaneous textures supported by the fixed function pipeline of the (hw) driver. The actual supported number of textures supported by the engine can be lower.
MaxLights (int) Number of hardware lights supported in the fixed function pipeline of the driver, typically 6-8. Use light manager or deferred shading for more.
MaxAnisotropy (int) Number of anisotropy levels supported for filtering. At least 1, max is typically at 16 or 32. MaxAnisotropy (int) Number of anisotropy levels supported for filtering. At least 1, max is typically at 16 or 32.
MaxAuxBuffers (int) Special render buffers, which are currently not really usable inside Irrlicht. Only supported by OpenGL MaxAuxBuffers (int) Special render buffers, which are currently not really usable inside Irrlicht. Only supported by OpenGL
MaxMultipleRenderTargets (int) Number of render targets which can be bound simultaneously. Rendering to MRTs is done via shaders. MaxMultipleRenderTargets (int) Number of render targets which can be bound simultaneously. Rendering to MRTs is done via shaders.
@ -1110,15 +1109,6 @@ public:
//! Get the graphics card vendor name. //! Get the graphics card vendor name.
virtual core::stringc getVendorInfo() = 0; virtual core::stringc getVendorInfo() = 0;
//! Only used by the engine internally.
/** The ambient color is set in the scene manager, see
scene::ISceneManager::setAmbientLight().
\param color New color of the ambient light. */
virtual void setAmbientLight(const SColorf &color) = 0;
//! Get the global ambient light currently used by the driver
virtual const SColorf &getAmbientLight() const = 0;
//! Only used by the engine internally. //! Only used by the engine internally.
/** Passes the global material flag AllowZWriteOnTransparent. /** Passes the global material flag AllowZWriteOnTransparent.
Use the SceneManager attribute to set this value from your app. Use the SceneManager attribute to set this value from your app.
@ -1128,19 +1118,6 @@ public:
//! Get the maximum texture size supported. //! Get the maximum texture size supported.
virtual core::dimension2du getMaxTextureSize() const = 0; virtual core::dimension2du getMaxTextureSize() const = 0;
//! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination
array, thereby converting the color format. The pixel size is
determined by the color formats.
\param sP Pointer to source
\param sF Color format of source
\param sN Number of pixels to convert, both array must be large enough
\param dP Pointer to destination
\param dF Color format of destination
*/
virtual void convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const = 0;
//! Check if the driver supports creating textures with the given color format //! Check if the driver supports creating textures with the given color format
/** \return True if the format is available, false if not. */ /** \return True if the format is available, false if not. */
virtual bool queryTextureFormat(ECOLOR_FORMAT format) const = 0; virtual bool queryTextureFormat(ECOLOR_FORMAT format) const = 0;

@ -743,19 +743,6 @@ SFrameStats CNullDriver::getFrameStats() const
return FrameStats; return FrameStats;
} }
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void CNullDriver::setAmbientLight(const SColorf &color)
{
AmbientLight = color;
}
const SColorf &CNullDriver::getAmbientLight() const
{
return AmbientLight;
}
//! \return Returns the name of the video driver. Example: In case of the DIRECT3D8 //! \return Returns the name of the video driver. Example: In case of the DIRECT3D8
//! driver, it would return "Direct3D8". //! driver, it would return "Direct3D8".
@ -1774,21 +1761,5 @@ bool CNullDriver::needsTransparentRenderPass(const irr::video::SMaterial &materi
return false; return false;
} }
//! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination
array, thereby converting the color format. The pixel size is
determined by the color formats.
\param sP Pointer to source
\param sF Color format of source
\param sN Number of pixels to convert, both array must be large enough
\param dP Pointer to destination
\param dF Color format of destination
*/
void CNullDriver::convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const
{
video::CColorConverter::convert_viaFormat(sP, sF, sN, dP, dF);
}
} // end namespace } // end namespace
} // end namespace } // end namespace

@ -201,14 +201,6 @@ public:
//! driver, it would return "Direct3D8.1". //! driver, it would return "Direct3D8.1".
const char *getName() const override; const char *getName() const override;
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void setAmbientLight(const SColorf &color) override;
//! Get the global ambient light currently used by the driver
const SColorf &getAmbientLight() const override;
//! Adds an external image loader to the engine. //! Adds an external image loader to the engine.
void addExternalImageLoader(IImageLoader *loader) override; void addExternalImageLoader(IImageLoader *loader) override;
@ -559,19 +551,6 @@ public:
//! Used by some SceneNodes to check if a material should be rendered in the transparent render pass //! Used by some SceneNodes to check if a material should be rendered in the transparent render pass
bool needsTransparentRenderPass(const irr::video::SMaterial &material) const override; bool needsTransparentRenderPass(const irr::video::SMaterial &material) const override;
//! Color conversion convenience function
/** Convert an image (as array of pixels) from source to destination
array, thereby converting the color format. The pixel size is
determined by the color formats.
\param sP Pointer to source
\param sF Color format of source
\param sN Number of pixels to convert, both array must be large enough
\param dP Pointer to destination
\param dF Color format of destination
*/
virtual void convertColor(const void *sP, ECOLOR_FORMAT sF, s32 sN,
void *dP, ECOLOR_FORMAT dF) const override;
protected: protected:
//! deletes all textures //! deletes all textures
void deleteAllTextures(); void deleteAllTextures();
@ -759,8 +738,6 @@ protected:
bool AllowZWriteOnTransparent; bool AllowZWriteOnTransparent;
bool FeatureEnabled[video::EVDF_COUNT]; bool FeatureEnabled[video::EVDF_COUNT];
SColorf AmbientLight;
}; };
} // end namespace video } // end namespace video

@ -170,6 +170,17 @@ public:
return; return;
} }
#ifndef IRR_COMPILE_GL_COMMON
// On GLES 3.0 we must use sized internal formats for textures in certain
// cases (e.g. with ETT_2D_MS). However ECF_A8R8G8B8 is mapped to GL_BGRA
// (an unsized format).
// Since we don't upload to RTT we can safely pick a different combo that works.
if (InternalFormat == GL_BGRA && Driver->Version.Major >= 3) {
InternalFormat = GL_RGBA8;
PixelFormat = GL_RGBA;
}
#endif
#ifdef _DEBUG #ifdef _DEBUG
char lbuf[100]; char lbuf[100];
snprintf_irr(lbuf, sizeof(lbuf), snprintf_irr(lbuf, sizeof(lbuf),

@ -122,7 +122,6 @@ bool COpenGLDriver::genericDriverInit()
os::Printer::log("GLSL not available.", ELL_INFORMATION); os::Printer::log("GLSL not available.", ELL_INFORMATION);
DriverAttributes->setAttribute("MaxTextures", (s32)Feature.MaxTextureUnits); DriverAttributes->setAttribute("MaxTextures", (s32)Feature.MaxTextureUnits);
DriverAttributes->setAttribute("MaxSupportedTextures", (s32)Feature.MaxTextureUnits); DriverAttributes->setAttribute("MaxSupportedTextures", (s32)Feature.MaxTextureUnits);
DriverAttributes->setAttribute("MaxLights", MaxLights);
DriverAttributes->setAttribute("MaxAnisotropy", MaxAnisotropy); DriverAttributes->setAttribute("MaxAnisotropy", MaxAnisotropy);
DriverAttributes->setAttribute("MaxAuxBuffers", MaxAuxBuffers); DriverAttributes->setAttribute("MaxAuxBuffers", MaxAuxBuffers);
DriverAttributes->setAttribute("MaxMultipleRenderTargets", (s32)Feature.MultipleRenderTarget); DriverAttributes->setAttribute("MaxMultipleRenderTargets", (s32)Feature.MultipleRenderTarget);
@ -139,13 +138,6 @@ bool COpenGLDriver::genericDriverInit()
for (i = 0; i < ETS_COUNT; ++i) for (i = 0; i < ETS_COUNT; ++i)
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix); setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
#ifdef GL_EXT_separate_specular_color
if (FeatureAvailable[IRR_EXT_separate_specular_color])
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);
#endif
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
// This is a fast replacement for NORMALIZE_NORMALS // This is a fast replacement for NORMALIZE_NORMALS
// if ((Version>101) || FeatureAvailable[IRR_EXT_rescale_normal]) // if ((Version>101) || FeatureAvailable[IRR_EXT_rescale_normal])
// glEnable(GL_RESCALE_NORMAL_EXT); // glEnable(GL_RESCALE_NORMAL_EXT);
@ -2420,16 +2412,6 @@ const char *COpenGLDriver::getName() const
return Name.c_str(); return Name.c_str();
} }
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void COpenGLDriver::setAmbientLight(const SColorf &color)
{
CNullDriver::setAmbientLight(color);
GLfloat data[4] = {color.r, color.g, color.b, color.a};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, data);
}
// this code was sent in by Oliver Klems, thank you! (I modified the glViewport // this code was sent in by Oliver Klems, thank you! (I modified the glViewport
// method just a bit. // method just a bit.
void COpenGLDriver::setViewPort(const core::rect<s32> &area) void COpenGLDriver::setViewPort(const core::rect<s32> &area)

@ -182,11 +182,6 @@ public:
//! driver, it would return "Direct3D8.1". //! driver, it would return "Direct3D8.1".
const char *getName() const override; const char *getName() const override;
//! Sets the dynamic ambient light color. The default color is
//! (0,0,0,0) which means it is dark.
//! \param color: New color of the ambient light.
void setAmbientLight(const SColorf &color) override;
//! sets a viewport //! sets a viewport
void setViewPort(const core::rect<s32> &area) override; void setViewPort(const core::rect<s32> &area) override;

@ -19,7 +19,7 @@ namespace video
bool COpenGLExtensionHandler::needsDSAFramebufferHack = true; bool COpenGLExtensionHandler::needsDSAFramebufferHack = true;
COpenGLExtensionHandler::COpenGLExtensionHandler() : COpenGLExtensionHandler::COpenGLExtensionHandler() :
StencilBuffer(false), TextureCompressionExtension(false), MaxLights(1), StencilBuffer(false), TextureCompressionExtension(false),
MaxAnisotropy(1), MaxAuxBuffers(0), MaxIndices(65535), MaxAnisotropy(1), MaxAuxBuffers(0), MaxIndices(65535),
MaxTextureSize(1), MaxGeometryVerticesOut(0), MaxTextureSize(1), MaxGeometryVerticesOut(0),
MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0), MaxTextureLODBias(0.f), Version(0), ShaderLanguageVersion(0),
@ -399,8 +399,6 @@ void COpenGLExtensionHandler::initExtensions(video::IContextManager *cmgr, bool
Feature.MaxTextureUnits = core::max_(Feature.MaxTextureUnits, static_cast<u8>(num)); Feature.MaxTextureUnits = core::max_(Feature.MaxTextureUnits, static_cast<u8>(num));
} }
#endif #endif
glGetIntegerv(GL_MAX_LIGHTS, &num);
MaxLights = static_cast<u8>(num);
#ifdef GL_EXT_texture_filter_anisotropic #ifdef GL_EXT_texture_filter_anisotropic
if (FeatureAvailable[IRR_EXT_texture_filter_anisotropic]) { if (FeatureAvailable[IRR_EXT_texture_filter_anisotropic]) {
glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &num); glGetIntegerv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &num);

@ -1015,8 +1015,6 @@ public:
bool TextureCompressionExtension; bool TextureCompressionExtension;
// Some non-boolean properties // Some non-boolean properties
//! Maximum hardware lights supported
u8 MaxLights;
//! Maximal Anisotropy //! Maximal Anisotropy
u8 MaxAnisotropy; u8 MaxAnisotropy;
//! Number of auxiliary buffers //! Number of auxiliary buffers

@ -41,7 +41,7 @@ CSceneManager::CSceneManager(video::IVideoDriver *driver,
ISceneNode(0, 0), ISceneNode(0, 0),
Driver(driver), Driver(driver),
CursorControl(cursorControl), CursorControl(cursorControl),
ActiveCamera(0), ShadowColor(150, 0, 0, 0), AmbientLight(0, 0, 0, 0), Parameters(0), ActiveCamera(0), Parameters(0),
MeshCache(cache), CurrentRenderPass(ESNRP_NONE) MeshCache(cache), CurrentRenderPass(ESNRP_NONE)
{ {
#ifdef _DEBUG #ifdef _DEBUG
@ -445,9 +445,6 @@ u32 CSceneManager::registerNodeForRendering(ISceneNode *node, E_SCENE_NODE_RENDE
taken = 1; taken = 1;
} }
// as of yet unused
case ESNRP_LIGHT:
case ESNRP_SHADOW:
case ESNRP_NONE: // ignore this one case ESNRP_NONE: // ignore this one
break; break;
} }
@ -775,18 +772,6 @@ ISceneManager *CSceneManager::createNewSceneManager(bool cloneContent)
return manager; return manager;
} }
//! Sets ambient color of the scene
void CSceneManager::setAmbientLight(const video::SColorf &ambientColor)
{
AmbientLight = ambientColor;
}
//! Returns ambient color of the scene
const video::SColorf &CSceneManager::getAmbientLight() const
{
return AmbientLight;
}
//! Get a skinned mesh, which is not available as header-only code //! Get a skinned mesh, which is not available as header-only code
ISkinnedMesh *CSceneManager::createSkinnedMesh() ISkinnedMesh *CSceneManager::createSkinnedMesh()
{ {

@ -170,12 +170,6 @@ public:
//! Get a skinned mesh, which is not available as header-only code //! Get a skinned mesh, which is not available as header-only code
ISkinnedMesh *createSkinnedMesh() override; ISkinnedMesh *createSkinnedMesh() override;
//! Sets ambient color of the scene
void setAmbientLight(const video::SColorf &ambientColor) override;
//! Returns ambient color of the scene
const video::SColorf &getAmbientLight() const override;
//! Get current render time. //! Get current render time.
E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const override { return CurrentRenderPass; } E_SCENE_NODE_RENDER_PASS getCurrentRenderPass() const override { return CurrentRenderPass; }
@ -291,9 +285,6 @@ private:
ICameraSceneNode *ActiveCamera; ICameraSceneNode *ActiveCamera;
core::vector3df camWorldPos; // Position of camera for transparent nodes. core::vector3df camWorldPos; // Position of camera for transparent nodes.
video::SColor ShadowColor;
video::SColorf AmbientLight;
//! String parameters //! String parameters
// NOTE: Attributes are slow and should only be used for debug-info and not in release // NOTE: Attributes are slow and should only be used for debug-info and not in release
io::CAttributes *Parameters; io::CAttributes *Parameters;

@ -40,7 +40,7 @@ typedef COpenGLCoreTexture<COpenGL3DriverBase> COpenGL3Texture;
typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget; typedef COpenGLCoreRenderTarget<COpenGL3DriverBase, COpenGL3Texture> COpenGL3RenderTarget;
typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler; typedef COpenGLCoreCacheHandler<COpenGL3DriverBase, COpenGL3Texture> COpenGL3CacheHandler;
enum class OpenGLSpec : u8 enum OpenGLSpec : u8
{ {
Core, Core,
Compat, Compat,

@ -27,37 +27,32 @@ namespace irr
{ {
namespace video namespace video
{ {
struct VertexAttribute struct VertexAttribute
{ {
enum class Mode enum Mode : u8
{ {
Regular, Regular,
Normalized, Normalized,
Integral, Integer,
}; };
int Index; u8 Index;
int ComponentCount; u8 ComponentCount;
GLenum ComponentType; GLenum ComponentType;
Mode mode; Mode mode;
int Offset; u32 Offset;
}; };
struct VertexType struct VertexType
{ {
int VertexSize; u32 VertexSize;
std::vector<VertexAttribute> Attributes; std::vector<VertexAttribute> Attributes;
// allow ranged for loops
inline auto begin() const { return Attributes.begin(); }
inline auto end() const { return Attributes.end(); }
}; };
static const VertexAttribute *begin(const VertexType &type)
{
return type.Attributes.data();
}
static const VertexAttribute *end(const VertexType &type)
{
return type.Attributes.data() + type.Attributes.size();
}
static const VertexType vtStandard = { static const VertexType vtStandard = {
sizeof(S3DVertex), sizeof(S3DVertex),
{ {
@ -68,6 +63,9 @@ static const VertexType vtStandard = {
}, },
}; };
// FIXME: this is actually UB because these vertex classes are not "standard-layout"
// they violate the following requirement:
// - only one class in the hierarchy has non-static data members
#pragma GCC diagnostic push #pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Winvalid-offsetof" #pragma GCC diagnostic ignored "-Winvalid-offsetof"
@ -170,11 +168,15 @@ COpenGL3DriverBase::COpenGL3DriverBase(const SIrrlichtCreationParameters &params
ExposedData = ContextManager->getContext(); ExposedData = ContextManager->getContext();
ContextManager->activateContext(ExposedData, false); ContextManager->activateContext(ExposedData, false);
GL.LoadAllProcedures(ContextManager); GL.LoadAllProcedures(ContextManager);
if (EnableErrorTest) { if (EnableErrorTest && GL.IsExtensionPresent("GL_KHR_debug")) {
GL.Enable(GL_DEBUG_OUTPUT); GL.Enable(GL_DEBUG_OUTPUT);
GL.DebugMessageCallback(debugCb, this); GL.DebugMessageCallback(debugCb, this);
} else if (EnableErrorTest) {
os::Printer::log("GL debug extension not available");
} }
initQuadsIndices(); initQuadsIndices();
TEST_GL_ERROR(this);
} }
COpenGL3DriverBase::~COpenGL3DriverBase() COpenGL3DriverBase::~COpenGL3DriverBase()
@ -267,7 +269,6 @@ bool COpenGL3DriverBase::genericDriverInit(const core::dimension2d<u32> &screenS
for (s32 i = 0; i < ETS_COUNT; ++i) for (s32 i = 0; i < ETS_COUNT; ++i)
setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix); setTransform(static_cast<E_TRANSFORMATION_STATE>(i), core::IdentityMatrix);
setAmbientLight(SColorf(0.0f, 0.0f, 0.0f, 0.0f));
GL.ClearDepthf(1.0f); GL.ClearDepthf(1.0f);
GL.Hint(GL_GENERATE_MIPMAP_HINT, GL_NICEST); GL.Hint(GL_GENERATE_MIPMAP_HINT, GL_NICEST);
@ -760,6 +761,13 @@ void COpenGL3DriverBase::drawVertexPrimitiveList(const void *vertices, u32 verte
endDraw(vTypeDesc); endDraw(vTypeDesc);
} }
void COpenGL3DriverBase::draw2DVertexPrimitiveList(const void *vertices, u32 vertexCount,
const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType)
{
os::Printer::log("draw2DVertexPrimitiveList unimplemented", ELL_ERROR);
}
void COpenGL3DriverBase::draw2DImage(const video::ITexture *texture, const core::position2d<s32> &destPos, void COpenGL3DriverBase::draw2DImage(const video::ITexture *texture, const core::position2d<s32> &destPos,
const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect, SColor color, const core::rect<s32> &sourceRect, const core::rect<s32> *clipRect, SColor color,
bool useAlphaChannelOfTexture) bool useAlphaChannelOfTexture)
@ -1066,7 +1074,7 @@ void COpenGL3DriverBase::drawElements(GLenum primitiveType, const VertexType &ve
void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verticesBase) void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verticesBase)
{ {
for (auto attr : vertexType) { for (auto &attr : vertexType) {
GL.EnableVertexAttribArray(attr.Index); GL.EnableVertexAttribArray(attr.Index);
switch (attr.mode) { switch (attr.mode) {
case VertexAttribute::Mode::Regular: case VertexAttribute::Mode::Regular:
@ -1075,7 +1083,7 @@ void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verti
case VertexAttribute::Mode::Normalized: case VertexAttribute::Mode::Normalized:
GL.VertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_TRUE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); GL.VertexAttribPointer(attr.Index, attr.ComponentCount, attr.ComponentType, GL_TRUE, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset));
break; break;
case VertexAttribute::Mode::Integral: case VertexAttribute::Mode::Integer:
GL.VertexAttribIPointer(attr.Index, attr.ComponentCount, attr.ComponentType, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset)); GL.VertexAttribIPointer(attr.Index, attr.ComponentCount, attr.ComponentType, vertexType.VertexSize, reinterpret_cast<void *>(verticesBase + attr.Offset));
break; break;
} }
@ -1084,7 +1092,7 @@ void COpenGL3DriverBase::beginDraw(const VertexType &vertexType, uintptr_t verti
void COpenGL3DriverBase::endDraw(const VertexType &vertexType) void COpenGL3DriverBase::endDraw(const VertexType &vertexType)
{ {
for (auto attr : vertexType) for (auto &attr : vertexType)
GL.DisableVertexAttribArray(attr.Index); GL.DisableVertexAttribArray(attr.Index);
} }

@ -81,6 +81,11 @@ public:
const void *indexList, u32 primitiveCount, const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override; E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override;
//! draws a vertex primitive list in 2d
virtual void draw2DVertexPrimitiveList(const void *vertices, u32 vertexCount,
const void *indexList, u32 primitiveCount,
E_VERTEX_TYPE vType, scene::E_PRIMITIVE_TYPE pType, E_INDEX_TYPE iType) override;
//! queries the features of the driver, returns true if feature is available //! queries the features of the driver, returns true if feature is available
bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const override bool queryFeature(E_VIDEO_DRIVER_FEATURE feature) const override
{ {

@ -43,8 +43,6 @@ void COpenGLES2Driver::initFeatures()
} }
initExtensions(); initExtensions();
static const GLenum BGRA8_EXT = 0x93A1;
if (Version.Major >= 3) { if (Version.Major >= 3) {
// NOTE floating-point formats may not be suitable for render targets. // NOTE floating-point formats may not be suitable for render targets.
TextureFormats[ECF_A1R5G5B5] = {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, CColorConverter::convert_A1R5G5B5toR5G5B5A1}; TextureFormats[ECF_A1R5G5B5] = {GL_RGB5_A1, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1, CColorConverter::convert_A1R5G5B5toR5G5B5A1};
@ -64,10 +62,11 @@ void COpenGLES2Driver::initFeatures()
TextureFormats[ECF_D24] = {GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT}; TextureFormats[ECF_D24] = {GL_DEPTH_COMPONENT24, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT};
TextureFormats[ECF_D24S8] = {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8}; TextureFormats[ECF_D24S8] = {GL_DEPTH24_STENCIL8, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8};
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888]) // NOTE a recent (2024) revision of EXT_texture_format_BGRA8888 also
// adds a sized format GL_BGRA8_EXT. We have a workaround in place to
// fix up the InternalFormat in case of render targets.
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888] || FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE}; TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE};
else if (FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {BGRA8_EXT, GL_BGRA, GL_UNSIGNED_BYTE};
// OpenGL ES 3 doesn't include a GL_DEPTH_COMPONENT32, so still use // OpenGL ES 3 doesn't include a GL_DEPTH_COMPONENT32, so still use
// OES_depth_texture for 32-bit depth texture support. // OES_depth_texture for 32-bit depth texture support.
@ -87,10 +86,8 @@ void COpenGLES2Driver::initFeatures()
TextureFormats[ECF_R8G8B8] = {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE}; TextureFormats[ECF_R8G8B8] = {GL_RGB, GL_RGB, GL_UNSIGNED_BYTE};
TextureFormats[ECF_A8R8G8B8] = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, CColorConverter::convert_A8R8G8B8toA8B8G8R8}; TextureFormats[ECF_A8R8G8B8] = {GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, CColorConverter::convert_A8R8G8B8toA8B8G8R8};
if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888]) if (FeatureAvailable[IRR_GL_EXT_texture_format_BGRA8888] || FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE}; TextureFormats[ECF_A8R8G8B8] = {GL_BGRA, GL_BGRA, GL_UNSIGNED_BYTE};
else if (FeatureAvailable[IRR_GL_APPLE_texture_format_BGRA8888])
TextureFormats[ECF_A8R8G8B8] = {BGRA8_EXT, GL_BGRA, GL_UNSIGNED_BYTE};
if (FeatureAvailable[IRR_GL_OES_texture_half_float]) { if (FeatureAvailable[IRR_GL_OES_texture_half_float]) {
TextureFormats[ECF_A16B16G16R16F] = {GL_RGBA, GL_RGBA, HALF_FLOAT_OES}; TextureFormats[ECF_A16B16G16R16F] = {GL_RGBA, GL_RGBA, HALF_FLOAT_OES};

@ -21,8 +21,7 @@ void SetColorMaskStep::run(PipelineContext &context)
mat.Material.ColorMask = color_mask; mat.Material.ColorMask = color_mask;
mat.EnableProps = video::EMP_COLOR_MASK; mat.EnableProps = video::EMP_COLOR_MASK;
mat.EnablePasses = scene::ESNRP_SKY_BOX | scene::ESNRP_SOLID | mat.EnablePasses = scene::ESNRP_SKY_BOX | scene::ESNRP_SOLID |
scene::ESNRP_TRANSPARENT | scene::ESNRP_TRANSPARENT_EFFECT | scene::ESNRP_TRANSPARENT | scene::ESNRP_TRANSPARENT_EFFECT;
scene::ESNRP_SHADOW;
} }
/// ClearDepthBufferTarget /// ClearDepthBufferTarget