Skip to content

Instantly share code, notes, and snippets.

View stoyannk's full-sized avatar

Stoyan Nikolov stoyannk

View GitHub Profile
#include "stdafx.h"
#include <unordered_set>
#include <memory>
#include <chrono>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <sparsehash/dense_hash_set>
@stoyannk
stoyannk / Consumer interface
Created August 11, 2012 09:43
SPSQ_Consumer.cpp
void* Consume(size_t& size);
@stoyannk
stoyannk / Producer interface
Created August 11, 2012 09:41
SPSC_Producer.cpp
void* RequestNode(size_t sz);
void* EnqueueMore(size_t sz);
void CommitNode();
@stoyannk
stoyannk / SPSC_Interface.cpp
Created August 11, 2012 10:13
High level implementation
// This is an idealized pseudo-implementation. Details are omitted for clarity
SMDataQueueBase::SMDataQueueBase(bool initializeMemory)
{
CreateSharedMemoryRegion();
if(initializeMemory)
{
new(m_SharedData) SharedData;
// Allocate an empty node
m_SharedData->m_Head = *AllocateNode(sizeof(size_t));
@stoyannk
stoyannk / AllocateFirstNodeOnPage.cpp
Created August 25, 2012 13:17
AllocateFirstNodeOnPage
SMDataQueueBase::Node* SMDataQueueBase::AllocateFirstNodeOnPage(size_t size)
{
if(m_FreePages.empty())
{
// garbage collect
m_UsedPages.erase(std::remove_if(m_UsedPages.begin(), m_UsedPages.end(), [this](unsigned pageId) -> bool
{
const bool isFree = m_Pages[pageId]->NodesOwned == 0;
if (isFree)
{
@stoyannk
stoyannk / GBuffer_PS.hlsl
Created October 18, 2012 12:53
Simple enhanced gbuffer pixel shader
polymorphic MakeDepth
{
CalculateProjectionDepth
}
polymorphic GetWorldNormal
{
NormalFromInput,
NormalFromMap
}
@stoyannk
stoyannk / GBuffer_PS_translated.hlsl
Created October 18, 2012 12:57
Translated gbuffer PS
//texture inputs
Texture2D map_normal : register(t0);
SamplerState sampler_point : register(s0);
//sampler inputs
//input
struct PS_INPUT {
float4 Position : SV_POSITION;
float3 binormal : TEXCOORD0;
float3 normal_o : TEXCOORD1;
float3 normal_t : TEXCOORD2;
@stoyannk
stoyannk / atoms.hlsl
Created October 18, 2012 13:06
Simple atoms
atom NORMAL_W NormalFromInput(interface context) needs NORMAL_O
{
return mul(context.normal_o, World);
}
atom NORMAL_W NormalFromMap(interface context) needs NORMAL_O, UV, TBN, MAP_NORMAL, SAMPLER_POINT
{
float3 normal = map_normal.Sample(sampler_point, context.uv);
normal = mul(normal, context.tbn);
normal = normalize(context.normal_o + normal);
@stoyannk
stoyannk / semantics.hlsl
Created October 18, 2012 13:09
Sample semantics
void VOID : void;
float3x3 TBN : TEXCOORD;
float3 NORMAL_T : NORMAL;
float3 NORMAL_O : NORMAL;
float3 NORMAL_W : NORMAL;
float3 TANGENT : TANGENT;
float3 BINORMAL : BINORMAL;
@stoyannk
stoyannk / concretizers.hlsl
Created October 18, 2012 13:24
Sample conretizer
concretizer TBN ComputeTBN(interface context) needs TANGENT, BINORMAL, NORMAL_T
{
return float3x3(context.tangent, context.binormal, context.normal_t);
}