packages feed

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
@@ -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)