2022-06-02 19:43:46 +02:00
|
|
|
#pragma once
|
|
|
|
|
|
2022-10-16 14:35:22 +02:00
|
|
|
#include "capabilities.h"
|
2022-06-02 19:43:46 +02:00
|
|
|
|
2022-06-03 22:31:05 +02:00
|
|
|
#define GL_FRAGMENT_TEXTURES_START 0
|
|
|
|
|
#define GL_VERTEX_TEXTURES_START (GL_FRAGMENT_TEXTURES_START + 16)
|
|
|
|
|
#define GL_STENCIL_MIRRORS_START (GL_VERTEX_TEXTURES_START + 4)
|
|
|
|
|
#define GL_STREAM_BUFFER_START (GL_STENCIL_MIRRORS_START + 16)
|
|
|
|
|
#define GL_TEMP_IMAGE_SLOT 31
|
|
|
|
|
|
2022-09-18 00:54:07 +02:00
|
|
|
#define UBO_SLOT(x) (x + 8)
|
2022-08-03 18:01:58 +02:00
|
|
|
#define SSBO_SLOT(x) (x)
|
2022-06-03 22:31:05 +02:00
|
|
|
|
|
|
|
|
#define GL_VERTEX_PARAMS_BIND_SLOT UBO_SLOT(0)
|
|
|
|
|
#define GL_VERTEX_LAYOUT_BIND_SLOT UBO_SLOT(1)
|
|
|
|
|
#define GL_VERTEX_CONSTANT_BUFFERS_BIND_SLOT UBO_SLOT(2)
|
|
|
|
|
#define GL_FRAGMENT_CONSTANT_BUFFERS_BIND_SLOT UBO_SLOT(3)
|
|
|
|
|
#define GL_FRAGMENT_STATE_BIND_SLOT UBO_SLOT(4)
|
|
|
|
|
#define GL_FRAGMENT_TEXTURE_PARAMS_BIND_SLOT UBO_SLOT(5)
|
|
|
|
|
#define GL_RASTERIZER_STATE_BIND_SLOT UBO_SLOT(6)
|
|
|
|
|
#define GL_INTERPRETER_VERTEX_BLOCK SSBO_SLOT(0)
|
|
|
|
|
#define GL_INTERPRETER_FRAGMENT_BLOCK SSBO_SLOT(1)
|
|
|
|
|
#define GL_COMPUTE_BUFFER_SLOT(index) SSBO_SLOT(2 + index)
|
2022-09-18 23:31:56 +02:00
|
|
|
#define GL_COMPUTE_IMAGE_SLOT(index) SSBO_SLOT(index)
|
2022-06-03 22:31:05 +02:00
|
|
|
|
2022-06-02 19:43:46 +02:00
|
|
|
//Function call wrapped in ARB_DSA vs EXT_DSA compat check
|
|
|
|
|
#define DSA_CALL(func, object_name, target, ...)\
|
|
|
|
|
if (::gl::get_driver_caps().ARB_dsa_supported)\
|
|
|
|
|
gl##func(object_name, __VA_ARGS__);\
|
|
|
|
|
else\
|
|
|
|
|
gl##func##EXT(object_name, target, __VA_ARGS__);
|
|
|
|
|
|
|
|
|
|
#define DSA_CALL2(func, ...)\
|
|
|
|
|
if (::gl::get_driver_caps().ARB_dsa_supported)\
|
|
|
|
|
gl##func(__VA_ARGS__);\
|
|
|
|
|
else\
|
|
|
|
|
gl##func##EXT(__VA_ARGS__);
|
|
|
|
|
|
|
|
|
|
#define DSA_CALL2_RET(func, ...)\
|
|
|
|
|
(::gl::get_driver_caps().ARB_dsa_supported) ?\
|
|
|
|
|
gl##func(__VA_ARGS__) :\
|
|
|
|
|
gl##func##EXT(__VA_ARGS__)
|
|
|
|
|
|
|
|
|
|
#define DSA_CALL3(funcARB, funcDSA, ...)\
|
|
|
|
|
if (::gl::get_driver_caps().ARB_dsa_supported)\
|
|
|
|
|
gl##funcARB(__VA_ARGS__);\
|
|
|
|
|
else\
|
|
|
|
|
gl##funcDSA##EXT(__VA_ARGS__);
|
|
|
|
|
|
|
|
|
|
namespace gl
|
|
|
|
|
{
|
2022-06-05 17:21:59 +02:00
|
|
|
template<typename Type, uint BindId, uint GetStateId>
|
|
|
|
|
class save_binding_state_base
|
2022-06-02 19:43:46 +02:00
|
|
|
{
|
2022-06-05 17:21:59 +02:00
|
|
|
GLint m_last_binding;
|
2022-06-02 19:43:46 +02:00
|
|
|
|
|
|
|
|
public:
|
2022-06-05 17:21:59 +02:00
|
|
|
save_binding_state_base(const Type& new_state) : save_binding_state_base()
|
2022-06-02 19:43:46 +02:00
|
|
|
{
|
2022-06-05 17:21:59 +02:00
|
|
|
new_state.bind();
|
2022-06-02 19:43:46 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-05 17:21:59 +02:00
|
|
|
save_binding_state_base()
|
2022-06-02 19:43:46 +02:00
|
|
|
{
|
2022-06-05 17:21:59 +02:00
|
|
|
glGetIntegerv(GetStateId, &m_last_binding);
|
2022-06-02 19:43:46 +02:00
|
|
|
}
|
|
|
|
|
|
2022-06-05 17:21:59 +02:00
|
|
|
~save_binding_state_base()
|
2022-06-02 19:43:46 +02:00
|
|
|
{
|
2022-06-05 17:21:59 +02:00
|
|
|
glBindBuffer(BindId, m_last_binding);
|
2022-06-02 19:43:46 +02:00
|
|
|
}
|
|
|
|
|
};
|
2022-11-21 18:56:30 +01:00
|
|
|
|
|
|
|
|
// Very useful util when capturing traces with RenderDoc
|
|
|
|
|
static inline void push_debug_label(const char* label)
|
|
|
|
|
{
|
2022-12-10 16:55:22 +01:00
|
|
|
glInsertEventMarkerEXT(static_cast<GLsizei>(strlen(label)), label);
|
2022-11-21 18:56:30 +01:00
|
|
|
}
|
2022-06-02 19:43:46 +02:00
|
|
|
}
|