Started making sure that the DLL is truly platform agnostic. Only thing left seems to be math.h for things like trig functions, and windows.h purely for interlockedincrement and interlockedadd

This commit is contained in:
Peter Slattery 2020-02-04 23:16:41 -08:00
parent 51955ba765
commit 460c08d169
8 changed files with 45 additions and 48 deletions

View File

@ -9,7 +9,7 @@ IF NOT EXIST .\build\ mkdir .\build
C:\programs\ctime\ctime.exe -begin %ProjectDevPath%\build\win32_foldhaus_build_time.ctm C:\programs\ctime\ctime.exe -begin %ProjectDevPath%\build\win32_foldhaus_build_time.ctm
set CommonCompilerFlags=-nologo -DDEBUG=1 -DPLATFORM_WINDOWS -FC -WX -W4 -Z7 -Oi -GR- -EHsc -EHa- -MTd -fp:fast -fp:except- -IC:\programs-dev\gs_libs\src set CommonCompilerFlags=-nologo -DDEBUG=1 -DPLATFORM_WINDOWS -FC -WX -W4 -Z7 -Oi -GR- -EHsc -EHa- -MTd -fp:fast -fp:except-
set CommonCompilerFlags=-wd4127 -wd4702 -wd4101 -wd4505 -wd4100 -wd4189 -wd4244 -wd4201 -wd4996 -I%CommonLibs% -O2 %CommonCompilerFlags% set CommonCompilerFlags=-wd4127 -wd4702 -wd4101 -wd4505 -wd4100 -wd4189 -wd4244 -wd4201 -wd4996 -I%CommonLibs% -O2 %CommonCompilerFlags%
set CommonLinkerFlags= -opt:ref set CommonLinkerFlags= -opt:ref

View File

@ -107,7 +107,7 @@ struct platform_network_address
typedef s32 platform_socket_handle; typedef s32 platform_socket_handle;
typedef s32 platform_network_address_handle; typedef s32 platform_network_address_handle;
#define PLATFORM_GET_SOCKET_HANDLE(name) platform_socket_handle name(s32 AddressFamily, s32 Type, s32 Protocol) #define PLATFORM_GET_SOCKET_HANDLE(name) platform_socket_handle name(s32 Multicast_TimeToLive)
typedef PLATFORM_GET_SOCKET_HANDLE(platform_get_socket_handle); typedef PLATFORM_GET_SOCKET_HANDLE(platform_get_socket_handle);
#define PLATFORM_GET_SEND_ADDRESS_HANDLE(name) platform_network_address_handle name(s32 AddressFamily, u16 Port, u32 Address) #define PLATFORM_GET_SEND_ADDRESS_HANDLE(name) platform_network_address_handle name(s32 AddressFamily, u16 Port, u32 Address)
@ -116,7 +116,7 @@ typedef PLATFORM_GET_SEND_ADDRESS_HANDLE(platform_get_send_address);
#define PLATFORM_SET_SOCKET_OPTION(name) s32 name(platform_socket_handle SocketHandle, s32 Level, s32 Option, const char* OptionValue, s32 OptionLength) #define PLATFORM_SET_SOCKET_OPTION(name) s32 name(platform_socket_handle SocketHandle, s32 Level, s32 Option, const char* OptionValue, s32 OptionLength)
typedef PLATFORM_SET_SOCKET_OPTION(platform_set_socket_option); typedef PLATFORM_SET_SOCKET_OPTION(platform_set_socket_option);
#define PLATFORM_SEND_TO(name) s32 name(platform_socket_handle SocketHandle, platform_network_address Address, const char* Buffer, s32 BufferLength, s32 Flags) #define PLATFORM_SEND_TO(name) s32 name(platform_socket_handle SocketHandle, u32 Address, u32 Port, const char* Buffer, s32 BufferLength, s32 Flags)
typedef PLATFORM_SEND_TO(platform_send_to); typedef PLATFORM_SEND_TO(platform_send_to);
#define PLATFORM_CLOSE_SOCKET(name) void name(platform_socket_handle SocketHandle) #define PLATFORM_CLOSE_SOCKET(name) void name(platform_socket_handle SocketHandle)

