mirror of
https://github.com/scratchfoundation/bgfx.git
synced 2024-12-11 00:31:28 -05:00
Integrated Remotery.
This commit is contained in:
parent
2f8bbfb758
commit
21ccf8cb8c
4 changed files with 47 additions and 20 deletions
37
3rdparty/remotery/lib/Remotery.c
vendored
37
3rdparty/remotery/lib/Remotery.c
vendored
|
@ -508,7 +508,7 @@ static void WriteFence()
|
||||||
|
|
||||||
// Get a shared value with acquire semantics, ensuring the read is complete
|
// Get a shared value with acquire semantics, ensuring the read is complete
|
||||||
// before the function returns.
|
// before the function returns.
|
||||||
static void* LoadAcquire(void* volatile const* addr)
|
void* LoadAcquire(void* volatile const* addr)
|
||||||
{
|
{
|
||||||
// Hardware fence is implicit on x86 so only need the compiler fence
|
// Hardware fence is implicit on x86 so only need the compiler fence
|
||||||
void* v = *addr;
|
void* v = *addr;
|
||||||
|
@ -519,7 +519,7 @@ static void* LoadAcquire(void* volatile const* addr)
|
||||||
|
|
||||||
// Set a shared value with release semantics, ensuring any prior writes
|
// Set a shared value with release semantics, ensuring any prior writes
|
||||||
// are complete before the value is set.
|
// are complete before the value is set.
|
||||||
static void StoreRelease(void* volatile* addr, void* v)
|
void StoreRelease(void* volatile* addr, void* v)
|
||||||
{
|
{
|
||||||
// Hardware fence is implicit on x86 so only need the compiler fence
|
// Hardware fence is implicit on x86 so only need the compiler fence
|
||||||
WriteFence();
|
WriteFence();
|
||||||
|
@ -613,6 +613,7 @@ typedef struct VirtualMirrorBuffer
|
||||||
static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmtU32 size, int nb_attempts)
|
static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmtU32 size, int nb_attempts)
|
||||||
{
|
{
|
||||||
static const rmtU32 k_64 = 64 * 1024;
|
static const rmtU32 k_64 = 64 * 1024;
|
||||||
|
RMT_UNREFERENCED_PARAMETER(nb_attempts);
|
||||||
|
|
||||||
#ifdef RMT_PLATFORM_LINUX
|
#ifdef RMT_PLATFORM_LINUX
|
||||||
char path[] = "/dev/shm/ring-buffer-XXXXXX";
|
char path[] = "/dev/shm/ring-buffer-XXXXXX";
|
||||||
|
@ -785,7 +786,7 @@ static rmtError VirtualMirrorBuffer_Constructor(VirtualMirrorBuffer* buffer, rmt
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
// Map 2 contiguous pages
|
// Map 2 contiguous pages
|
||||||
buffer->ptr = mmap(NULL, size * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
buffer->ptr = (rmtU8*)mmap(NULL, size * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
|
||||||
if (buffer->ptr == MAP_FAILED)
|
if (buffer->ptr == MAP_FAILED)
|
||||||
{
|
{
|
||||||
buffer->ptr = NULL;
|
buffer->ptr = NULL;
|
||||||
|
@ -1173,8 +1174,6 @@ strstr_s (char *dest, rsize_t dmax,
|
||||||
static errno_t
|
static errno_t
|
||||||
strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
|
strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
|
||||||
{
|
{
|
||||||
rsize_t orig_dmax;
|
|
||||||
char *orig_dest;
|
|
||||||
const char *overlap_bumper;
|
const char *overlap_bumper;
|
||||||
|
|
||||||
if (dest == NULL) {
|
if (dest == NULL) {
|
||||||
|
@ -1198,8 +1197,6 @@ strncat_s (char *dest, rsize_t dmax, const char *src, rsize_t slen)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* hold base of dest in case src was not copied */
|
/* hold base of dest in case src was not copied */
|
||||||
orig_dmax = dmax;
|
|
||||||
orig_dest = dest;
|
|
||||||
|
|
||||||
if (dest < src) {
|
if (dest < src) {
|
||||||
overlap_bumper = src;
|
overlap_bumper = src;
|
||||||
|
@ -1341,9 +1338,9 @@ static void itoahex_s( char *dest, rsize_t dmax, rmtS32 value )
|
||||||
//
|
//
|
||||||
// All objects that require free-list-backed allocation need to inherit from this type.
|
// All objects that require free-list-backed allocation need to inherit from this type.
|
||||||
//
|
//
|
||||||
typedef struct ObjectLink
|
typedef struct ObjectLink_s
|
||||||
{
|
{
|
||||||
struct ObjectLink* volatile next;
|
struct ObjectLink_s* volatile next;
|
||||||
} ObjectLink;
|
} ObjectLink;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1676,11 +1673,12 @@ static void TCPSocket_Destructor(TCPSocket* tcp_socket)
|
||||||
static rmtError TCPSocket_RunServer(TCPSocket* tcp_socket, rmtU16 port)
|
static rmtError TCPSocket_RunServer(TCPSocket* tcp_socket, rmtU16 port)
|
||||||
{
|
{
|
||||||
SOCKET s = INVALID_SOCKET;
|
SOCKET s = INVALID_SOCKET;
|
||||||
struct sockaddr_in sin = { 0 };
|
struct sockaddr_in sin;
|
||||||
#ifdef RMT_PLATFORM_WINDOWS
|
#ifdef RMT_PLATFORM_WINDOWS
|
||||||
u_long nonblock = 1;
|
u_long nonblock = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
memset(&sin, 0, sizeof(sin) );
|
||||||
assert(tcp_socket != NULL);
|
assert(tcp_socket != NULL);
|
||||||
|
|
||||||
// Try to create the socket
|
// Try to create the socket
|
||||||
|
@ -3294,7 +3292,7 @@ enum SampleType
|
||||||
typedef struct Sample
|
typedef struct Sample
|
||||||
{
|
{
|
||||||
// Inherit so that samples can be quickly allocated
|
// Inherit so that samples can be quickly allocated
|
||||||
ObjectLink ObjectLink;
|
ObjectLink Link;
|
||||||
|
|
||||||
enum SampleType type;
|
enum SampleType type;
|
||||||
|
|
||||||
|
@ -3568,13 +3566,13 @@ static void SampleTree_Pop(SampleTree* tree, Sample* sample)
|
||||||
static ObjectLink* FlattenSampleTree(Sample* sample, rmtU32* nb_samples)
|
static ObjectLink* FlattenSampleTree(Sample* sample, rmtU32* nb_samples)
|
||||||
{
|
{
|
||||||
Sample* child;
|
Sample* child;
|
||||||
ObjectLink* cur_link = &sample->ObjectLink;
|
ObjectLink* cur_link = &sample->Link;
|
||||||
|
|
||||||
assert(sample != NULL);
|
assert(sample != NULL);
|
||||||
assert(nb_samples != NULL);
|
assert(nb_samples != NULL);
|
||||||
|
|
||||||
*nb_samples += 1;
|
*nb_samples += 1;
|
||||||
sample->ObjectLink.next = (ObjectLink*)sample->first_child;
|
sample->Link.next = (ObjectLink*)sample->first_child;
|
||||||
|
|
||||||
// Link all children together
|
// Link all children together
|
||||||
for (child = sample->first_child; child != NULL; child = child->next_sibling)
|
for (child = sample->first_child; child != NULL; child = child->next_sibling)
|
||||||
|
@ -3600,7 +3598,7 @@ static void FreeSampleTree(Sample* sample, ObjectAllocator* allocator)
|
||||||
ObjectLink* last_link = FlattenSampleTree(sample, &nb_cleared_samples);
|
ObjectLink* last_link = FlattenSampleTree(sample, &nb_cleared_samples);
|
||||||
|
|
||||||
// Release the complete sample memory range
|
// Release the complete sample memory range
|
||||||
if (sample->ObjectLink.next != NULL)
|
if (sample->Link.next != NULL)
|
||||||
ObjectAllocator_FreeRange(allocator, sample, last_link, nb_cleared_samples);
|
ObjectAllocator_FreeRange(allocator, sample, last_link, nb_cleared_samples);
|
||||||
else
|
else
|
||||||
ObjectAllocator_Free(allocator, sample);
|
ObjectAllocator_Free(allocator, sample);
|
||||||
|
@ -4272,18 +4270,18 @@ static void Remotery_DestroyThreadSamplers(Remotery* rmt)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void* CRTMalloc(void* mm_context, rmtU32 size)
|
static void* CRTMalloc(void* /*mm_context*/, rmtU32 size)
|
||||||
{
|
{
|
||||||
return malloc((size_t)size);
|
return malloc((size_t)size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void CRTFree(void* mm_context, void* ptr)
|
static void CRTFree(void* /*mm_context*/, void* ptr)
|
||||||
{
|
{
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void* CRTRealloc(void* mm_context, void* ptr, rmtU32 size)
|
static void* CRTRealloc(void* /*mm_context*/, void* ptr, rmtU32 size)
|
||||||
{
|
{
|
||||||
return realloc(ptr, size);
|
return realloc(ptr, size);
|
||||||
}
|
}
|
||||||
|
@ -4361,6 +4359,7 @@ RMT_API Remotery* _rmt_GetGlobalInstance(void)
|
||||||
|
|
||||||
static void SetDebuggerThreadName(const char* name)
|
static void SetDebuggerThreadName(const char* name)
|
||||||
{
|
{
|
||||||
|
RMT_UNREFERENCED_PARAMETER(name);
|
||||||
#ifdef RMT_PLATFORM_WINDOWS
|
#ifdef RMT_PLATFORM_WINDOWS
|
||||||
THREADNAME_INFO info;
|
THREADNAME_INFO info;
|
||||||
info.dwType = 0x1000;
|
info.dwType = 0x1000;
|
||||||
|
@ -4926,7 +4925,7 @@ static void D3D11_Destructor(D3D11* d3d11)
|
||||||
typedef struct D3D11Timestamp
|
typedef struct D3D11Timestamp
|
||||||
{
|
{
|
||||||
// Inherit so that timestamps can be quickly allocated
|
// Inherit so that timestamps can be quickly allocated
|
||||||
ObjectLink ObjectLink;
|
ObjectLink Link;
|
||||||
|
|
||||||
// Pair of timestamp queries that wrap the sample
|
// Pair of timestamp queries that wrap the sample
|
||||||
ID3D11Query* query_start;
|
ID3D11Query* query_start;
|
||||||
|
@ -5481,7 +5480,7 @@ static void OpenGL_Destructor(OpenGL* opengl)
|
||||||
typedef struct OpenGLTimestamp
|
typedef struct OpenGLTimestamp
|
||||||
{
|
{
|
||||||
// Inherit so that timestamps can be quickly allocated
|
// Inherit so that timestamps can be quickly allocated
|
||||||
ObjectLink ObjectLink;
|
ObjectLink Link;
|
||||||
|
|
||||||
// Pair of timestamp queries that wrap the sample
|
// Pair of timestamp queries that wrap the sample
|
||||||
GLuint queries[2];
|
GLuint queries[2];
|
||||||
|
|
2
3rdparty/remotery/lib/Remotery.h
vendored
2
3rdparty/remotery/lib/Remotery.h
vendored
|
@ -43,7 +43,7 @@ documented just below this comment.
|
||||||
|
|
||||||
|
|
||||||
// Disable this to not include any bits of Remotery in your build
|
// Disable this to not include any bits of Remotery in your build
|
||||||
#define RMT_ENABLED
|
//#define RMT_ENABLED
|
||||||
|
|
||||||
// Used by the Celtoys TinyCRT library (not released yet)
|
// Used by the Celtoys TinyCRT library (not released yet)
|
||||||
//#define RMT_USE_TINYCRT
|
//#define RMT_USE_TINYCRT
|
||||||
|
|
|
@ -17,6 +17,12 @@
|
||||||
#include "cmd.h"
|
#include "cmd.h"
|
||||||
#include "input.h"
|
#include "input.h"
|
||||||
|
|
||||||
|
#if ENTRY_CONFIG_PROFILER
|
||||||
|
# define RMT_ENABLED
|
||||||
|
#endif // ENTRY_CONFIG_PROFILER
|
||||||
|
|
||||||
|
#include <remotery/lib/Remotery.c>
|
||||||
|
|
||||||
extern "C" int _main_(int _argc, char** _argv);
|
extern "C" int _main_(int _argc, char** _argv);
|
||||||
|
|
||||||
namespace entry
|
namespace entry
|
||||||
|
@ -24,6 +30,9 @@ namespace entry
|
||||||
static uint32_t s_debug = BGFX_DEBUG_NONE;
|
static uint32_t s_debug = BGFX_DEBUG_NONE;
|
||||||
static uint32_t s_reset = BGFX_RESET_NONE;
|
static uint32_t s_reset = BGFX_RESET_NONE;
|
||||||
static bool s_exit = false;
|
static bool s_exit = false;
|
||||||
|
|
||||||
|
static Remotery* s_rmt = NULL;
|
||||||
|
|
||||||
static bx::FileReaderI* s_fileReader = NULL;
|
static bx::FileReaderI* s_fileReader = NULL;
|
||||||
static bx::FileWriterI* s_fileWriter = NULL;
|
static bx::FileWriterI* s_fileWriter = NULL;
|
||||||
|
|
||||||
|
@ -338,6 +347,15 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
{
|
{
|
||||||
//DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME);
|
//DBG(BX_COMPILER_NAME " / " BX_CPU_NAME " / " BX_ARCH_NAME " / " BX_PLATFORM_NAME);
|
||||||
|
|
||||||
|
if (BX_ENABLED(ENTRY_CONFIG_PROFILER) )
|
||||||
|
{
|
||||||
|
// rmtSettings* settings = rmt_Settings();
|
||||||
|
if (RMT_ERROR_NONE != rmt_CreateGlobalInstance(&s_rmt) )
|
||||||
|
{
|
||||||
|
s_rmt = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if BX_CONFIG_CRT_FILE_READER_WRITER
|
#if BX_CONFIG_CRT_FILE_READER_WRITER
|
||||||
s_fileReader = new bx::CrtFileReader;
|
s_fileReader = new bx::CrtFileReader;
|
||||||
s_fileWriter = new bx::CrtFileWriter;
|
s_fileWriter = new bx::CrtFileWriter;
|
||||||
|
@ -370,6 +388,12 @@ BX_PRAGMA_DIAGNOSTIC_POP();
|
||||||
s_fileWriter = NULL;
|
s_fileWriter = NULL;
|
||||||
#endif // BX_CONFIG_CRT_FILE_READER_WRITER
|
#endif // BX_CONFIG_CRT_FILE_READER_WRITER
|
||||||
|
|
||||||
|
if (BX_ENABLED(ENTRY_CONFIG_PROFILER)
|
||||||
|
&& NULL != s_rmt)
|
||||||
|
{
|
||||||
|
rmt_DestroyGlobalInstance(s_rmt);
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,10 @@
|
||||||
# define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1
|
# define ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR 1
|
||||||
#endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
|
#endif // ENTRY_CONFIG_IMPLEMENT_DEFAULT_ALLOCATOR
|
||||||
|
|
||||||
|
#ifndef ENTRY_CONFIG_PROFILER
|
||||||
|
# define ENTRY_CONFIG_PROFILER 0
|
||||||
|
#endif // ENTRY_CONFIG_PROFILER
|
||||||
|
|
||||||
#define ENTRY_IMPLEMENT_EVENT(_class, _type) \
|
#define ENTRY_IMPLEMENT_EVENT(_class, _type) \
|
||||||
_class(WindowHandle _handle) : Event(_type, _handle) {}
|
_class(WindowHandle _handle) : Event(_type, _handle) {}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue