Program Listing for File OpenGLUtils.cpp

Return to documentation for file (src/Graphics/RHI/OpenGL/OpenGLUtils.cpp)

#pragma once

#include <glad/gl.h>

#include "Ramus/Graphics/GraphicsDefines.hpp"
#include "Ramus/Graphics/RHI/OpenGL/Buffers/OpenGLBuffer.hpp"

namespace ramus::gl
{
    inline GLint toBitfield(int32_t value) { return static_cast<GLbitfield>(value); }
    inline GLint toInt(int32_t value) { return static_cast<GLint>(value); }
    inline GLint toPtr(int32_t value) { return static_cast<GLintptr>(value); }
    inline GLint toSize(int32_t value) { return static_cast<GLsizei>(value); }
    inline GLint toUint(int32_t value) { return static_cast<GLuint>(value); }

    //template <typename T>
    //inline GLuint getHandle(const Buffer& buffer) { return toUint(buffer.GetHandle()); }

    //template <typename T>
    //inline GLuint getHandle(const GraphicsResource<T>& resource) { return toUint(resource.GetHandle()); }

    static GLenum ShaderDataTypeToOpenGL(ramus::ShaderDataType type)
    {
        switch (type)
        {
            case ramus::ShaderDataType::Float:    return GL_FLOAT;
            case ramus::ShaderDataType::Float2:   return GL_FLOAT;
            case ramus::ShaderDataType::Float3:   return GL_FLOAT;
            case ramus::ShaderDataType::Float4:   return GL_FLOAT;
            case ramus::ShaderDataType::Mat3:     return GL_FLOAT;
            case ramus::ShaderDataType::Mat4:     return GL_FLOAT;
            case ramus::ShaderDataType::Int:      return GL_INT;
            case ramus::ShaderDataType::Int2:     return GL_INT;
            case ramus::ShaderDataType::Int3:     return GL_INT;
            case ramus::ShaderDataType::Int4:     return GL_INT;
            case ramus::ShaderDataType::Bool:     return GL_BOOL;
            default: break;
        }

        return 0;
    }

    static GLbitfield BufferFlagsToOpenGL(BufferFlags flags)
    {
        GLbitfield glFlags = 0;
        if ((uint32_t)flags & (uint32_t)BufferFlags::MapRead)  glFlags |= GL_MAP_READ_BIT;
        if ((uint32_t)flags & (uint32_t)BufferFlags::MapWrite) glFlags |= GL_MAP_WRITE_BIT;
        if ((uint32_t)flags & (uint32_t)BufferFlags::Dynamic)  glFlags |= GL_DYNAMIC_STORAGE_BIT;
        if ((uint32_t)flags & (uint32_t)BufferFlags::Client)   glFlags |= GL_CLIENT_STORAGE_BIT;
        return glFlags;
    }

    static GLenum BufferUsageToOpenGL(BufferUsage usage)
    {
        switch (usage)
        {
            case BufferUsage::Static:  return GL_STATIC_DRAW;
            case BufferUsage::Dynamic: return GL_DYNAMIC_DRAW;
            case BufferUsage::Stream:  return GL_STREAM_DRAW;
        }
        return GL_STATIC_DRAW;
    }
}