Added DX11 renderer stub.
This commit is contained in:
parent
60d2993808
commit
98ebe1f076
@ -227,7 +227,7 @@ namespace bgfx
|
||||
charsetFillTexture(vga8x16, &rgba[8*pitch], 16, pitch, bpp);
|
||||
m_texture = s_ctx.createTexture(mem, BGFX_TEXTURE_MIN_POINT|BGFX_TEXTURE_MAG_POINT|BGFX_TEXTURE_MIP_POINT, NULL, NULL);
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
mem = bgfx::alloc(sizeof(vs_debugfont_hlsl)+1);
|
||||
memcpy(mem->data, vs_debugfont_hlsl, mem->size-1);
|
||||
#else
|
||||
@ -237,7 +237,7 @@ namespace bgfx
|
||||
mem->data[mem->size-1] = '\0';
|
||||
bgfx::VertexShaderHandle vsh = bgfx::createVertexShader(mem);
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
mem = bgfx::alloc(sizeof(fs_debugfont_hlsl)+1);
|
||||
memcpy(mem->data, fs_debugfont_hlsl, mem->size-1);
|
||||
#else
|
||||
@ -458,11 +458,11 @@ namespace bgfx
|
||||
|
||||
RendererType::Enum getRendererType()
|
||||
{
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
return RendererType::Direct3D9;
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGL
|
||||
return RendererType::OpenGL;
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
return RendererType::OpenGLES;
|
||||
#else
|
||||
return RendererType::Null;
|
||||
|
12
src/bgfx_p.h
12
src/bgfx_p.h
@ -132,6 +132,14 @@ namespace stl = std;
|
||||
#define BGFX_SAMPLER_RENDERTARGET_DEPTH UINT16_C(0x0002)
|
||||
#define BGFX_SAMPLER_TYPE_MASK UINT16_C(0x0003)
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
# define BGFX_RENDERER_NAME "Direct3D 9"
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGL
|
||||
# define BGFX_RENDERER_NAME "OpenGL"
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
# define BGFX_RENDERER_NAME "OpenGL ES 2"
|
||||
#endif // BGFX_CONFIG_RENDERER_
|
||||
|
||||
namespace bgfx
|
||||
{
|
||||
extern const uint32_t g_constantTypeSize[ConstantType::Count];
|
||||
@ -1088,7 +1096,7 @@ namespace bgfx
|
||||
|
||||
void setInstanceDataBuffer(const InstanceDataBuffer* _idb)
|
||||
{
|
||||
#if BGFX_CONFIG_RENDERER_OPENGLES
|
||||
#if BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
#else
|
||||
m_state.m_instanceDataOffset = _idb->offset;
|
||||
m_state.m_instanceDataStride = _idb->stride;
|
||||
@ -1878,7 +1886,7 @@ namespace bgfx
|
||||
|
||||
const InstanceDataBuffer* allocInstanceDataBuffer(uint16_t _num, uint16_t _stride)
|
||||
{
|
||||
#if BGFX_CONFIG_RENDERER_OPENGLES
|
||||
#if BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
return NULL;
|
||||
#else
|
||||
uint16_t stride = BX_ALIGN_16(_stride);
|
||||
|
18
src/config.h
18
src/config.h
@ -6,21 +6,25 @@
|
||||
#ifndef __CONFIG_H__
|
||||
#define __CONFIG_H__
|
||||
|
||||
#if !defined(BGFX_CONFIG_RENDERER_DIRECT3D) && !defined(BGFX_CONFIG_RENDERER_OPENGL) && !defined(BGFX_CONFIG_RENDERER_OPENGLES) && !defined(BGFX_CONFIG_RENDERER_NULL)
|
||||
# ifndef BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
# define BGFX_CONFIG_RENDERER_DIRECT3D (BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360)
|
||||
# endif // BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#if !defined(BGFX_CONFIG_RENDERER_DIRECT3D9) && !defined(BGFX_CONFIG_RENDERER_DIRECT3D11) && !defined(BGFX_CONFIG_RENDERER_OPENGL) && !defined(BGFX_CONFIG_RENDERER_OPENGLES2) && !defined(BGFX_CONFIG_RENDERER_NULL)
|
||||
# ifndef BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
# define BGFX_CONFIG_RENDERER_DIRECT3D9 (BX_PLATFORM_WINDOWS|BX_PLATFORM_XBOX360)
|
||||
# endif // BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
|
||||
# ifndef BGFX_CONFIG_RENDERER_DIRECT3D11
|
||||
# define BGFX_CONFIG_RENDERER_DIRECT3D11 0
|
||||
# endif // BGFX_CONFIG_RENDERER_DIRECT3D11
|
||||
|
||||
# ifndef BGFX_CONFIG_RENDERER_OPENGL
|
||||
# define BGFX_CONFIG_RENDERER_OPENGL (BX_PLATFORM_LINUX|BX_PLATFORM_OSX)
|
||||
# endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
# ifndef BGFX_CONFIG_RENDERER_OPENGLES
|
||||
# define BGFX_CONFIG_RENDERER_OPENGLES (BX_PLATFORM_NACL|BX_PLATFORM_ANDROID|BX_PLATFORM_IOS)
|
||||
# ifndef BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
# define BGFX_CONFIG_RENDERER_OPENGLES2 (BX_PLATFORM_NACL|BX_PLATFORM_ANDROID|BX_PLATFORM_IOS)
|
||||
# endif // BGFX_CONFIG_RENDERER_OPENGLES
|
||||
|
||||
# ifndef BGFX_CONFIG_RENDERER_NULL
|
||||
# define BGFX_CONFIG_RENDERER_NULL (!(BGFX_CONFIG_RENDERER_DIRECT3D|BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES) )
|
||||
# define BGFX_CONFIG_RENDERER_NULL (!(BGFX_CONFIG_RENDERER_DIRECT3D9|BGFX_CONFIG_RENDERER_OPENGL|BGFX_CONFIG_RENDERER_OPENGLES2) )
|
||||
# endif // BGFX_CONFIG_RENDERER_NULL
|
||||
#endif // !defined...
|
||||
|
||||
|
141
src/renderer_d3d11.cpp
Normal file
141
src/renderer_d3d11.cpp
Normal file
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
|
||||
* License: http://www.opensource.org/licenses/BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include "bgfx_p.h"
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D11
|
||||
|
||||
namespace bgfx
|
||||
{
|
||||
void ConstantBuffer::commit()
|
||||
{
|
||||
}
|
||||
|
||||
void TextVideoMemBlitter::setup()
|
||||
{
|
||||
}
|
||||
|
||||
void TextVideoMemBlitter::render(uint32_t /*_numIndices*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::flip()
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererInit()
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererShutdown()
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateIndexBuffer(IndexBufferHandle /*_handle*/, Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyIndexBuffer(IndexBufferHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateVertexDecl(VertexDeclHandle /*_handle*/, const VertexDecl& /*_decl*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyVertexDecl(VertexDeclHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateVertexBuffer(VertexBufferHandle /*_handle*/, Memory* /*_mem*/, VertexDeclHandle /*_declHandle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyVertexBuffer(VertexBufferHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_size*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererUpdateDynamicIndexBuffer(IndexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyDynamicIndexBuffer(IndexBufferHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_size*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererUpdateDynamicVertexBuffer(VertexBufferHandle /*_handle*/, uint32_t /*_offset*/, uint32_t /*_size*/, Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyDynamicVertexBuffer(VertexBufferHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateVertexShader(VertexShaderHandle /*_handle*/, Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyVertexShader(VertexShaderHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateFragmentShader(FragmentShaderHandle /*_handle*/, Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyFragmentShader(FragmentShaderHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateMaterial(MaterialHandle /*_handle*/, VertexShaderHandle /*_vsh*/, FragmentShaderHandle /*_fsh*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyMaterial(FragmentShaderHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateTexture(TextureHandle /*_handle*/, Memory* /*_mem*/, uint32_t /*_flags*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyTexture(TextureHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateRenderTarget(RenderTargetHandle /*_handle*/, uint16_t /*_width*/, uint16_t /*_height*/, uint32_t /*_flags*/, uint32_t /*_textureFlags*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyRenderTarget(RenderTargetHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererCreateUniform(UniformHandle /*_handle*/, ConstantType::Enum /*_type*/, uint16_t /*_num*/, const char* /*_name*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererDestroyUniform(UniformHandle /*_handle*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererSaveScreenShot(Memory* /*_mem*/)
|
||||
{
|
||||
}
|
||||
|
||||
void Context::rendererSubmit()
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D11
|
@ -5,7 +5,7 @@
|
||||
|
||||
#include "bgfx_p.h"
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
# include "renderer_d3d9.h"
|
||||
|
||||
namespace bgfx
|
||||
@ -192,7 +192,7 @@ namespace bgfx
|
||||
m_D3DPERF_BeginEvent = (D3DPERF_BeginEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_BeginEvent");
|
||||
m_D3DPERF_EndEvent = (D3DPERF_EndEventFunc)GetProcAddress(m_d3d9dll, "D3DPERF_EndEvent");
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
Direct3DCreate9ExFunc direct3DCreate9Ex = (Direct3DCreate9ExFunc)GetProcAddress(m_d3d9dll, "Direct3DCreate9Ex");
|
||||
BGFX_FATAL(NULL != direct3DCreate9Ex, bgfx::Fatal::D3D9_UnableToCreateInterface, "Function Direct3DCreate9Ex not found.");
|
||||
direct3DCreate9Ex(D3D_SDK_VERSION, &m_d3d9);
|
||||
@ -247,7 +247,7 @@ namespace bgfx
|
||||
|
||||
for (uint32_t ii = 0; ii < countof(behaviorFlags) && NULL == m_device; ++ii)
|
||||
{
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
DX_CHECK(m_d3d9->CreateDeviceEx(m_adapter
|
||||
, m_deviceType
|
||||
, g_bgfxHwnd
|
||||
@ -264,7 +264,7 @@ namespace bgfx
|
||||
, &m_params
|
||||
, &m_device
|
||||
) );
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
}
|
||||
|
||||
BGFX_FATAL(m_device, bgfx::Fatal::D3D9_UnableToCreateDevice, "Unable to create Direct3D9 device.");
|
||||
@ -560,9 +560,9 @@ namespace bgfx
|
||||
{
|
||||
if (NULL != m_device)
|
||||
{
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
DX_CHECK(m_device->WaitForVBlank(0) );
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
|
||||
HRESULT hr;
|
||||
hr = m_device->Present(NULL, NULL, NULL, NULL);
|
||||
@ -694,13 +694,13 @@ namespace bgfx
|
||||
D3DPERF_EndEventFunc m_D3DPERF_EndEvent;
|
||||
#endif // BX_PLATFORM_WINDOWS
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#if BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
IDirect3D9Ex* m_d3d9;
|
||||
IDirect3DDevice9Ex* m_device;
|
||||
#else
|
||||
IDirect3D9* m_d3d9;
|
||||
IDirect3DDevice9* m_device;
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
|
||||
IDirect3DSurface9* m_backBufferColor;
|
||||
IDirect3DSurface9* m_backBufferDepthStencil;
|
||||
@ -2377,6 +2377,7 @@ namespace bgfx
|
||||
|
||||
tvm.clear();
|
||||
uint16_t pos = 10;
|
||||
tvm.printf(0, 0, 0x8f, " " BGFX_RENDERER_NAME " ");
|
||||
tvm.printf(10, pos++, 0x8e, " Frame: %3.4f [ms] / %3.2f", frameTime*toMs, freq/frameTime);
|
||||
tvm.printf(10, pos++, 0x8e, " Draw calls: %4d / CPU %3.4f [ms]"
|
||||
, m_render->m_num
|
||||
@ -2415,4 +2416,4 @@ namespace bgfx
|
||||
}
|
||||
}
|
||||
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D
|
||||
#endif // BGFX_CONFIG_RENDERER_DIRECT3D9
|
||||
|
@ -6,7 +6,7 @@
|
||||
#ifndef __RENDERER_D3D9_H__
|
||||
#define __RENDERER_D3D9_H__
|
||||
|
||||
#define BGFX_CONFIG_RENDERER_DIRECT3D_EX (BX_PLATFORM_WINDOWS && 0)
|
||||
#define BGFX_CONFIG_RENDERER_DIRECT3D9EX (BX_PLATFORM_WINDOWS && 0)
|
||||
|
||||
#ifndef D3DSTREAMSOURCE_INDEXEDDATA
|
||||
# define D3DSTREAMSOURCE_INDEXEDDATA (1<<30)
|
||||
@ -17,16 +17,16 @@
|
||||
#endif // D3DSTREAMSOURCE_INSTANCEDATA
|
||||
|
||||
#if BX_PLATFORM_WINDOWS
|
||||
# if !BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
# if !BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
# define D3D_DISABLE_9EX
|
||||
# endif // !BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
# endif // !BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
# include <d3d9.h>
|
||||
|
||||
# if BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
# if BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
typedef HRESULT (WINAPI *Direct3DCreate9ExFunc)(UINT SDKVersion, IDirect3D9Ex**);
|
||||
# else
|
||||
typedef IDirect3D9* (WINAPI *Direct3DCreate9Func)(UINT SDKVersion);
|
||||
# endif // BGFX_CONFIG_RENDERER_DIRECT3D_EX
|
||||
# endif // BGFX_CONFIG_RENDERER_DIRECT3D9EX
|
||||
|
||||
typedef int (WINAPI *D3DPERF_BeginEventFunc)(D3DCOLOR col, LPCWSTR wszName);
|
||||
typedef int (WINAPI *D3DPERF_EndEventFunc)();
|
||||
|
5023
src/renderer_gl.cpp
5023
src/renderer_gl.cpp
File diff suppressed because it is too large
Load Diff
@ -1,403 +1,403 @@
|
||||
/*
|
||||
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
|
||||
* License: http://www.opensource.org/licenses/BSD-2-Clause
|
||||
*/
|
||||
|
||||
#ifndef __RENDERER_GL_H__
|
||||
#define __RENDERER_GL_H__
|
||||
|
||||
#define BGFX_USE_EGL 0
|
||||
#define BGFX_USE_WGL 0
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||
# if BX_PLATFORM_LINUX
|
||||
# define GL_PROTOTYPES
|
||||
# define GL_GLEXT_LEGACY
|
||||
# include <GL/gl.h>
|
||||
# include <GL/glx.h>
|
||||
# undef GL_PROTOTYPES
|
||||
# elif BX_PLATFORM_OSX
|
||||
# define GL_PROTOTYPES
|
||||
# define GL_GLEXT_LEGACY
|
||||
# define GL_VERSION_1_2
|
||||
# define GL_VERSION_1_3
|
||||
# define GL_VERSION_1_5
|
||||
# define GL_VERSION_2_0
|
||||
# include <OpenGL/gl.h>
|
||||
# undef GL_VERSION_2_0
|
||||
# undef GL_VERSION_1_5
|
||||
# undef GL_VERSION_1_3
|
||||
# undef GL_VERSION_1_2
|
||||
# undef GL_PROTOTYPES
|
||||
# else
|
||||
# include <GL/gl.h>
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
# if BX_PLATFORM_WINDOWS
|
||||
# undef BGFX_USE_WGL
|
||||
# define BGFX_USE_WGL 1
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
// remove deprecated from glext.h
|
||||
# define GL_VERSION_1_2_DEPRECATED
|
||||
# define GL_ARB_imaging_DEPRECATED
|
||||
# define GL_VERSION_1_3_DEPRECATED
|
||||
# define GL_VERSION_1_4_DEPRECATED
|
||||
# define GL_VERSION_1_5_DEPRECATED
|
||||
# define GL_VERSION_2_0_DEPRECATED
|
||||
# define GL_VERSION_2_1_DEPRECATED
|
||||
// ignore everything above 2.1
|
||||
# define GL_VERSION_3_0
|
||||
# define GL_VERSION_3_0_DEPRECATED
|
||||
# define GL_VERSION_3_1
|
||||
# define GL_VERSION_3_2
|
||||
# define GL_VERSION_3_3
|
||||
# define GL_VERSION_4_0
|
||||
# define GL_VERSION_4_1
|
||||
# define GL_VERSION_4_2
|
||||
# include <gl/glext.h>
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES
|
||||
# include <GLES2/gl2.h>
|
||||
# include <GLES2/gl2ext.h>
|
||||
|
||||
# if BX_PLATFORM_WINDOWS
|
||||
# include <EGL/egl.h>
|
||||
# undef BGFX_USE_EGL
|
||||
# define BGFX_USE_EGL 1
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
|
||||
# define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
|
||||
# endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
|
||||
|
||||
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
||||
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
|
||||
# endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
||||
|
||||
# ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||
# define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
|
||||
# endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||
|
||||
typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
|
||||
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
#if BX_PLATFORM_NACL
|
||||
# include <ppapi/gles2/gl2ext_ppapi.h>
|
||||
# include <ppapi/c/pp_completion_callback.h>
|
||||
# include <ppapi/c/ppb_instance.h>
|
||||
# include <ppapi/c/ppb_graphics_3d.h>
|
||||
#elif BX_PLATFORM_WINDOWS
|
||||
# include <windows.h>
|
||||
#elif BX_PLATFORM_LINUX
|
||||
# include <X11/Xlib.h>
|
||||
#endif // BX_PLATFORM_
|
||||
|
||||
#if BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
|
||||
# include <gl/GRemedyGLExtensions.h>
|
||||
#endif // BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
|
||||
|
||||
#if BGFX_USE_WGL
|
||||
typedef PROC (APIENTRYP PFNWGLGETPROCADDRESSPROC) (LPCSTR lpszProc);
|
||||
typedef BOOL (APIENTRYP PFNWGLMAKECURRENTPROC) (HDC hdc, HGLRC hglrc);
|
||||
typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTPROC) (HDC hdc);
|
||||
typedef BOOL (APIENTRYP PFNWGLDELETECONTEXTPROC) (HGLRC hglrc);
|
||||
//
|
||||
typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
|
||||
typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
|
||||
typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
|
||||
typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
|
||||
typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
|
||||
typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
|
||||
typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
|
||||
typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
|
||||
typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
|
||||
typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
|
||||
typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
|
||||
typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
|
||||
typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
|
||||
typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
|
||||
typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
|
||||
typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size);
|
||||
typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
|
||||
typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
|
||||
typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
|
||||
typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
|
||||
typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
|
||||
typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);
|
||||
typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
||||
#endif // BGFX_USE_WGL
|
||||
|
||||
#ifndef GL_APIENTRY
|
||||
# define GL_APIENTRY APIENTRY
|
||||
#endif // GL_APIENTRY
|
||||
|
||||
#ifndef GL_APIENTRYP
|
||||
# define GL_APIENTRYP APIENTRYP
|
||||
#endif // GL_APIENTRYP
|
||||
|
||||
namespace bgfx
|
||||
{
|
||||
/*
|
||||
* Copyright 2011-2012 Branimir Karadzic. All rights reserved.
|
||||
* License: http://www.opensource.org/licenses/BSD-2-Clause
|
||||
*/
|
||||
|
||||
#ifndef __RENDERER_GL_H__
|
||||
#define __RENDERER_GL_H__
|
||||
|
||||
#define BGFX_USE_EGL 0
|
||||
#define BGFX_USE_WGL 0
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||
# if BX_PLATFORM_LINUX
|
||||
# define GL_PROTOTYPES
|
||||
# define GL_GLEXT_LEGACY
|
||||
# include <GL/gl.h>
|
||||
# include <GL/glx.h>
|
||||
# undef GL_PROTOTYPES
|
||||
# elif BX_PLATFORM_OSX
|
||||
# define GL_PROTOTYPES
|
||||
# define GL_GLEXT_LEGACY
|
||||
# define GL_VERSION_1_2
|
||||
# define GL_VERSION_1_3
|
||||
# define GL_VERSION_1_5
|
||||
# define GL_VERSION_2_0
|
||||
# include <OpenGL/gl.h>
|
||||
# undef GL_VERSION_2_0
|
||||
# undef GL_VERSION_1_5
|
||||
# undef GL_VERSION_1_3
|
||||
# undef GL_VERSION_1_2
|
||||
# undef GL_PROTOTYPES
|
||||
# else
|
||||
# include <GL/gl.h>
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
# if BX_PLATFORM_WINDOWS
|
||||
# undef BGFX_USE_WGL
|
||||
# define BGFX_USE_WGL 1
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
// remove deprecated from glext.h
|
||||
# define GL_VERSION_1_2_DEPRECATED
|
||||
# define GL_ARB_imaging_DEPRECATED
|
||||
# define GL_VERSION_1_3_DEPRECATED
|
||||
# define GL_VERSION_1_4_DEPRECATED
|
||||
# define GL_VERSION_1_5_DEPRECATED
|
||||
# define GL_VERSION_2_0_DEPRECATED
|
||||
# define GL_VERSION_2_1_DEPRECATED
|
||||
// ignore everything above 2.1
|
||||
# define GL_VERSION_3_0
|
||||
# define GL_VERSION_3_0_DEPRECATED
|
||||
# define GL_VERSION_3_1
|
||||
# define GL_VERSION_3_2
|
||||
# define GL_VERSION_3_3
|
||||
# define GL_VERSION_4_0
|
||||
# define GL_VERSION_4_1
|
||||
# define GL_VERSION_4_2
|
||||
# include <gl/glext.h>
|
||||
#elif BGFX_CONFIG_RENDERER_OPENGLES2
|
||||
# include <GLES2/gl2.h>
|
||||
# include <GLES2/gl2ext.h>
|
||||
|
||||
# if BX_PLATFORM_WINDOWS
|
||||
# include <EGL/egl.h>
|
||||
# undef BGFX_USE_EGL
|
||||
# define BGFX_USE_EGL 1
|
||||
# endif // BX_PLATFORM_
|
||||
|
||||
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
|
||||
# define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
|
||||
# endif // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
|
||||
|
||||
# ifndef GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
||||
# define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
|
||||
# endif // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT
|
||||
|
||||
# ifndef GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||
# define GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE 0x93A0
|
||||
# endif // GL_TRANSLATED_SHADER_SOURCE_LENGTH_ANGLE
|
||||
|
||||
typedef void (*PFNGLGETTRANSLATEDSHADERSOURCEANGLEPROC)(GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *source);
|
||||
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
#if BX_PLATFORM_NACL
|
||||
# include <ppapi/gles2/gl2ext_ppapi.h>
|
||||
# include <ppapi/c/pp_completion_callback.h>
|
||||
# include <ppapi/c/ppb_instance.h>
|
||||
# include <ppapi/c/ppb_graphics_3d.h>
|
||||
#elif BX_PLATFORM_WINDOWS
|
||||
# include <windows.h>
|
||||
#elif BX_PLATFORM_LINUX
|
||||
# include <X11/Xlib.h>
|
||||
#endif // BX_PLATFORM_
|
||||
|
||||
#if BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
|
||||
# include <gl/GRemedyGLExtensions.h>
|
||||
#endif // BGFX_CONFIG_DEBUG_GREMEDY && (BX_PLATFORM_WINDOWS || BX_PLATFORM_LINUX)
|
||||
|
||||
#if BGFX_USE_WGL
|
||||
typedef PROC (APIENTRYP PFNWGLGETPROCADDRESSPROC) (LPCSTR lpszProc);
|
||||
typedef BOOL (APIENTRYP PFNWGLMAKECURRENTPROC) (HDC hdc, HGLRC hglrc);
|
||||
typedef HGLRC (APIENTRYP PFNWGLCREATECONTEXTPROC) (HDC hdc);
|
||||
typedef BOOL (APIENTRYP PFNWGLDELETECONTEXTPROC) (HGLRC hglrc);
|
||||
//
|
||||
typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
|
||||
typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);
|
||||
typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
|
||||
typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
|
||||
typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
|
||||
typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
|
||||
typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
|
||||
typedef void (APIENTRYP PFNGLCOLORMASKPROC) (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
|
||||
typedef void (APIENTRYP PFNGLDEPTHFUNCPROC) (GLenum func);
|
||||
typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
|
||||
typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices);
|
||||
typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *params);
|
||||
typedef const GLubyte * (APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
|
||||
typedef void (APIENTRYP PFNGLDRAWARRAYSPROC) (GLenum mode, GLint first, GLsizei count);
|
||||
typedef void (APIENTRYP PFNGLBLENDFUNCPROC) (GLenum sfactor, GLenum dfactor);
|
||||
typedef void (APIENTRYP PFNGLPOINTSIZEPROC) (GLfloat size);
|
||||
typedef void (APIENTRYP PFNGLCULLFACEPROC) (GLenum mode);
|
||||
typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
|
||||
typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
|
||||
typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
|
||||
typedef void (APIENTRYP PFNGLCLEARSTENCILPROC) (GLint s);
|
||||
typedef void (APIENTRYP PFNGLDEPTHMASKPROC) (GLboolean flag);
|
||||
typedef void (APIENTRYP PFNGLCLEARDEPTHPROC) (GLdouble depth);
|
||||
typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
|
||||
#endif // BGFX_USE_WGL
|
||||
|
||||
#ifndef GL_APIENTRY
|
||||
# define GL_APIENTRY APIENTRY
|
||||
#endif // GL_APIENTRY
|
||||
|
||||
#ifndef GL_APIENTRYP
|
||||
# define GL_APIENTRYP APIENTRYP
|
||||
#endif // GL_APIENTRYP
|
||||
|
||||
namespace bgfx
|
||||
{
|
||||
typedef void (GL_APIENTRYP PFNGLVERTEXATTRIBDIVISORBGFXPROC)(GLuint _index, GLuint _divisor);
|
||||
typedef void (GL_APIENTRYP PFNGLDRAWARRAYSINSTANCEDBGFXPROC)(GLenum _mode, GLint _first, GLsizei _count, GLsizei _primcount);
|
||||
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBGFXPROC)(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei _primcount);
|
||||
|
||||
# define _GL_CHECK(_call) \
|
||||
do { \
|
||||
/*BX_TRACE(#_call);*/ \
|
||||
_call; \
|
||||
GLenum err = glGetError(); \
|
||||
BX_CHECK(0 == err, #_call "; glError 0x%x %d", err, err); \
|
||||
} while (0)
|
||||
|
||||
#if BGFX_CONFIG_DEBUG
|
||||
# define GL_CHECK(_call) _GL_CHECK(_call)
|
||||
#else
|
||||
# define GL_CHECK(_call) _call
|
||||
#endif // BGFX_CONFIG_DEBUG
|
||||
|
||||
#if BGFX_CONFIG_DEBUG_GREMEDY
|
||||
# define _GREMEDY_SETMARKER(_string) \
|
||||
do \
|
||||
{ \
|
||||
if (NULL != glStringMarkerGREMEDY) \
|
||||
{ \
|
||||
glStringMarkerGREMEDY( (GLsizei)strlen(_string), _string); \
|
||||
} \
|
||||
} while(0)
|
||||
# define _GREMEDY_FRAMETERMINATOR() \
|
||||
do \
|
||||
{ \
|
||||
if (NULL != glStringMarkerGREMEDY) \
|
||||
{ \
|
||||
glFrameTerminatorGREMEDY(); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
# define _GREMEDY_SETMARKER(_string) do {} while(0)
|
||||
# define _GREMEDY_FRAMETERMINATOR() do {} while(0)
|
||||
#endif // BGFX_CONFIG_DEBUG_GREMEDY
|
||||
|
||||
#define GREMEDY_SETMARKER(_string) _GREMEDY_SETMARKER(_string)
|
||||
#define GREMEDY_FRAMETERMINATOR() _GREMEDY_FRAMETERMINATOR()
|
||||
|
||||
#if BGFX_USE_WGL
|
||||
extern PFNWGLGETPROCADDRESSPROC wglGetProcAddress;
|
||||
extern PFNWGLMAKECURRENTPROC wglMakeCurrent;
|
||||
extern PFNWGLCREATECONTEXTPROC wglCreateContext;
|
||||
#endif // BGFX_USE_WGL
|
||||
|
||||
#define GL_IMPORT(_optional, _proto, _func) extern _proto _func
|
||||
#include "glimports.h"
|
||||
#undef GL_IMPORT
|
||||
|
||||
class ConstantBuffer;
|
||||
|
||||
struct IndexBuffer
|
||||
{
|
||||
void create(uint32_t _size, void* _data)
|
||||
{
|
||||
m_size = _size;
|
||||
|
||||
GL_CHECK(glGenBuffers(1, &m_id) );
|
||||
BX_CHECK(0 != m_id, "Failed to generate buffer id.");
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
|
||||
, _size
|
||||
, _data
|
||||
, (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void update(uint32_t _offset, uint32_t _size, void* _data)
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
|
||||
, _offset
|
||||
, _size
|
||||
, _data
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
glDeleteBuffers(1, &m_id);
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
uint32_t m_size;
|
||||
};
|
||||
|
||||
struct VertexBuffer
|
||||
{
|
||||
void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle)
|
||||
{
|
||||
m_size = _size;
|
||||
m_decl = _declHandle;
|
||||
|
||||
GL_CHECK(glGenBuffers(1, &m_id) );
|
||||
BX_CHECK(0 != m_id, "Failed to generate buffer id.");
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferData(GL_ARRAY_BUFFER
|
||||
, _size
|
||||
, _data
|
||||
, (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void update(uint32_t _offset, uint32_t _size, void* _data)
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER
|
||||
, _offset
|
||||
, _size
|
||||
, _data
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
GL_CHECK(glDeleteBuffers(1, &m_id) );
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
uint32_t m_size;
|
||||
VertexDeclHandle m_decl;
|
||||
};
|
||||
|
||||
struct Texture
|
||||
{
|
||||
Texture()
|
||||
: m_id(0)
|
||||
, m_target(GL_TEXTURE_2D)
|
||||
{
|
||||
}
|
||||
|
||||
void create(const Memory* _mem, uint32_t _flags);
|
||||
void createColor(uint32_t _width, uint32_t _height, GLenum _min, GLenum _mag);
|
||||
void createDepth(uint32_t _width, uint32_t _height);
|
||||
void destroy();
|
||||
|
||||
GLuint m_id;
|
||||
GLenum m_target;
|
||||
};
|
||||
|
||||
struct Shader
|
||||
{
|
||||
void create(GLenum _type, const uint8_t* _code)
|
||||
{
|
||||
m_id = glCreateShader(_type);
|
||||
m_type = _type;
|
||||
|
||||
if (0 != m_id)
|
||||
{
|
||||
m_hash = hash(_code, (uint32_t)strlen( (const char*)_code) );
|
||||
GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&_code, NULL) );
|
||||
GL_CHECK(glCompileShader(m_id) );
|
||||
|
||||
GLint compiled = 0;
|
||||
GL_CHECK(glGetShaderiv(m_id, GL_COMPILE_STATUS, &compiled) );
|
||||
|
||||
if (0 == compiled)
|
||||
{
|
||||
char log[1024];
|
||||
GL_CHECK(glGetShaderInfoLog(m_id, sizeof(log), NULL, log) );
|
||||
BX_TRACE("Failed to compile shader. %d: %s", compiled, log);
|
||||
BX_TRACE("\n####\n%s\n####", _code);
|
||||
|
||||
GL_CHECK(glDeleteShader(m_id) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
GL_CHECK(glDeleteShader(m_id) );
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
GLenum m_type;
|
||||
uint32_t m_hash;
|
||||
};
|
||||
|
||||
struct RenderTarget
|
||||
{
|
||||
void create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags);
|
||||
void destroy();
|
||||
|
||||
GLsizei m_width;
|
||||
GLsizei m_height;
|
||||
Texture m_color;
|
||||
Texture m_depth;
|
||||
GLuint m_fbo;
|
||||
GLuint m_rbo;
|
||||
};
|
||||
|
||||
struct Material
|
||||
{
|
||||
void create(const Shader& _vsh, const Shader& _fsh);
|
||||
void destroy();
|
||||
void init();
|
||||
void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
|
||||
void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
|
||||
|
||||
GLuint m_id;
|
||||
|
||||
uint8_t m_used[Attrib::Count+1]; // dense
|
||||
uint16_t m_attributes[Attrib::Count]; // sparse
|
||||
uint16_t m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
|
||||
uint32_t m_enabled;
|
||||
|
||||
GLuint m_sampler[BGFX_CONFIG_MAX_TEXTURES];
|
||||
uint8_t m_numSamplers;
|
||||
|
||||
ConstantBuffer* m_constantBuffer;
|
||||
PredefinedUniform m_predefined[PredefinedUniform::Count];
|
||||
uint8_t m_numPredefined;
|
||||
};
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||
struct Queries
|
||||
{
|
||||
void create()
|
||||
{
|
||||
glGenQueries(countof(m_queries), m_queries);
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
glDeleteQueries(countof(m_queries), m_queries);
|
||||
}
|
||||
|
||||
void begin(uint16_t _id, GLenum _target) const
|
||||
{
|
||||
glBeginQuery(_target, m_queries[_id]);
|
||||
}
|
||||
|
||||
void end(GLenum _target) const
|
||||
{
|
||||
glEndQuery(_target);
|
||||
}
|
||||
|
||||
uint64_t getResult(uint16_t _id) const
|
||||
{
|
||||
uint64_t result;
|
||||
glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
GLuint m_queries[64];
|
||||
};
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
} // namespace bgfx
|
||||
|
||||
#endif // __RENDERER_GL_H__
|
||||
typedef void (GL_APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBGFXPROC)(GLenum _mode, GLsizei _count, GLenum _type, const GLvoid* _indices, GLsizei _primcount);
|
||||
|
||||
# define _GL_CHECK(_call) \
|
||||
do { \
|
||||
/*BX_TRACE(#_call);*/ \
|
||||
_call; \
|
||||
GLenum err = glGetError(); \
|
||||
BX_CHECK(0 == err, #_call "; glError 0x%x %d", err, err); \
|
||||
} while (0)
|
||||
|
||||
#if BGFX_CONFIG_DEBUG
|
||||
# define GL_CHECK(_call) _GL_CHECK(_call)
|
||||
#else
|
||||
# define GL_CHECK(_call) _call
|
||||
#endif // BGFX_CONFIG_DEBUG
|
||||
|
||||
#if BGFX_CONFIG_DEBUG_GREMEDY
|
||||
# define _GREMEDY_SETMARKER(_string) \
|
||||
do \
|
||||
{ \
|
||||
if (NULL != glStringMarkerGREMEDY) \
|
||||
{ \
|
||||
glStringMarkerGREMEDY( (GLsizei)strlen(_string), _string); \
|
||||
} \
|
||||
} while(0)
|
||||
# define _GREMEDY_FRAMETERMINATOR() \
|
||||
do \
|
||||
{ \
|
||||
if (NULL != glStringMarkerGREMEDY) \
|
||||
{ \
|
||||
glFrameTerminatorGREMEDY(); \
|
||||
} \
|
||||
} while(0)
|
||||
#else
|
||||
# define _GREMEDY_SETMARKER(_string) do {} while(0)
|
||||
# define _GREMEDY_FRAMETERMINATOR() do {} while(0)
|
||||
#endif // BGFX_CONFIG_DEBUG_GREMEDY
|
||||
|
||||
#define GREMEDY_SETMARKER(_string) _GREMEDY_SETMARKER(_string)
|
||||
#define GREMEDY_FRAMETERMINATOR() _GREMEDY_FRAMETERMINATOR()
|
||||
|
||||
#if BGFX_USE_WGL
|
||||
extern PFNWGLGETPROCADDRESSPROC wglGetProcAddress;
|
||||
extern PFNWGLMAKECURRENTPROC wglMakeCurrent;
|
||||
extern PFNWGLCREATECONTEXTPROC wglCreateContext;
|
||||
#endif // BGFX_USE_WGL
|
||||
|
||||
#define GL_IMPORT(_optional, _proto, _func) extern _proto _func
|
||||
#include "glimports.h"
|
||||
#undef GL_IMPORT
|
||||
|
||||
class ConstantBuffer;
|
||||
|
||||
struct IndexBuffer
|
||||
{
|
||||
void create(uint32_t _size, void* _data)
|
||||
{
|
||||
m_size = _size;
|
||||
|
||||
GL_CHECK(glGenBuffers(1, &m_id) );
|
||||
BX_CHECK(0 != m_id, "Failed to generate buffer id.");
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferData(GL_ELEMENT_ARRAY_BUFFER
|
||||
, _size
|
||||
, _data
|
||||
, (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void update(uint32_t _offset, uint32_t _size, void* _data)
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferSubData(GL_ELEMENT_ARRAY_BUFFER
|
||||
, _offset
|
||||
, _size
|
||||
, _data
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||
glDeleteBuffers(1, &m_id);
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
uint32_t m_size;
|
||||
};
|
||||
|
||||
struct VertexBuffer
|
||||
{
|
||||
void create(uint32_t _size, void* _data, VertexDeclHandle _declHandle)
|
||||
{
|
||||
m_size = _size;
|
||||
m_decl = _declHandle;
|
||||
|
||||
GL_CHECK(glGenBuffers(1, &m_id) );
|
||||
BX_CHECK(0 != m_id, "Failed to generate buffer id.");
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferData(GL_ARRAY_BUFFER
|
||||
, _size
|
||||
, _data
|
||||
, (NULL==_data)?GL_DYNAMIC_DRAW:GL_STATIC_DRAW
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void update(uint32_t _offset, uint32_t _size, void* _data)
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, m_id) );
|
||||
GL_CHECK(glBufferSubData(GL_ARRAY_BUFFER
|
||||
, _offset
|
||||
, _size
|
||||
, _data
|
||||
) );
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
GL_CHECK(glBindBuffer(GL_ARRAY_BUFFER, 0) );
|
||||
GL_CHECK(glDeleteBuffers(1, &m_id) );
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
uint32_t m_size;
|
||||
VertexDeclHandle m_decl;
|
||||
};
|
||||
|
||||
struct Texture
|
||||
{
|
||||
Texture()
|
||||
: m_id(0)
|
||||
, m_target(GL_TEXTURE_2D)
|
||||
{
|
||||
}
|
||||
|
||||
void create(const Memory* _mem, uint32_t _flags);
|
||||
void createColor(uint32_t _width, uint32_t _height, GLenum _min, GLenum _mag);
|
||||
void createDepth(uint32_t _width, uint32_t _height);
|
||||
void destroy();
|
||||
|
||||
GLuint m_id;
|
||||
GLenum m_target;
|
||||
};
|
||||
|
||||
struct Shader
|
||||
{
|
||||
void create(GLenum _type, const uint8_t* _code)
|
||||
{
|
||||
m_id = glCreateShader(_type);
|
||||
m_type = _type;
|
||||
|
||||
if (0 != m_id)
|
||||
{
|
||||
m_hash = hash(_code, (uint32_t)strlen( (const char*)_code) );
|
||||
GL_CHECK(glShaderSource(m_id, 1, (const GLchar**)&_code, NULL) );
|
||||
GL_CHECK(glCompileShader(m_id) );
|
||||
|
||||
GLint compiled = 0;
|
||||
GL_CHECK(glGetShaderiv(m_id, GL_COMPILE_STATUS, &compiled) );
|
||||
|
||||
if (0 == compiled)
|
||||
{
|
||||
char log[1024];
|
||||
GL_CHECK(glGetShaderInfoLog(m_id, sizeof(log), NULL, log) );
|
||||
BX_TRACE("Failed to compile shader. %d: %s", compiled, log);
|
||||
BX_TRACE("\n####\n%s\n####", _code);
|
||||
|
||||
GL_CHECK(glDeleteShader(m_id) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
GL_CHECK(glDeleteShader(m_id) );
|
||||
}
|
||||
|
||||
GLuint m_id;
|
||||
GLenum m_type;
|
||||
uint32_t m_hash;
|
||||
};
|
||||
|
||||
struct RenderTarget
|
||||
{
|
||||
void create(uint16_t _width, uint16_t _height, uint32_t _flags, uint32_t _textureFlags);
|
||||
void destroy();
|
||||
|
||||
GLsizei m_width;
|
||||
GLsizei m_height;
|
||||
Texture m_color;
|
||||
Texture m_depth;
|
||||
GLuint m_fbo;
|
||||
GLuint m_rbo;
|
||||
};
|
||||
|
||||
struct Material
|
||||
{
|
||||
void create(const Shader& _vsh, const Shader& _fsh);
|
||||
void destroy();
|
||||
void init();
|
||||
void bindAttributes(const VertexDecl& _vertexDecl, uint32_t _baseVertex = 0) const;
|
||||
void bindInstanceData(uint32_t _stride, uint32_t _baseVertex = 0) const;
|
||||
|
||||
GLuint m_id;
|
||||
|
||||
uint8_t m_used[Attrib::Count+1]; // dense
|
||||
uint16_t m_attributes[Attrib::Count]; // sparse
|
||||
uint16_t m_instanceData[BGFX_CONFIG_MAX_INSTANCE_DATA_COUNT];
|
||||
uint32_t m_enabled;
|
||||
|
||||
GLuint m_sampler[BGFX_CONFIG_MAX_TEXTURES];
|
||||
uint8_t m_numSamplers;
|
||||
|
||||
ConstantBuffer* m_constantBuffer;
|
||||
PredefinedUniform m_predefined[PredefinedUniform::Count];
|
||||
uint8_t m_numPredefined;
|
||||
};
|
||||
|
||||
#if BGFX_CONFIG_RENDERER_OPENGL
|
||||
struct Queries
|
||||
{
|
||||
void create()
|
||||
{
|
||||
glGenQueries(countof(m_queries), m_queries);
|
||||
}
|
||||
|
||||
void destroy()
|
||||
{
|
||||
glDeleteQueries(countof(m_queries), m_queries);
|
||||
}
|
||||
|
||||
void begin(uint16_t _id, GLenum _target) const
|
||||
{
|
||||
glBeginQuery(_target, m_queries[_id]);
|
||||
}
|
||||
|
||||
void end(GLenum _target) const
|
||||
{
|
||||
glEndQuery(_target);
|
||||
}
|
||||
|
||||
uint64_t getResult(uint16_t _id) const
|
||||
{
|
||||
uint64_t result;
|
||||
glGetQueryObjectui64v(m_queries[_id], GL_QUERY_RESULT, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
GLuint m_queries[64];
|
||||
};
|
||||
#endif // BGFX_CONFIG_RENDERER_OPENGL
|
||||
|
||||
} // namespace bgfx
|
||||
|
||||
#endif // __RENDERER_GL_H__
|
||||
|
Loading…
Reference in New Issue
Block a user