Browse Source

directx buffer alloc/free

Nicolas Cannasse 8 years ago
parent
commit
d3ae2fee0c
3 changed files with 111 additions and 8 deletions
  1. 41 2
      libs/directx/directx.cpp
  2. 6 6
      libs/directx/directx.vcxproj
  3. 64 0
      libs/directx/dx/Buffer.hx

+ 41 - 2
libs/directx/directx.cpp

@@ -4,7 +4,7 @@
 #include <dxgi.h>
 #include <d3dcommon.h>
 #include <d3d11.h>
-#include <DirectXMath.h>
+#include <D3Dcompiler.h>
 
 #define INIT_ERROR __LINE__
 #define CHECK(call) if( (call) != S_OK ) return INIT_ERROR
@@ -18,6 +18,8 @@ typedef struct {
 	int init_flags;
 } dx_driver;
 
+typedef ID3D11Buffer dx_buffer;
+
 static dx_driver *driver = NULL;
 static IDXGIFactory *factory = NULL;
 
@@ -110,11 +112,48 @@ HL_PRIM double HL_NAME(dx_get_supported_version)() {
 	return (driver->feature >> 12) + ((driver->feature & 0xFFF) / 2560.);
 }
 
+HL_PRIM dx_buffer *HL_NAME(dx_create_buffer)( int size, int usage, int bind, int access, int misc, int stride, vbyte *data ) {
+	ID3D11Buffer *buffer;
+	D3D11_BUFFER_DESC desc;
+	D3D11_SUBRESOURCE_DATA res;
+	desc.ByteWidth = size;
+	desc.Usage = (D3D11_USAGE)usage;
+	desc.BindFlags = bind;
+	desc.CPUAccessFlags = access;
+	desc.MiscFlags = misc;
+	desc.StructureByteStride = stride;
+	res.pSysMem = data;
+	res.SysMemPitch = 0;
+	res.SysMemSlicePitch = 0;
+	if( driver->device->CreateBuffer(&desc,data?&res:NULL,&buffer) != S_OK )
+		return NULL;
+	return buffer;
+}
+
+HL_PRIM void HL_NAME(dx_release_buffer)( dx_buffer *b ) {
+	b->Release();
+}
+
+HL_PRIM vbyte *HL_NAME(dx_compile_shader)( vbyte *data, int dataSize, char *source, char *target, int flags, bool *error, int *size ) {
+	ID3DBlob *code;
+	ID3DBlob *errorMessage;
+	if( D3DCompile(data,dataSize,source,NULL,NULL,NULL,target,flags,0,&code,&errorMessage) != S_OK ) {
+		*error = true;
+		code = errorMessage;
+	}
+	*size = code->GetBufferSize();
+	return hl_copy_bytes((vbyte*)code->GetBufferPointer(),*size);
+}
+
 #define _DRIVER _ABSTRACT(dx_driver)
+#define _BUFFER _ABSTRACT(dx_buffer)
 DEFINE_PRIM(_DRIVER, dx_create, _ABSTRACT(dx_window) _I32);
 DEFINE_PRIM(_VOID, dx_clear_color, _F64 _F64 _F64 _F64);
 DEFINE_PRIM(_VOID, dx_present, _NO_ARG);
 DEFINE_PRIM(_I32, dx_get_screen_width, _NO_ARG);
 DEFINE_PRIM(_I32, dx_get_screen_height, _NO_ARG);
 DEFINE_PRIM(_BYTES, dx_get_device_name, _NO_ARG);
-DEFINE_PRIM(_F64, dx_get_supported_version, _NO_ARG);
+DEFINE_PRIM(_F64, dx_get_supported_version, _NO_ARG);
+DEFINE_PRIM(_BUFFER, dx_create_buffer, _I32 _I32 _I32 _I32 _I32 _I32 _BYTES);
+DEFINE_PRIM(_VOID, dx_release_buffer, _BUFFER);
+DEFINE_PRIM(_BYTES, dx_compile_shader, _BYTES _I32 _BYTES _BYTES _I32 _REF(_BOOL) _REF(_I32));

+ 6 - 6
libs/directx/directx.vcxproj

@@ -149,7 +149,7 @@
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
@@ -163,7 +163,7 @@
     <Link>
       <SubSystem>Windows</SubSystem>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -182,7 +182,7 @@
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|Win32'">
@@ -201,7 +201,7 @@
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OutputFile>../../$(Configuration)/$(TargetName).hdll</OutputFile>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
@@ -219,7 +219,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseVS2013|x64'">
@@ -237,7 +237,7 @@
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
       <OptimizeReferences>true</OptimizeReferences>
       <GenerateDebugInformation>true</GenerateDebugInformation>
-      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib</AdditionalDependencies>
+      <AdditionalDependencies>libhl.lib;user32.lib;gdi32.lib;d3d11.lib;dxgi.lib;d3dcompiler.lib</AdditionalDependencies>
     </Link>
   </ItemDefinitionGroup>
   <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

+ 64 - 0
libs/directx/dx/Buffer.hx

@@ -0,0 +1,64 @@
+package dx;
+
+@:enum abstract BufferUsage(Int) {
+	var Default = 0;
+	var Immutable = 1;
+	var Dynamic = 2;
+	var Staging = 3;
+}
+
+@:enum abstract BufferBind(Int) {
+	var VertexBuffer = 1;
+	var IndexBuffer = 2;
+	var ConstantBuffer = 4;
+	var ShaderResource = 8;
+	var StreamOuput = 16;
+	var RenderTarget = 32;
+	var DepthStencil = 64;
+	var UnorderedAccess = 128;
+	var Decoder = 512;
+	var VideoDecoder = 1024;
+	@:op(a | b) static function or(a:BufferBind, b:BufferBind) : BufferBind;
+}
+
+@:enum abstract BufferAccess(Int) {
+	var None = 0;
+	var CpuWrite = 0x10000;
+	var CpuRead = 0x20000;
+	@:op(a | b) static function or(a:BufferAccess, b:BufferAccess) : BufferAccess;
+}
+
+@:enum abstract BufferMisc(Int) {
+	var None = 0;
+	var GenerateMips = 1;
+	var Shared = 2;
+	var TextureCube = 4;
+	var DrawIndirectArgs = 0x10;
+	var BufferAllowRawView = 0x20;
+	var BufferStructured = 0x40;
+	var ResourceClamp = 0x80;
+	var SharedKeyedMutex = 0x100;
+	var GdiCompatible = 0x200;
+	var SharedNTHandle = 0x800;
+	var RestrictedContent = 0x1000;
+	var RestrictSharedResource = 0x2000;
+	var RestrictSharedResourceDriver = 0x4000;
+	var Guarded = 0x8000;
+	var TilePool = 0x20000;
+	var Tiled = 0x40000;
+	var HWProtected = 0x80000;
+	@:op(a | b) static function or(a:BufferMisc, b:BufferMisc) : BufferMisc;
+}
+
+abstract Buffer(hl.Abstract<"dx_buffer">) {
+
+	@:hlNative("directx","dx_create_buffer")
+	public static function alloc( size : Int, usage : BufferUsage, bind : BufferBind, access : BufferAccess, misc : BufferMisc, stride : Int, data : hl.Bytes ) : Buffer {
+		return null;
+	}
+
+	@:hlNative("directx", "dx_release_buffer")
+	public function release() {
+	}
+
+}