View File

@ -48,21 +48,15 @@ SACNSendDMXBufferListJob (s32 ThreadID, void* JobData)
send_sacn_job_data* Data = (send_sacn_job_data*)JobData; send_sacn_job_data* Data = (send_sacn_job_data*)JobData;
platform_socket_handle SendSocket = Data->SendSocket; platform_socket_handle SendSocket = Data->SendSocket;
platform_send_to* SendTo = Data->SendTo;
dmx_buffer_list* DMXBufferAt = Data->DMXBuffers; dmx_buffer_list* DMXBufferAt = Data->DMXBuffers;
while (DMXBufferAt) while (DMXBufferAt)
{ {
dmx_buffer Buffer = DMXBufferAt->Buffer; dmx_buffer Buffer = DMXBufferAt->Buffer;
u_long V4SendAddress = SACNGetUniverseSendAddress(Buffer.Universe); u32 V4SendAddress = SACNGetUniverseSendAddress(Buffer.Universe);
platform_network_address SendAddress = {}; Data->SendTo(SendSocket, V4SendAddress, DEFAULT_STREAMING_ACN_PORT, (const char*)Buffer.Base, Buffer.TotalSize, 0);
SendAddress.Family = AF_INET;
SendAddress.Port = DEFAULT_STREAMING_ACN_PORT;
SendAddress.Address = V4SendAddress;
SendTo(SendSocket, SendAddress, (const char*)Buffer.Base, Buffer.TotalSize, 0);
DMXBufferAt = DMXBufferAt->Next; DMXBufferAt = DMXBufferAt->Next;
} }
@ -75,8 +69,6 @@ RELOAD_STATIC_DATA(ReloadStaticData)
app_state* State = (app_state*)Context.MemoryBase; app_state* State = (app_state*)Context.MemoryBase;
GlobalDebugServices = DebugServices; GlobalDebugServices = DebugServices;
GSAlloc = Alloc;
GSFree = Free;
} }
INITIALIZE_APPLICATION(InitializeApplication) INITIALIZE_APPLICATION(InitializeApplication)

View File

@ -122,7 +122,6 @@ UpdateSortedNodes(pattern_node_workspace* Workspace, memory_arena* Scratch)
} }
NullTerminate(&OutputString); NullTerminate(&OutputString);
OutputDebugStringA(OutputCharArray);
// This is a contiguous array. // This is a contiguous array.
b8* NodesVisited = PushArray(Scratch, b8, NodeCount); b8* NodesVisited = PushArray(Scratch, b8, NodeCount);
GSZeroArray(NodesVisited, b8, NodeCount); GSZeroArray(NodesVisited, b8, NodeCount);

View File

