mirror of
https://github.com/RPCSX/rpcsx.git
synced 2025-12-06 07:12:14 +01:00
* use one central unified log with channels/priorities ad-hoc listener registration and de-registration * disable buffering by default * add multi-threaded ringbuffer implementation * use buffered listener for the gui (using the ringbuffer)
271 lines
4 KiB
C++
271 lines
4 KiB
C++
#include "stdafx.h"
|
|
#include "Utilities/Log.h"
|
|
#include "Emu/Memory/Memory.h"
|
|
#include "GLBuffers.h"
|
|
#include "GLGSRender.h"
|
|
|
|
GLBufferObject::GLBufferObject()
|
|
{
|
|
}
|
|
|
|
GLBufferObject::GLBufferObject(u32 type)
|
|
{
|
|
Create(type);
|
|
}
|
|
|
|
GLBufferObject::~GLBufferObject()
|
|
{
|
|
Delete();
|
|
}
|
|
|
|
void GLBufferObject::Create(GLuint type, u32 count)
|
|
{
|
|
if(IsCreated()) return;
|
|
|
|
m_id.resize(count);
|
|
glGenBuffers(count, &m_id[0]);
|
|
m_type = type;
|
|
}
|
|
|
|
void GLBufferObject::Delete()
|
|
{
|
|
if(!IsCreated()) return;
|
|
|
|
glDeleteBuffers(m_id.size(), &m_id[0]);
|
|
m_id.clear();
|
|
m_type = 0;
|
|
}
|
|
|
|
void GLBufferObject::Bind(u32 type, u32 num)
|
|
{
|
|
assert(num < m_id.size());
|
|
glBindBuffer(type, m_id[num]);
|
|
}
|
|
|
|
void GLBufferObject::UnBind(u32 type)
|
|
{
|
|
glBindBuffer(type, 0);
|
|
}
|
|
|
|
void GLBufferObject::Bind(u32 num)
|
|
{
|
|
Bind(m_type, num);
|
|
}
|
|
|
|
void GLBufferObject::UnBind()
|
|
{
|
|
UnBind(m_type);
|
|
}
|
|
|
|
void GLBufferObject::SetData(u32 type, const void* data, u32 size, u32 usage)
|
|
{
|
|
glBufferData(type, size, data, usage);
|
|
}
|
|
|
|
void GLBufferObject::SetData(const void* data, u32 size, u32 usage)
|
|
{
|
|
SetData(m_type, data, size, usage);
|
|
}
|
|
|
|
void GLBufferObject::SetAttribPointer(int location, int size, int type, int pointer, int stride, bool normalized)
|
|
{
|
|
if(location < 0) return;
|
|
|
|
glVertexAttribPointer(location, size, type, normalized ? GL_TRUE : GL_FALSE, stride, (const GLvoid*)pointer);
|
|
glEnableVertexAttribArray(location);
|
|
}
|
|
|
|
bool GLBufferObject::IsCreated() const
|
|
{
|
|
return m_id.size() != 0;
|
|
}
|
|
|
|
GLvbo::GLvbo()
|
|
{
|
|
}
|
|
|
|
void GLvbo::Create(u32 count)
|
|
{
|
|
GLBufferObject::Create(GL_ARRAY_BUFFER, count);
|
|
}
|
|
|
|
GLvao::GLvao() : m_id(0)
|
|
{
|
|
}
|
|
|
|
GLvao::~GLvao()
|
|
{
|
|
Delete();
|
|
}
|
|
|
|
void GLvao::Create()
|
|
{
|
|
if(!IsCreated()) glGenVertexArrays(1, &m_id);
|
|
}
|
|
|
|
void GLvao::Bind() const
|
|
{
|
|
glBindVertexArray(m_id);
|
|
}
|
|
|
|
void GLvao::Unbind()
|
|
{
|
|
glBindVertexArray(0);
|
|
}
|
|
|
|
void GLvao::Delete()
|
|
{
|
|
if(!IsCreated()) return;
|
|
|
|
Unbind();
|
|
glDeleteVertexArrays(1, &m_id);
|
|
m_id = 0;
|
|
}
|
|
|
|
bool GLvao::IsCreated() const
|
|
{
|
|
return m_id != 0;
|
|
}
|
|
|
|
GLrbo::GLrbo()
|
|
{
|
|
}
|
|
|
|
GLrbo::~GLrbo()
|
|
{
|
|
}
|
|
|
|
void GLrbo::Create(u32 count)
|
|
{
|
|
if(m_id.size() == count)
|
|
{
|
|
return;
|
|
}
|
|
|
|
Delete();
|
|
|
|
m_id.resize(count);
|
|
glGenRenderbuffers(count, m_id.data());
|
|
}
|
|
|
|
void GLrbo::Bind(u32 num) const
|
|
{
|
|
assert(num < m_id.size());
|
|
|
|
glBindRenderbuffer(GL_RENDERBUFFER, m_id[num]);
|
|
}
|
|
|
|
void GLrbo::Storage(u32 format, u32 width, u32 height)
|
|
{
|
|
glRenderbufferStorage(GL_RENDERBUFFER, format, width, height);
|
|
}
|
|
|
|
void GLrbo::Unbind()
|
|
{
|
|
glBindRenderbuffer(GL_RENDERBUFFER, 0);
|
|
}
|
|
|
|
void GLrbo::Delete()
|
|
{
|
|
if(!IsCreated())
|
|
{
|
|
return;
|
|
}
|
|
|
|
glDeleteRenderbuffers(m_id.size(), m_id.data());
|
|
m_id.clear();
|
|
}
|
|
|
|
bool GLrbo::IsCreated() const
|
|
{
|
|
return m_id.size();
|
|
}
|
|
|
|
u32 GLrbo::GetId(u32 num) const
|
|
{
|
|
assert(num < m_id.size());
|
|
return m_id[num];
|
|
}
|
|
|
|
GLfbo::GLfbo() : m_id(0)
|
|
{
|
|
}
|
|
|
|
GLfbo::~GLfbo()
|
|
{
|
|
}
|
|
|
|
void GLfbo::Create()
|
|
{
|
|
if(IsCreated())
|
|
{
|
|
return;
|
|
}
|
|
|
|
glGenFramebuffers(1, &m_id);
|
|
}
|
|
|
|
void GLfbo::Bind(u32 type, int id)
|
|
{
|
|
glBindFramebuffer(type, id);
|
|
}
|
|
|
|
void GLfbo::Bind(u32 type)
|
|
{
|
|
assert(IsCreated());
|
|
|
|
m_type = type;
|
|
Bind(type, m_id);
|
|
}
|
|
|
|
void GLfbo::Texture1D(u32 attachment, u32 texture, int level)
|
|
{
|
|
glFramebufferTexture1D(m_type, attachment, GL_TEXTURE_1D, texture, level);
|
|
}
|
|
|
|
void GLfbo::Texture2D(u32 attachment, u32 texture, int level)
|
|
{
|
|
glFramebufferTexture2D(m_type, attachment, GL_TEXTURE_2D, texture, level);
|
|
}
|
|
|
|
void GLfbo::Texture3D(u32 attachment, u32 texture, int zoffset, int level)
|
|
{
|
|
glFramebufferTexture3D(m_type, attachment, GL_TEXTURE_3D, texture, level, zoffset);
|
|
}
|
|
|
|
void GLfbo::Renderbuffer(u32 attachment, u32 renderbuffer)
|
|
{
|
|
glFramebufferRenderbuffer(m_type, attachment, GL_RENDERBUFFER, renderbuffer);
|
|
}
|
|
|
|
void GLfbo::Blit(int srcX0, int srcY0, int srcX1, int srcY1, int dstX0, int dstY0, int dstX1, int dstY1, u32 mask, u32 filter)
|
|
{
|
|
glBlitFramebuffer(srcX0, srcY0, srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter);
|
|
}
|
|
|
|
void GLfbo::Unbind()
|
|
{
|
|
Unbind(m_type);
|
|
}
|
|
|
|
void GLfbo::Unbind(u32 type)
|
|
{
|
|
glBindFramebuffer(type, 0);
|
|
}
|
|
|
|
void GLfbo::Delete()
|
|
{
|
|
if(!IsCreated())
|
|
{
|
|
return;
|
|
}
|
|
|
|
glDeleteFramebuffers(1, &m_id);
|
|
m_id = 0;
|
|
}
|
|
|
|
bool GLfbo::IsCreated() const
|
|
{
|
|
return m_id != 0;
|
|
}
|