d3d11binding 0.0.0.4 → 0.0.0.5
raw patch · 14 files changed
+603/−28 lines, 14 filesnew-component:exe:RevolveCube
Files
- README.md +0/−3
- csource/wrapper.c +28/−0
- d3d11binding.cabal +17/−3
- examples/Cube.hs +1/−1
- examples/RevolveCube.hs +357/−0
- src/Graphics/D3D11Binding/Enums.hs +52/−1
- src/Graphics/D3D11Binding/Interface.hs +2/−4
- src/Graphics/D3D11Binding/Interface/D3D11DepthStencilView.hs +8/−1
- src/Graphics/D3D11Binding/Interface/D3D11Device.hs +30/−0
- src/Graphics/D3D11Binding/Interface/D3D11DeviceContext.hs +23/−1
- src/Graphics/D3D11Binding/Interface/D3D11Texture2D.hs +16/−0
- src/Graphics/D3D11Binding/Interface/Texture2D.hs +0/−13
- src/Graphics/D3D11Binding/Math/Matrix.hs +9/−0
- src/Graphics/D3D11Binding/Types.hs +60/−1
− README.md
@@ -1,3 +0,0 @@-# d3d11binding - -this package is a raw binding for the directX 11
csource/wrapper.c view
@@ -199,4 +199,32 @@ INT BaseVertexLocation) { This->lpVtbl->DrawIndexed(This, IndexCount, StartIndexLocation, BaseVertexLocation); +} + +HRESULT CreateTexture2D( + ID3D11Device* This, + const D3D11_TEXTURE2D_DESC *pDesc, + const D3D11_SUBRESOURCE_DATA *pInitialData, + ID3D11Texture2D **ppTexture2D) +{ + return This->lpVtbl->CreateTexture2D(This, pDesc, pInitialData, ppTexture2D); +} + +HRESULT CreateDepthStencilView( + ID3D11Device* This, + ID3D11Resource *pResource, + const D3D11_DEPTH_STENCIL_VIEW_DESC *pDesc, + ID3D11DepthStencilView **ppDepthStencilView) +{ + return This->lpVtbl->CreateDepthStencilView(This, pResource, pDesc, ppDepthStencilView); +} + +void ClearDepthStencilView( + ID3D11DeviceContext* This, + ID3D11DepthStencilView *pDepthStencilView, + UINT ClearFlags, + FLOAT Depth, + UINT8 Stencil) +{ + return This->lpVtbl->ClearDepthStencilView(This, pDepthStencilView, ClearFlags, Depth, Stencil); }
d3d11binding.cabal view
@@ -2,7 +2,7 @@ -- documentation, see http://haskell.org/cabal/users-guide/ name: d3d11binding -version: 0.0.0.4 +version: 0.0.0.5 synopsis: A raw binding for the directX 11 description: A raw binding for the directX 11 homepage: https://github.com/jwvg0425/d3d11binding @@ -14,7 +14,7 @@ -- copyright: category: Graphics build-type: Simple -extra-source-files: README.md +extra-source-files: cabal-version: >=1.10 Source-Repository HEAD @@ -40,11 +40,11 @@ Graphics.D3D11Binding.Interface.D3D11Resource Graphics.D3D11Binding.Interface.D3DBlob Graphics.D3D11Binding.Interface.D3DInclude + Graphics.D3D11Binding.Interface.D3D11Texture2D Graphics.D3D11Binding.Interface.DxgiAdapter Graphics.D3D11Binding.Interface.DxgiSwapChain - Graphics.D3D11Binding.Interface.Texture2D Graphics.D3D11Binding.Interface.Unknown Graphics.D3D11Binding.Shader @@ -100,6 +100,20 @@ executable Cube main-is: Cube.hs + -- other-modules: + -- other-extensions: + build-depends: + base >= 4.8 && < 5, + Win32 >= 2.3.0.0, + d3d11binding, + c-storable-deriving >= 0.1.3, + vect >= 0.4.7 + + hs-source-dirs: examples + default-language: Haskell2010 + +executable RevolveCube + main-is: RevolveCube.hs -- other-modules: -- other-extensions: build-depends:
examples/Cube.hs view
@@ -129,7 +129,7 @@ iaSetVertexBuffers deviceContext 0 [(buffer, fromIntegral $ sizeOf (undefined :: SimpleVertex), 0)] let indexBd = D3D11BufferDesc - { byteWidth = fromIntegral $ 36 * sizeOf (undefined :: Word32) + { byteWidth = fromIntegral $ 36 * sizeOf (undefined :: Word16) , usage = D3D11UsageDefault , bindFlags = d3d11BindFlags [D3D11BindIndexBuffer] , cpuAccessFlags = 0
+ examples/RevolveCube.hs view
@@ -0,0 +1,357 @@+{-# LANGUAGE DeriveGeneric #-} +{-# LANGUAGE ScopedTypeVariables #-} +module Main where +import GHC.Generics (Generic) + +import System.Exit + +import Data.Int +import Data.Word +import Data.Vect.Float +import System.CPUTime + +import Control.Exception +import Control.Monad + +import Foreign (peekByteOff) +import Foreign.CStorable +import Foreign.Storable +import Foreign.Ptr + +import Graphics.Win32 +import System.Win32.DLL (getModuleHandle) + +import Graphics.D3D11Binding +import Graphics.D3D11Binding.Math.Vertex3 + +foreign import stdcall "PostQuitMessage" postQuitMessage :: Int32 -> IO () + +data SimpleVertex = SimpleVertex Vertex3 Color deriving (Generic) + +instance CStorable SimpleVertex +instance Storable SimpleVertex where + sizeOf = cSizeOf + alignment = cAlignment + poke = cPoke + peek = cPeek + +instance HasSubresourceData SimpleVertex + +data ConstantBuffer = ConstantBuffer + { world :: Mat4 + , view :: Mat4 + , projection :: Mat4 } deriving (Generic) + +instance CStorable ConstantBuffer +instance Storable ConstantBuffer where + sizeOf = cSizeOf + alignment = cAlignment + poke = cPoke + peek = cPeek + +instance HasSubresourceData ConstantBuffer + +instance HasSubresourceData Word16 + + +windowWidth :: (Num a) => a +windowWidth = 640 + +windowHeight :: (Num a) => a +windowHeight = 480 + +main :: IO () +main = do + hWnd <- createDefaultWindow windowWidth windowHeight wndProc + useDevice hWnd $ \swapChain device deviceContext renderTargetView depthStencilView -> do + vb <- compileShaderFromFile "fx/RevolveCube.fx" "VS" "vs_4_0" + (il, vs) <- use vb $ \vsBlob -> do + pointer <- getBufferPointer vsBlob + size <- getBufferSize vsBlob + Right vertexShader <- createVertexShader + device + pointer + size + nullPtr + + Right inputLayout <- createInputLayout + device + [ D3D11InputElementDesc + "POSITION" + (fromIntegral 0) + DxgiFormatR32G32B32Float + (fromIntegral 0) + (fromIntegral 0) + D3D11InputPerVertexData + (fromIntegral 0) + , D3D11InputElementDesc + "COLOR" + (fromIntegral 0) + DxgiFormatR32G32B32A32Float + (fromIntegral 0) + (fromIntegral 12) + D3D11InputPerVertexData + (fromIntegral 0) ] + pointer + size + iaSetInputLayout deviceContext inputLayout + return (inputLayout, vertexShader) + + pb <- compileShaderFromFile "fx/RevolveCube.fx" "PS" "ps_4_0" + (idb, ps) <- use pb $ \psBlob -> do + pointer <- getBufferPointer psBlob + size <- getBufferSize psBlob + Right pixelShader <- createPixelShader + device + pointer + size + nullPtr + + let bd = D3D11BufferDesc + { byteWidth = fromIntegral $ 8 * sizeOf (undefined :: SimpleVertex) + , usage = D3D11UsageDefault + , bindFlags = d3d11BindFlags [D3D11BindVertexBuffer] + , cpuAccessFlags = 0 + , miscFlags = 0 + , structureByteStride = 0 } + Right buffer <- createBuffer + device + bd + [ SimpleVertex (Vertex3 (-1.0) 1.0 (-1.0)) (Color 0.0 0.0 1.0 1.0) + , SimpleVertex (Vertex3 1.0 1.0 (-1.0)) (Color 0.0 1.0 0.0 1.0) + , SimpleVertex (Vertex3 1.0 1.0 1.0) (Color 0.0 1.0 1.0 1.0) + , SimpleVertex (Vertex3 (-1.0) 1.0 1.0) (Color 1.0 0.0 0.0 1.0) + , SimpleVertex (Vertex3 (-1.0) (-1.0) (-1.0)) (Color 1.0 0.0 1.0 1.0) + , SimpleVertex (Vertex3 1.0 (-1.0) (-1.0)) (Color 1.0 1.0 0.0 1.0) + , SimpleVertex (Vertex3 1.0 (-1.0) 1.0) (Color 1.0 1.0 1.0 1.0) + , SimpleVertex (Vertex3 (-1.0) (-1.0) 1.0) (Color 0.0 0.0 0.0 1.0) ] + + iaSetVertexBuffers deviceContext 0 [(buffer, fromIntegral $ sizeOf (undefined :: SimpleVertex), 0)] + + let indexBd = D3D11BufferDesc + { byteWidth = fromIntegral $ 36 * sizeOf (undefined :: Word16) + , usage = D3D11UsageDefault + , bindFlags = d3d11BindFlags [D3D11BindIndexBuffer] + , cpuAccessFlags = 0 + , miscFlags = 0 + , structureByteStride = 0 } + Right indexBuffer <- createBuffer + device + indexBd + ([ 3,1,0, + 2,1,3, + + 0,5,4, + 1,5,0, + + 3,4,7, + 0,4,3, + + 1,6,5, + 2,6,1, + + 2,7,6, + 3,7,2, + + 6,4,5, + 7,4,6 ] :: [Word16]) + + iaSetIndexBuffer deviceContext indexBuffer DxgiFormatR16Uint 0 + iaSetPrimitiveTopology deviceContext D3D11PrimitiveTopologyTrianglelist + return (indexBuffer, pixelShader) + + let constantBd = D3D11BufferDesc + { byteWidth = fromIntegral $ sizeOf (undefined :: ConstantBuffer) + , usage = D3D11UsageDefault + , bindFlags = d3d11BindFlags [D3D11BindConstantBuffer] + , cpuAccessFlags = 0 + , miscFlags = 0 + , structureByteStride = 0 } + + Right cb <- createBuffer device constantBd ([] :: [ConstantBuffer]) + + use cb $ \constantBuffer -> use il $ \inputLayout -> + use vs $ \vertexShader -> use idb $ \ indexBuffer -> use ps $ \pixelShader -> do + messagePump hWnd deviceContext swapChain renderTargetView depthStencilView vertexShader pixelShader constantBuffer + +useDevice hWnd proc = do + (s, d, dc, r, ds) <- initDevice hWnd + use s $ \swapChain -> use d $ \device -> use dc $ \deviceContext -> use r $ \renderTargetView -> use ds $ \depthStencilView -> + proc swapChain device deviceContext renderTargetView depthStencilView + +wndProc :: WindowClosure +wndProc hWnd msg wParam lParam + | msg == wM_DESTROY = postQuitMessage 0 >> return 0 + | otherwise = defWindowProc (Just hWnd) msg wParam lParam + +initDevice :: HWND -> + IO (Ptr IDxgiSwapChain, Ptr ID3D11Device, Ptr ID3D11DeviceContext, Ptr ID3D11RenderTargetView, Ptr ID3D11DepthStencilView) +initDevice hWnd = do + let bd = DxgiModeDesc + windowWidth + windowHeight + (DxgiRational 60 1) + DxgiFormatR8G8B8A8Unorm + DxgiModeScanlineOrderUnspecified + DxgiModeScalingUnspecified + + let sd = DxgiSwapChainDesc + bd + (DxgiSampleDesc 1 0) + dxgiUsageRenderTargetOutput + 1 + hWnd + True + DxgiSwapEffectDiscard + 0 + + Right (swapChain, device, featureLevel, deviceContext) <- d3d11CreateDeviceAndSwapChain + nullPtr + D3DDriverTypeHardware + nullPtr + [D3D11CreateDeviceDebug] + [D3DFeatureLevel11_0, D3DFeatureLevel10_1, D3DFeatureLevel10_0] + sd + + Right (backBuffer :: Ptr ID3D11Texture2D) <- getBuffer swapChain (fromIntegral 0) + Right renderTargetView <- use backBuffer $ \b -> createRenderTargetView device b Nothing + + let td = D3D11Texture2DDesc + windowWidth + windowHeight + 1 + 1 + DxgiFormatD24UnormS8Uint + (DxgiSampleDesc 1 0) + D3D11UsageDefault + (d3d11BindFlags [D3D11BindDepthStencil]) + 0 + 0 + Right depthStencil <- createTexture2D device td ([]::[Word16]) + + let descDsv = D3D11DepthStencilViewDesc + DxgiFormatD24UnormS8Uint + D3D11DsvDimensionTexture2D + 0 + (tex2dDsv 0) + + Right depthStencilView <- createDepthStencilView device depthStencil (Just descDsv) + + omSetRenderTargets deviceContext [renderTargetView] depthStencilView + rsSetViewports deviceContext [D3D11Viewport 0 0 windowWidth windowHeight 0 1] + + return (swapChain, device, deviceContext, renderTargetView, depthStencilView) + +compileShaderFromFile :: String -> String -> String -> IO (Ptr ID3DBlob) +compileShaderFromFile fileName entryPoint shaderModel = do + Right res <- d3dCompileFromFile + fileName + Nothing + Nothing + nullPtr + (Just entryPoint) + shaderModel + [d3dCompileEnableStrictness] + [] + return res + +createDefaultWindow :: Int -> Int -> WindowClosure -> IO HWND +createDefaultWindow width height wndProc = do + let winClass = mkClassName "Cube Window" + icon <- loadIcon Nothing iDI_APPLICATION + cursor <- loadCursor Nothing iDC_ARROW + bgBrush <- createSolidBrush (rgb 255 255 255) + mainInstance <- getModuleHandle Nothing + registerClass + ( cS_VREDRAW + cS_HREDRAW + , mainInstance + , Just icon + , Just cursor + , Just bgBrush + , Nothing + , winClass ) + w <- createWindow + winClass + "Cube" + wS_OVERLAPPEDWINDOW + Nothing Nothing + (Just width) + (Just height) + Nothing + Nothing + mainInstance + wndProc + + showWindow w sW_SHOWNORMAL + updateWindow w + return w + +pM_NOREMOVE, pM_REMOVE, pM_NOYIELD :: UINT +pM_NOREMOVE = 0x0000 +pM_REMOVE = 0x0001 +pM_NOYIELD = 0x0002 + +messagePump + :: HWND -> Ptr ID3D11DeviceContext -> + Ptr IDxgiSwapChain -> Ptr ID3D11RenderTargetView -> Ptr ID3D11DepthStencilView -> + Ptr ID3D11VertexShader -> Ptr ID3D11PixelShader -> Ptr ID3D11Buffer -> IO () +messagePump hwnd deviceContext swapChain renderTargetView depthStencilView vs ps cb = Graphics.Win32.allocaMessage $ \ msg -> + let pump = do + m <- peekByteOff msg 4 :: IO WindowMessage + when (m /= wM_QUIT) $ do + r <- c_PeekMessage msg (maybePtr Nothing) 0 0 pM_REMOVE + if r /= 0 + then do + translateMessage msg + dispatchMessage msg + return () + else do + render deviceContext swapChain renderTargetView depthStencilView vs ps cb + pump + in pump + +render + :: Ptr ID3D11DeviceContext -> Ptr IDxgiSwapChain -> Ptr ID3D11RenderTargetView -> Ptr ID3D11DepthStencilView -> + Ptr ID3D11VertexShader -> Ptr ID3D11PixelShader -> Ptr ID3D11Buffer -> IO () +render deviceContext swapChain renderTargetView depthStencilView vs ps cb = do + clearRenderTargetView deviceContext renderTargetView $ Color 0.0 0.125 0.3 1.0 + clearDepthStencilView deviceContext depthStencilView [D3D11ClearDepth] 1 0 + + vsSetShader deviceContext vs [] + vsSetConstantBuffers deviceContext 0 [cb] + psSetShader deviceContext ps [] + + t <- getCPUTime + let d = (fromIntegral t) / 1000000000000 + + let eye = Vec3 0.0 1.0 (-5.0) + let at = Vec3 0.0 1.0 0.0 + let up = Vec3 0.0 1.0 0.0 + let world = rotationY d + let view = lookAtLH eye at up + let projection = perspectiveFovLH (pi / 2) (windowWidth / windowHeight) 0.01 100 + let cbData = ConstantBuffer (transpose world) (transpose view) (transpose projection) + + let spin = rotationZ (-d) + let orbit = rotationY (-d * 2) + let translate = Mat4 (Vec4 1.0 0.0 0.0 0.0) + (Vec4 0.0 1.0 0.0 0.0) + (Vec4 0.0 0.0 1.0 0.0) + (Vec4 (-4.0) 0.0 0.0 1.0) + let scale = Mat4 (Vec4 0.3 0.0 0.0 0.0) + (Vec4 0.0 0.3 0.0 0.0) + (Vec4 0.0 0.0 0.3 0.0) + (Vec4 0.0 0.0 0.0 1.0) + let world2 = scale .*. spin .*. translate .*. orbit + let cbData2 = ConstantBuffer (transpose world2) (transpose view) (transpose projection) + + updateSubresource deviceContext cb 0 Nothing cbData 0 0 + + drawIndexed deviceContext 36 0 0 + + updateSubresource deviceContext cb 0 Nothing cbData2 0 0 + + drawIndexed deviceContext 36 0 0 + + present swapChain 0 0 + return ()
src/Graphics/D3D11Binding/Enums.hs view
@@ -138,11 +138,13 @@ fromEnum DxgiFormatR32G32B32A32Float = 2 fromEnum DxgiFormatR32G32B32Float = 6 fromEnum DxgiFormatR8G8B8A8Unorm = 28 + fromEnum DxgiFormatD24UnormS8Uint = 45 fromEnum DxgiFormatR16Uint = 57 toEnum 0 = DxgiFormatUnknown toEnum 2 = DxgiFormatR32G32B32A32Float toEnum 6 = DxgiFormatR32G32B32Float toEnum 28 = DxgiFormatR8G8B8A8Unorm + toEnum 45 = DxgiFormatD24UnormS8Uint toEnum 57 = DxgiFormatR16Uint toEnum unmatched = error ("DxgiFormat.toEnum: cannot match " ++ show unmatched) @@ -419,4 +421,53 @@ fromEnum D3D11PrimitiveTopologyTrianglelist = 4 toEnum 0 = D3D11PrimitiveTopologyUndefined toEnum 4 = D3D11PrimitiveTopologyTrianglelist - toEnum unmatched = error ("D3D11PrimitiveTopology.toEnum: cannot match " ++ show unmatched)+ toEnum unmatched = error ("D3D11PrimitiveTopology.toEnum: cannot match " ++ show unmatched) + +data D3D11DsvDimension = D3D11DsvDimensionUnknown + | D3D11DsvDimensionTexture1D + | D3D11DsvDimensionTexture1DArray + | D3D11DsvDimensionTexture2D + | D3D11DsvDimensionTexture2DArray + | D3D11DsvDimensionTexture2DMs + | D3D11DsvDimensionTexture2DMsArray + deriving (Eq, Show) + +instance Enum D3D11DsvDimension where + fromEnum D3D11DsvDimensionUnknown = 0 + fromEnum D3D11DsvDimensionTexture1D = 1 + fromEnum D3D11DsvDimensionTexture1DArray = 2 + fromEnum D3D11DsvDimensionTexture2D = 3 + fromEnum D3D11DsvDimensionTexture2DArray = 4 + fromEnum D3D11DsvDimensionTexture2DMs = 5 + fromEnum D3D11DsvDimensionTexture2DMsArray = 6 + toEnum 0 = D3D11DsvDimensionUnknown + toEnum 1 = D3D11DsvDimensionTexture1D + toEnum 2 = D3D11DsvDimensionTexture1DArray + toEnum 3 = D3D11DsvDimensionTexture2D + toEnum 4 = D3D11DsvDimensionTexture2DArray + toEnum 5 = D3D11DsvDimensionTexture2DMs + toEnum 6 = D3D11DsvDimensionTexture2DMsArray + toEnum unmatched = error ("D3D11DsvDimension.toEnum: cannot match " ++ show unmatched) + +instance Storable D3D11DsvDimension where + sizeOf e = sizeOf ((fromIntegral $ fromEnum e) :: Int32) + alignment e = alignment ((fromIntegral $ fromEnum e) :: Int32) + peek ptr = peekByteOff (castPtr ptr :: Ptr Int32) 0 >>= (return . toEnum) + poke ptr val = pokeByteOff (castPtr ptr :: Ptr Int32) 0 (fromEnum val) + +instance CStorable D3D11DsvDimension where + cSizeOf = sizeOf + cAlignment = alignment + cPeek = peek + cPoke = poke + +data D3D11ClearFlag = D3D11ClearDepth + | D3D11ClearStencil + deriving (Eq, Show) + +instance Enum D3D11ClearFlag where + fromEnum D3D11ClearDepth = 1 + fromEnum D3D11ClearStencil = 2 + toEnum 1 = D3D11ClearDepth + toEnum 2 = D3D11ClearStencil + toEnum unmatched = error ("D3D11ClearFlag.toEnum: cannot match " ++ show unmatched)
src/Graphics/D3D11Binding/Interface.hs view
@@ -9,12 +9,11 @@ , module Graphics.D3D11Binding.Interface.D3D11Resource , module Graphics.D3D11Binding.Interface.D3DBlob , module Graphics.D3D11Binding.Interface.D3DInclude +, module Graphics.D3D11Binding.Interface.D3D11Texture2D , module Graphics.D3D11Binding.Interface.DxgiAdapter , module Graphics.D3D11Binding.Interface.DxgiSwapChain -, module Graphics.D3D11Binding.Interface.Texture2D - , module Graphics.D3D11Binding.Interface.Unknown ) where @@ -28,10 +27,9 @@ import Graphics.D3D11Binding.Interface.D3D11Resource import Graphics.D3D11Binding.Interface.D3DBlob import Graphics.D3D11Binding.Interface.D3DInclude +import Graphics.D3D11Binding.Interface.D3D11Texture2D import Graphics.D3D11Binding.Interface.DxgiAdapter import Graphics.D3D11Binding.Interface.DxgiSwapChain - -import Graphics.D3D11Binding.Interface.Texture2D import Graphics.D3D11Binding.Interface.Unknown
src/Graphics/D3D11Binding/Interface/D3D11DepthStencilView.hs view
@@ -1,3 +1,10 @@ module Graphics.D3D11Binding.Interface.D3D11DepthStencilView where -data ID3D11DepthStencilView = ID3D11DepthStencilView+import Graphics.D3D11Binding.Interface.Unknown +import Graphics.D3D11Binding.Interface.D3D11Resource + +data ID3D11DepthStencilView = ID3D11DepthStencilView + +instance UnknownInterface ID3D11DepthStencilView + +instance D3D11ResourceInterface ID3D11DepthStencilView
src/Graphics/D3D11Binding/Interface/D3D11Device.hs view
@@ -14,9 +14,11 @@ import Graphics.D3D11Binding.Interface.Unknown import Graphics.D3D11Binding.Interface.D3D11Buffer import Graphics.D3D11Binding.Interface.D3D11Resource +import Graphics.D3D11Binding.Interface.D3D11DepthStencilView import Graphics.D3D11Binding.Interface.D3D11RenderTargetView import Graphics.D3D11Binding.Interface.D3D11ClassLinkage import Graphics.D3D11Binding.Interface.D3D11InputLayout +import Graphics.D3D11Binding.Interface.D3D11Texture2D import Graphics.D3D11Binding.Shader.D3D11VertexShader import Graphics.D3D11Binding.Shader.D3D11PixelShader @@ -36,6 +38,12 @@ foreign import stdcall "CreateBuffer" c_createBuffer :: Ptr ID3D11Device -> Ptr D3D11BufferDesc -> Ptr D3D11SubresourceData -> Ptr (Ptr ID3D11Buffer) -> IO HRESULT +foreign import stdcall "CreateTexture2D" c_createTexture2D + :: Ptr ID3D11Device -> Ptr D3D11Texture2DDesc -> Ptr D3D11SubresourceData -> Ptr (Ptr ID3D11Texture2D) -> IO HRESULT + +foreign import stdcall "CreateDepthStencilView" c_createDepthStencilView + :: Ptr ID3D11Device -> Ptr ID3D11Resource -> Ptr D3D11DepthStencilViewDesc -> Ptr (Ptr ID3D11DepthStencilView) -> IO HRESULT + class (UnknownInterface interface) => D3D11DeviceInterface interface where createRenderTargetView :: (D3D11ResourceInterface resource) => @@ -44,6 +52,13 @@ hr <- c_createRenderTargetView (castPtr this) (castPtr pResource) pDesc renderTargetView if hr < 0 then return (Left hr) else Right <$> peek renderTargetView + createDepthStencilView + :: (D3D11ResourceInterface resource) => + Ptr interface -> Ptr resource -> Maybe (D3D11DepthStencilViewDesc) -> IO (Either HRESULT (Ptr ID3D11DepthStencilView)) + createDepthStencilView this pResource desc = alloca $ \depthStencilView -> maybePoke desc $ \pDesc -> do + hr <- c_createDepthStencilView (castPtr this) (castPtr pResource) pDesc depthStencilView + if hr < 0 then return (Left hr) else Right <$> peek depthStencilView + createVertexShader :: Ptr interface -> Ptr () -> Word32 -> Ptr ID3D11ClassLinkage -> IO (Either HRESULT (Ptr ID3D11VertexShader)) createVertexShader this shaderByteCode bytecodeLength pClassLinkage = alloca $ \ppVertexShader -> do @@ -84,6 +99,21 @@ poke pResource resource' hr <- c_createBuffer (castPtr this) pDesc pResource ppBuffer if hr < 0 then return (Left hr) else Right <$> peek ppBuffer + + createTexture2D + :: (HasSubresourceData resource) => Ptr interface -> D3D11Texture2DDesc -> [resource] -> IO (Either HRESULT (Ptr ID3D11Texture2D)) + createTexture2D this desc resource = + alloca $ \ppTexture2D -> alloca $ \pDesc -> do + poke pDesc desc + if null resource + then do + hr <- c_createTexture2D (castPtr this) pDesc nullPtr ppTexture2D + if hr < 0 then return (Left hr) else Right <$> peek ppTexture2D + else alloca $ \pResource -> do + resource' <- getSubresourceData resource + poke pResource resource' + hr <- c_createTexture2D (castPtr this) pDesc pResource ppTexture2D + if hr < 0 then return (Left hr) else Right <$> peek ppTexture2D data ID3D11Device = ID3D11Device
src/Graphics/D3D11Binding/Interface/D3D11DeviceContext.hs view
@@ -1,5 +1,6 @@ module Graphics.D3D11Binding.Interface.D3D11DeviceContext where import Data.Word +import Data.Bits import Foreign.Storable import Foreign.Marshal.Alloc @@ -31,7 +32,10 @@ foreign import stdcall "ClearRenderTargetView" c_clearRenderTargetView :: Ptr ID3D11DeviceContext -> Ptr ID3D11RenderTargetView -> Ptr Float -> IO () - + +foreign import stdcall "ClearDepthStencilView" c_clearDepthStencilView + :: Ptr ID3D11DeviceContext -> Ptr ID3D11DepthStencilView -> Word32 -> Float -> Word8 -> IO () + foreign import stdcall "IASetInputLayout" c_iaSetInputLayout :: Ptr ID3D11DeviceContext -> Ptr ID3D11InputLayout -> IO () @@ -67,12 +71,15 @@ omSetRenderTargets ptr renderTargetViews depthStencilView = alloca $ \pRenderTargetViews -> do pokeArray pRenderTargetViews renderTargetViews c_omSetRenderTargets (castPtr ptr) (fromIntegral $ length renderTargetViews) pRenderTargetViews depthStencilView + rsSetViewports :: Ptr interface -> [D3D11Viewport] -> IO () rsSetViewports ptr viewports = alloca $ \pViewports -> do pokeArray pViewports viewports c_rsSetViewports (castPtr ptr) (fromIntegral $ length viewports) pViewports + iaSetInputLayout :: Ptr interface -> Ptr ID3D11InputLayout -> IO () iaSetInputLayout ptr inputLayout = c_iaSetInputLayout (castPtr ptr) inputLayout + iaSetVertexBuffers :: Ptr interface -> Word32 -> [(Ptr ID3D11Buffer, Word32, Word32)] -> IO () iaSetVertexBuffers ptr startSlot bufferData = do let buffer = map first bufferData @@ -86,33 +93,48 @@ where first (a,_,_) = a second (_,b,_) = b third (_,_,c) = c + iaSetIndexBuffer :: Ptr interface -> Ptr ID3D11Buffer -> DxgiFormat -> Word32 -> IO () iaSetIndexBuffer ptr buffer format offset = c_iaSetIndexBuffer (castPtr ptr) buffer (fromIntegral $ fromEnum format) offset + iaSetPrimitiveTopology :: Ptr interface -> D3D11PrimitiveTopology -> IO () iaSetPrimitiveTopology ptr topology = c_iaSetPrimitiveTopology (castPtr ptr) (fromIntegral $ fromEnum topology) + clearRenderTargetView :: Ptr interface -> Ptr ID3D11RenderTargetView -> Color -> IO () clearRenderTargetView ptr renderTargetView color = alloca $ \pColor -> do poke pColor color c_clearRenderTargetView (castPtr ptr) renderTargetView (castPtr pColor) + + clearDepthStencilView :: Ptr interface -> Ptr ID3D11DepthStencilView -> [D3D11ClearFlag] -> Float -> Word8 -> IO () + clearDepthStencilView ptr depthStencilView flags depth stencil = do + let sumFlag = fromIntegral $ foldl (\acc x -> acc .|. (fromEnum x)) 0 flags + c_clearDepthStencilView (castPtr ptr) depthStencilView sumFlag depth stencil + clearState :: Ptr interface -> IO () clearState ptr = c_clearState (castPtr ptr) + vsSetShader :: Ptr interface -> Ptr ID3D11VertexShader -> [Ptr ID3D11ClassInstance] -> IO () vsSetShader ptr vertexShader classInstances = maybePokeArray classInstances $ \pClassInstances -> do let classInstanceNum = fromIntegral $ length classInstances c_vsSetShader (castPtr ptr) vertexShader pClassInstances classInstanceNum + vsSetConstantBuffers :: Ptr interface -> Word32 -> [Ptr ID3D11Buffer] -> IO () vsSetConstantBuffers ptr startSlot buffers = alloca $ \pBuffer -> do pokeArray pBuffer buffers c_vsSetConstantBuffers (castPtr ptr) startSlot (fromIntegral $ length buffers) pBuffer + psSetShader :: Ptr interface -> Ptr ID3D11PixelShader -> [Ptr ID3D11ClassInstance] -> IO () psSetShader ptr pixelShader classInstances = maybePokeArray classInstances $ \pClassInstances -> do let classInstanceNum = fromIntegral $ length classInstances c_psSetShader (castPtr ptr) pixelShader pClassInstances classInstanceNum + draw :: Ptr interface -> Word32 -> Word32 -> IO () draw ptr vertexCount startVertexLocation = c_draw (castPtr ptr) vertexCount startVertexLocation + drawIndexed :: Ptr interface -> Word32 -> Word32 -> Word32 -> IO () drawIndexed ptr indexCount startIndexLocation baseVertexLocation = c_drawIndexed (castPtr ptr) indexCount startIndexLocation baseVertexLocation + updateSubresource :: (D3D11ResourceInterface resource, Storable store) => Ptr interface -> Ptr resource -> Word32 -> Maybe D3D11Box -> store -> Word32 -> Word32 -> IO ()
+ src/Graphics/D3D11Binding/Interface/D3D11Texture2D.hs view
@@ -0,0 +1,16 @@+module Graphics.D3D11Binding.Interface.D3D11Texture2D where + +import Foreign.Ptr + +import Graphics.D3D11Binding.Types +import Graphics.D3D11Binding.GUID +import Graphics.D3D11Binding.Interface.Unknown +import Graphics.D3D11Binding.Interface.D3D11Resource + +data ID3D11Texture2D = ID3D11Texture2D + +instance HasGUID ID3D11Texture2D where + getGUID _ = GUID 0x6f15aaf2 0xd208 0x4e89 [0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c] + +instance UnknownInterface ID3D11Texture2D +instance D3D11ResourceInterface ID3D11Texture2D
− src/Graphics/D3D11Binding/Interface/Texture2D.hs
@@ -1,13 +0,0 @@-module Graphics.D3D11Binding.Interface.Texture2D where - -import Graphics.D3D11Binding.GUID -import Graphics.D3D11Binding.Interface.Unknown -import Graphics.D3D11Binding.Interface.D3D11Resource - -data ID3D11Texture2D = ID3D11Texture2D - -instance HasGUID ID3D11Texture2D where - getGUID _ = GUID 0x6f15aaf2 0xd208 0x4e89 [0x9a,0xb4,0x48,0x95,0x35,0xd3,0x4f,0x9c] - -instance UnknownInterface ID3D11Texture2D -instance D3D11ResourceInterface ID3D11Texture2D
src/Graphics/D3D11Binding/Math/Matrix.hs view
@@ -50,4 +50,13 @@ m = Mat4 (Vec4 cosAngle 0 (-sinAngle) 0) (Vec4 0 1 0 0) (Vec4 sinAngle 0 cosAngle 0) + (Vec4 0 0 0 1) + +rotationZ :: Float -> Mat4 +rotationZ angle = m + where sinAngle = sin angle + cosAngle = cos angle + m = Mat4 (Vec4 cosAngle sinAngle 0 0) + (Vec4 (-sinAngle) cosAngle 0 0) + (Vec4 0 0 1 0) (Vec4 0 0 0 1)
src/Graphics/D3D11Binding/Types.hs view
@@ -263,4 +263,63 @@ sizeOf = cSizeOf alignment = cAlignment poke = cPoke - peek = cPeek+ peek = cPeek + +data D3D11Texture2DDesc = D3D11Texture2DDesc + { textureWidth :: Word32 + , textureHeight :: Word32 + , mipLevels :: Word32 + , arraySize :: Word32 + , textureFormat :: DxgiFormat + , textureSampleDesc :: DxgiSampleDesc + , textureUsage :: D3D11Usage + , textureBindFlags :: Word32 + , textureCPUAccessFlags :: Word32 + , textureMiscFlags :: Word32 } deriving (Generic) + +instance CStorable D3D11Texture2DDesc +instance Storable D3D11Texture2DDesc where + sizeOf = cSizeOf + alignment = cAlignment + poke = cPoke + peek = cPeek + +data D3D11DepthStencilViewDesc = D3D11DepthStencilViewDesc + { dsvFormat :: DxgiFormat + , dsvViewDimension :: D3D11DsvDimension + , dsvFlags :: Word32 + , dsv :: Dsv } deriving (Generic) + +instance CStorable D3D11DepthStencilViewDesc +instance Storable D3D11DepthStencilViewDesc where + sizeOf = cSizeOf + alignment = cAlignment + poke = cPoke + peek = cPeek + +data Dsv = Dsv Word32 Word32 Word32 deriving (Generic) + +instance CStorable Dsv +instance Storable Dsv where + sizeOf = cSizeOf + alignment = cAlignment + poke = cPoke + peek = cPeek + +tex1dDsv :: Word32 -> Dsv +tex1dDsv mipSlice = Dsv mipSlice (fromIntegral 0) (fromIntegral 0) + +tex1dArrayDsv :: Word32 -> Word32 -> Word32 -> Dsv +tex1dArrayDsv mipSlice firstArraySlice arraySize = Dsv mipSlice firstArraySlice arraySize + +tex2dDsv :: Word32 -> Dsv +tex2dDsv mipSlice = Dsv mipSlice (fromIntegral 0) (fromIntegral 0) + +tex2dArrayDsv :: Word32 -> Word32 -> Word32 -> Dsv +tex2dArrayDsv mipSlice firstArraySlice arraySize = Dsv mipSlice firstArraySlice arraySize + +tex2dMsDsv :: Dsv +tex2dMsDsv = Dsv (fromIntegral 0) (fromIntegral 0) (fromIntegral 0) + +tex2dMsArrayDsv :: Word32 -> Word32 -> Dsv +tex2dMsArrayDsv firstArraySlice arraySize = Dsv firstArraySlice arraySize (fromIntegral 0)