@ -6,7 +6,6 @@
#ifndef FOLDHAUS_PLATFORM_H #ifndef FOLDHAUS_PLATFORM_H
#include <windows.h> #include <windows.h>
#include <stdio.h>
#define GS_LANGUAGE_NO_PROFILER_DEFINES #define GS_LANGUAGE_NO_PROFILER_DEFINES
#include "..\gs_libs\gs_language.h" #include "..\gs_libs\gs_language.h"
@ -20,18 +19,13 @@
#include "..\gs_libs\gs_memory_arena.h" #include "..\gs_libs\gs_memory_arena.h"
#include "..\gs_libs\gs_string.h" #include "..\gs_libs\gs_string.h"
#include "foldhaus_debug.h"
#include "foldhaus_debug.h"
global_variable debug_services* GlobalDebugServices; global_variable debug_services* GlobalDebugServices;
global_variable platform_alloc* GSAlloc;
global_variable platform_free* GSFree;
#include "..\gs_libs\gs_vector_matrix.h" #include "..\gs_libs\gs_vector_matrix.h"
#include "..\gs_libs\gs_input.h" #include "..\gs_libs\gs_input.h"
#include "foldhaus_renderer.h" #include "foldhaus_renderer.h"
typedef struct context context; typedef struct context context;
@ -101,7 +95,7 @@ struct worker_thread_job
struct work_queue struct work_queue
{ {
HANDLE SemaphoreHandle; void* SemaphoreHandle;
u32 JobsMax; u32 JobsMax;
u32 volatile JobsCount; u32 volatile JobsCount;

View File

@ -215,7 +215,7 @@ InitStreamHeader (u8* Buffer, s32 BufferSize,
Cursor = PackB2(Cursor, RLP_PREAMBLE_SIZE); Cursor = PackB2(Cursor, RLP_PREAMBLE_SIZE);
Cursor = PackB2(Cursor, RLP_POSTAMBLE_SIZE); Cursor = PackB2(Cursor, RLP_POSTAMBLE_SIZE);
memcpy(Cursor, ACN_IDENTIFIER, ACN_IDENTIFIER_SIZE); GSMemCopy(ACN_IDENTIFIER, Cursor, ACN_IDENTIFIER_SIZE);
Cursor += ACN_IDENTIFIER_SIZE; Cursor += ACN_IDENTIFIER_SIZE;
// TODO(Peter): If you never use this anywhere else, go back and remove the parameters // TODO(Peter): If you never use this anywhere else, go back and remove the parameters
@ -242,7 +242,8 @@ InitStreamHeader (u8* Buffer, s32 BufferSize,
Cursor = PackB4(Cursor, FRAMING_VECTOR); Cursor = PackB4(Cursor, FRAMING_VECTOR);
// framing source name // framing source name
strncpy((char*)Cursor, SourceName, SOURCE_NAME_SIZE); // :Check
GSMemCopy(SourceName, (char*)Cursor, SOURCE_NAME_SIZE);
Cursor[SOURCE_NAME_SIZE - 1] = '\0'; Cursor[SOURCE_NAME_SIZE - 1] = '\0';
Cursor += SOURCE_NAME_SIZE; Cursor += SOURCE_NAME_SIZE;
@ -295,10 +296,8 @@ InitializeSACN ( context Context)
{ {
streaming_acn SACN = {}; streaming_acn SACN = {};
SACN.SendSocket = Context.PlatformGetSocketHandle(AF_INET, SOCK_DGRAM, 0); s32 Multicast_TimeToLive = 20;
int Multicast_TimeToLive = 20; SACN.SendSocket = Context.PlatformGetSocketHandle(Multicast_TimeToLive);
int Error = Context.PlatformSetSocketOption(SACN.SendSocket, IPPROTO_IP, IP_MULTICAST_TTL,
(const char*)(&Multicast_TimeToLive), sizeof(Multicast_TimeToLive));
SACN.CID = StringToCID_ ("{67F9D986-544E-4abb-8986-D5F79382586C}"); SACN.CID = StringToCID_ ("{67F9D986-544E-4abb-8986-D5F79382586C}");
return SACN; return SACN;
@ -331,7 +330,7 @@ SACNPrepareBufferHeader (s32 Universe, u8* Buffer, s32 BufferSize, s32 SizeReser
SetStreamHeaderSequence_(Buffer, SACN.SequenceIterator, false); SetStreamHeaderSequence_(Buffer, SACN.SequenceIterator, false);
} }
internal u_long internal u32
SACNGetUniverseSendAddress(s32 Universe) SACNGetUniverseSendAddress(s32 Universe)
{ {
u8 MulticastAddressBuffer[4] = {}; u8 MulticastAddressBuffer[4] = {};
@ -340,7 +339,7 @@ SACNGetUniverseSendAddress(s32 Universe)
MulticastAddressBuffer[2] = (u8)((Universe & 0xff00) >> 8); // high bit MulticastAddressBuffer[2] = (u8)((Universe & 0xff00) >> 8); // high bit
MulticastAddressBuffer[3] = (u8)((Universe & 0x00ff)); // low bit MulticastAddressBuffer[3] = (u8)((Universe & 0x00ff)); // low bit
u_long V4Address = (u_long)UpackB4(MulticastAddressBuffer); u32 V4Address = (u32)UpackB4(MulticastAddressBuffer);
return V4Address; return V4Address;
} }

View File

@ -138,8 +138,29 @@ s32 Win32SocketHandleMax;
s32 Win32SocketHandleCount; s32 Win32SocketHandleCount;
win32_socket* SocketValues; win32_socket* SocketValues;
PLATFORM_SET_SOCKET_OPTION(Win32SetSocketOption)
{
s32 SocketIndex = (s32)SocketHandle;
Assert(SocketIndex < Win32SocketHandleCount);
int Error = setsockopt(SocketValues[SocketIndex].Socket, Level, Option, OptionValue, OptionLength);
if (Error == SOCKET_ERROR)
{
Error = WSAGetLastError();
}
return Error;
}
PLATFORM_GET_SOCKET_HANDLE(Win32GetSocketHandle) PLATFORM_GET_SOCKET_HANDLE(Win32GetSocketHandle)
{ {
// NOTE(Peter): These used to be passed in as paramters, but we only use this function
// with AF_INET, SOCK_DGRAM, and Protocol = 0. These are also platform specific values
// so I was having to include windows.h in the platform agnostic code to accomodate that
// function signature.
s32 AddressFamily = AF_INET;
s32 Type = SOCK_DGRAM;
s32 Protocol = 0;
if (Win32SocketHandleCount >= Win32SocketHandleMax) if (Win32SocketHandleCount >= Win32SocketHandleMax)
{ {
s32 NewDictionaryMax = Win32SocketHandleMax + SOCKET_DICTIONARY_GROW_SIZE; s32 NewDictionaryMax = Win32SocketHandleMax + SOCKET_DICTIONARY_GROW_SIZE;
@ -163,31 +184,21 @@ PLATFORM_GET_SOCKET_HANDLE(Win32GetSocketHandle)
SocketValues[NewSocketIndex].Socket = socket(AddressFamily, Type, Protocol); SocketValues[NewSocketIndex].Socket = socket(AddressFamily, Type, Protocol);
int Error = Win32SetSocketOption(NewSocketIndex, IPPROTO_IP, IP_MULTICAST_TTL,
(const char*)(&Multicast_TimeToLive), sizeof(Multicast_TimeToLive));
return (platform_socket_handle)NewSocketIndex; return (platform_socket_handle)NewSocketIndex;
} }
PLATFORM_SET_SOCKET_OPTION(Win32SetSocketOption)
{
s32 SocketIndex = (s32)SocketHandle;
Assert(SocketIndex < Win32SocketHandleCount);
int Error = setsockopt(SocketValues[SocketIndex].Socket, Level, Option, OptionValue, OptionLength);
if (Error == SOCKET_ERROR)
{
Error = WSAGetLastError();
}
return Error;
}
PLATFORM_SEND_TO(Win32SendTo) PLATFORM_SEND_TO(Win32SendTo)
{ {
s32 SocketIndex = (s32)SocketHandle; s32 SocketIndex = (s32)SocketHandle;
Assert(SocketIndex < Win32SocketHandleCount); Assert(SocketIndex < Win32SocketHandleCount);
sockaddr_in SockAddress = {}; sockaddr_in SockAddress = {};
SockAddress.sin_family = Address.Family; SockAddress.sin_family = AF_INET;
SockAddress.sin_port = HostToNetU16(Address.Port); SockAddress.sin_port = HostToNetU16(Port);
SockAddress.sin_addr.s_addr = HostToNetU32(Address.Address); SockAddress.sin_addr.s_addr = HostToNetU32(Address);
s32 LengthSent = sendto(SocketValues[SocketIndex].Socket, Buffer, BufferLength, Flags, (sockaddr*)&SockAddress, sizeof(sockaddr_in)); s32 LengthSent = sendto(SocketValues[SocketIndex].Socket, Buffer, BufferLength, Flags, (sockaddr*)&SockAddress, sizeof(sockaddr_in));

View File

@ -8,8 +8,10 @@ Ground Up Reengineering
- panels metaprogramming - panels metaprogramming
- fix memory layout (remeber to profile before and after) - fix memory layout (remeber to profile before and after)
- Hot Code Reloading x Hot Code Reloading
- Fix it x Fix it
- Make the DLL truly platform agnostic
- File Loading - File Loading
- Gracefully handle File Not found - Gracefully handle File Not found