-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
- Loading branch information
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,23 +1,51 @@ | ||
[Ll]ibrary/ | ||
[Tt]emp/ | ||
[Oo]bj/ | ||
[Bb]uild/ | ||
/[Ll]ibrary/ | ||
/[Tt]emp/ | ||
/[Oo]bj/ | ||
/[Bb]uild/ | ||
/[Bb]uilds/ | ||
/Assets/AssetStoreTools* | ||
|
||
UnityVS/ | ||
UnityVS.meta | ||
UnityVS.Aries.sln.DotSettings | ||
# Visual Studio 2015 cache directory | ||
/.vs/ | ||
|
||
# Autogenerated VS/MD solution and project files | ||
# Autogenerated VS/MD/Consulo solution and project files | ||
ExportedObj/ | ||
.consulo/ | ||
*.csproj | ||
*.unityproj | ||
*.sln | ||
*.suo | ||
*.tmp | ||
*.user | ||
*.userprefs | ||
*.pidb | ||
*.booproj | ||
*.pdb | ||
|
||
#Unity3D Generated File On Crash Reports | ||
# Unity3D generated meta files | ||
*.pidb.meta | ||
|
||
# Unity3D Generated File On Crash Reports | ||
sysinfo.txt | ||
<<<<<<< HEAD | ||
*.db | ||
*.opendb | ||
======= | ||
|
||
# Builds | ||
*.apk | ||
*.unitypackage | ||
|
||
#Mac | ||
*.DS_Store | ||
|
||
# Unity3D Generated File On Crash Reports | ||
sysinfo.txt | ||
|
||
# vim | ||
*~ | ||
*.swp | ||
|
||
#UnityVS | ||
Assets/Packages/UnityVS* | ||
>>>>>>> develop/reflesh |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
fileFormatVersion: 2 | ||
guid: fbcea5ef9f155a043b513572b8bf17b9 | ||
folderAsset: yes | ||
timeCreated: 1502163960 | ||
licenseType: Pro | ||
DefaultImporter: | ||
userData: | ||
assetBundleName: | ||
assetBundleVariant: |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
fileFormatVersion: 2 | ||
guid: fbcea5ef9f155a043b513572b8bf17b9 | ||
folderAsset: yes | ||
timeCreated: 1502163960 | ||
licenseType: Pro | ||
DefaultImporter: | ||
externalObjects: {} | ||
userData: | ||
assetBundleName: | ||
assetBundleVariant: |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
using UnityEngine; | ||
|
||
namespace Sorting.BitonicSort | ||
{ | ||
|
||
public class BitonicSort | ||
{ | ||
|
||
protected static readonly uint BITONIC_BLOCK_SIZE = 512; | ||
protected static readonly uint TRANSPOSE_BLOCK_SIZE = 16; | ||
|
||
protected ComputeShader BitonicCS; | ||
|
||
int numElements; | ||
|
||
public BitonicSort(int numElements) | ||
{ | ||
this.BitonicCS = (ComputeShader)Resources.Load("BitonicSortCS"); | ||
this.numElements = numElements; | ||
} | ||
|
||
public void Sort(ref ComputeBuffer inBuffer, ref ComputeBuffer tempBuffer) | ||
{ | ||
ComputeShader sortCS = BitonicCS; | ||
|
||
int KERNEL_ID_BITONICSORT = sortCS.FindKernel("BitonicSort"); | ||
int KERNEL_ID_TRANSPOSE = sortCS.FindKernel("MatrixTranspose"); | ||
|
||
uint NUM_ELEMENTS = (uint)numElements; | ||
uint MATRIX_WIDTH = BITONIC_BLOCK_SIZE; | ||
uint MATRIX_HEIGHT = (uint)NUM_ELEMENTS / BITONIC_BLOCK_SIZE; | ||
|
||
for (uint level = 2; level <= BITONIC_BLOCK_SIZE; level <<= 1) | ||
{ | ||
SetGPUSortConstants(sortCS, level, level, MATRIX_HEIGHT, MATRIX_WIDTH); | ||
|
||
// Sort the row data | ||
sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", inBuffer); | ||
sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1); | ||
} | ||
|
||
// Then sort the rows and columns for the levels > than the block size | ||
// Transpose. Sort the Columns. Transpose. Sort the Rows. | ||
for (uint level = (BITONIC_BLOCK_SIZE << 1); level <= NUM_ELEMENTS; level <<= 1) | ||
{ | ||
// Transpose the data from buffer 1 into buffer 2 | ||
SetGPUSortConstants(sortCS, level / BITONIC_BLOCK_SIZE, (level & ~NUM_ELEMENTS) / BITONIC_BLOCK_SIZE, MATRIX_WIDTH, MATRIX_HEIGHT); | ||
sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Input", inBuffer); | ||
sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Data", tempBuffer); | ||
sortCS.Dispatch(KERNEL_ID_TRANSPOSE, (int)(MATRIX_WIDTH / TRANSPOSE_BLOCK_SIZE), (int)(MATRIX_HEIGHT / TRANSPOSE_BLOCK_SIZE), 1); | ||
|
||
// Sort the transposed column data | ||
sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", tempBuffer); | ||
sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1); | ||
|
||
// Transpose the data from buffer 2 back into buffer 1 | ||
SetGPUSortConstants(sortCS, BITONIC_BLOCK_SIZE, level, MATRIX_HEIGHT, MATRIX_WIDTH); | ||
sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Input", tempBuffer); | ||
sortCS.SetBuffer(KERNEL_ID_TRANSPOSE, "Data", inBuffer); | ||
sortCS.Dispatch(KERNEL_ID_TRANSPOSE, (int)(MATRIX_HEIGHT / TRANSPOSE_BLOCK_SIZE), (int)(MATRIX_WIDTH / TRANSPOSE_BLOCK_SIZE), 1); | ||
|
||
// Sort the row data | ||
sortCS.SetBuffer(KERNEL_ID_BITONICSORT, "Data", inBuffer); | ||
sortCS.Dispatch(KERNEL_ID_BITONICSORT, (int)(NUM_ELEMENTS / BITONIC_BLOCK_SIZE), 1, 1); | ||
} | ||
} | ||
|
||
void SetGPUSortConstants(ComputeShader cs, uint level, uint levelMask, uint width, uint height) | ||
{ | ||
cs.SetInt("_Level", (int)level); | ||
cs.SetInt("_LevelMask", (int)levelMask); | ||
cs.SetInt("_Width", (int)width); | ||
cs.SetInt("_Height", (int)height); | ||
} | ||
|
||
} | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
#pragma kernel BitonicSort | ||
#pragma kernel MatrixTranspose | ||
|
||
#define BITONIC_BLOCK_SIZE 512 | ||
#define TRANSPOSE_BLOCK_SIZE 16 | ||
|
||
cbuffer cb | ||
{ | ||
uint _Level; | ||
uint _LevelMask; | ||
uint _Width; | ||
uint _Height; | ||
}; | ||
|
||
StructuredBuffer <uint2> Input : register(t0); | ||
RWStructuredBuffer<uint2> Data : register(u0); | ||
|
||
groupshared uint2 shared_data[BITONIC_BLOCK_SIZE]; | ||
|
||
bool Compare(uint2 left, uint2 right) { | ||
return (left.x == right.x) ? (left.y <= right.y) : (left.x <= right.x); | ||
// return left.x <= right.x; | ||
} | ||
|
||
[numthreads(BITONIC_BLOCK_SIZE, 1, 1)] | ||
void BitonicSort(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex) { | ||
// Load shared data | ||
shared_data[GI] = Data[DTid.x]; | ||
GroupMemoryBarrierWithGroupSync(); | ||
|
||
// Sort the shared data | ||
for (uint j = _Level >> 1; j > 0; j >>= 1) { | ||
uint2 result = (Compare(shared_data[GI & ~j], shared_data[GI | j]) == (bool)(_LevelMask & DTid.x)) ? shared_data[GI ^ j] : shared_data[GI]; | ||
GroupMemoryBarrierWithGroupSync(); | ||
shared_data[GI] = result; | ||
GroupMemoryBarrierWithGroupSync(); | ||
} | ||
|
||
// Store shared data | ||
Data[DTid.x] = shared_data[GI]; | ||
} | ||
|
||
|
||
groupshared uint2 transpose_shared_data[TRANSPOSE_BLOCK_SIZE * TRANSPOSE_BLOCK_SIZE]; | ||
|
||
[numthreads(TRANSPOSE_BLOCK_SIZE, TRANSPOSE_BLOCK_SIZE, 1)] | ||
void MatrixTranspose(uint3 Gid : SV_GroupID, uint3 DTid : SV_DispatchThreadID, uint3 GTid : SV_GroupThreadID, uint GI : SV_GroupIndex) { | ||
transpose_shared_data[GI] = Input[DTid.y * _Width + DTid.x]; | ||
GroupMemoryBarrierWithGroupSync(); | ||
uint2 XY = DTid.yx - GTid.yx + GTid.xy; | ||
Data[XY.y * _Height + XY.x] = transpose_shared_data[GTid.x * TRANSPOSE_BLOCK_SIZE + GTid.y]; | ||
} |
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
using UnityEngine; | ||
using System.Runtime.InteropServices; | ||
|
||
namespace NearestNeighbor { | ||
public class GridOptimizer2D<T> : GridOptimizerBase where T : struct { | ||
|
||
private Vector2 gridDim; | ||
|
||
public GridOptimizer2D(int numObjects, Vector2 range, Vector2 dimension) : base(numObjects) { | ||
this.gridDim = dimension; | ||
this.numGrid = (int)(dimension.x * dimension.y); | ||
this.gridH = range.x / gridDim.x; | ||
|
||
this.GridSortCS = (ComputeShader)Resources.Load("GridSort2D"); | ||
|
||
InitializeBuffer(); | ||
|
||
Debug.Log("=== Instantiated Grid Sort === \nRange : " + range + "\nNumGrid : " + numGrid + "\nGridDim : " + gridDim + "\nGridH : " + gridH); | ||
} | ||
|
||
protected override void InitializeBuffer() { | ||
gridBuffer = new ComputeBuffer(numObjects, Marshal.SizeOf(typeof(Uint2))); | ||
gridPingPongBuffer = new ComputeBuffer(numObjects, Marshal.SizeOf(typeof(Uint2))); | ||
gridIndicesBuffer = new ComputeBuffer(numGrid, Marshal.SizeOf(typeof(Uint2))); | ||
sortedObjectsBufferOutput = new ComputeBuffer(numObjects, Marshal.SizeOf(typeof(T))); | ||
} | ||
|
||
protected override void SetCSVariables() { | ||
GridSortCS.SetVector("_GridDim", gridDim); | ||
GridSortCS.SetFloat("_GridH", gridH); | ||
} | ||
|
||
} | ||
} |