d3d11_windows.go raw
1 // SPDX-License-Identifier: Unlicense OR MIT
2
3 package d3d11
4
5 import (
6 "fmt"
7 "math"
8 "syscall"
9 "unsafe"
10
11 "github.com/p9c/p9/pkg/gel/gio/internal/f32color"
12
13 "golang.org/x/sys/windows"
14 )
15
16 type DXGI_SWAP_CHAIN_DESC struct {
17 BufferDesc DXGI_MODE_DESC
18 SampleDesc DXGI_SAMPLE_DESC
19 BufferUsage uint32
20 BufferCount uint32
21 OutputWindow windows.Handle
22 Windowed uint32
23 SwapEffect uint32
24 Flags uint32
25 }
26
27 type DXGI_SAMPLE_DESC struct {
28 Count uint32
29 Quality uint32
30 }
31
32 type DXGI_MODE_DESC struct {
33 Width uint32
34 Height uint32
35 RefreshRate DXGI_RATIONAL
36 Format uint32
37 ScanlineOrdering uint32
38 Scaling uint32
39 }
40
41 type DXGI_RATIONAL struct {
42 Numerator uint32
43 Denominator uint32
44 }
45
46 type TEXTURE2D_DESC struct {
47 Width uint32
48 Height uint32
49 MipLevels uint32
50 ArraySize uint32
51 Format uint32
52 SampleDesc DXGI_SAMPLE_DESC
53 Usage uint32
54 BindFlags uint32
55 CPUAccessFlags uint32
56 MiscFlags uint32
57 }
58
59 type SAMPLER_DESC struct {
60 Filter uint32
61 AddressU uint32
62 AddressV uint32
63 AddressW uint32
64 MipLODBias float32
65 MaxAnisotropy uint32
66 ComparisonFunc uint32
67 BorderColor [4]float32
68 MinLOD float32
69 MaxLOD float32
70 }
71
72 type SHADER_RESOURCE_VIEW_DESC_TEX2D struct {
73 SHADER_RESOURCE_VIEW_DESC
74 Texture2D TEX2D_SRV
75 }
76
77 type SHADER_RESOURCE_VIEW_DESC struct {
78 Format uint32
79 ViewDimension uint32
80 }
81
82 type TEX2D_SRV struct {
83 MostDetailedMip uint32
84 MipLevels uint32
85 }
86
87 type INPUT_ELEMENT_DESC struct {
88 SemanticName *byte
89 SemanticIndex uint32
90 Format uint32
91 InputSlot uint32
92 AlignedByteOffset uint32
93 InputSlotClass uint32
94 InstanceDataStepRate uint32
95 }
96
97 type IDXGISwapChain struct {
98 Vtbl *struct {
99 _IUnknownVTbl
100 SetPrivateData uintptr
101 SetPrivateDataInterface uintptr
102 GetPrivateData uintptr
103 GetParent uintptr
104 GetDevice uintptr
105 Present uintptr
106 GetBuffer uintptr
107 SetFullscreenState uintptr
108 GetFullscreenState uintptr
109 GetDesc uintptr
110 ResizeBuffers uintptr
111 ResizeTarget uintptr
112 GetContainingOutput uintptr
113 GetFrameStatistics uintptr
114 GetLastPresentCount uintptr
115 }
116 }
117
118 type Device struct {
119 Vtbl *struct {
120 _IUnknownVTbl
121 CreateBuffer uintptr
122 CreateTexture1D uintptr
123 CreateTexture2D uintptr
124 CreateTexture3D uintptr
125 CreateShaderResourceView uintptr
126 CreateUnorderedAccessView uintptr
127 CreateRenderTargetView uintptr
128 CreateDepthStencilView uintptr
129 CreateInputLayout uintptr
130 CreateVertexShader uintptr
131 CreateGeometryShader uintptr
132 CreateGeometryShaderWithStreamOutput uintptr
133 CreatePixelShader uintptr
134 CreateHullShader uintptr
135 CreateDomainShader uintptr
136 CreateComputeShader uintptr
137 CreateClassLinkage uintptr
138 CreateBlendState uintptr
139 CreateDepthStencilState uintptr
140 CreateRasterizerState uintptr
141 CreateSamplerState uintptr
142 CreateQuery uintptr
143 CreatePredicate uintptr
144 CreateCounter uintptr
145 CreateDeferredContext uintptr
146 OpenSharedResource uintptr
147 CheckFormatSupport uintptr
148 CheckMultisampleQualityLevels uintptr
149 CheckCounterInfo uintptr
150 CheckCounter uintptr
151 CheckFeatureSupport uintptr
152 GetPrivateData uintptr
153 SetPrivateData uintptr
154 SetPrivateDataInterface uintptr
155 GetFeatureLevel uintptr
156 GetCreationFlags uintptr
157 GetDeviceRemovedReason uintptr
158 GetImmediateContext uintptr
159 SetExceptionMode uintptr
160 GetExceptionMode uintptr
161 }
162 }
163
164 type DeviceContext struct {
165 Vtbl *struct {
166 _IUnknownVTbl
167 GetDevice uintptr
168 GetPrivateData uintptr
169 SetPrivateData uintptr
170 SetPrivateDataInterface uintptr
171 VSSetConstantBuffers uintptr
172 PSSetShaderResources uintptr
173 PSSetShader uintptr
174 PSSetSamplers uintptr
175 VSSetShader uintptr
176 DrawIndexed uintptr
177 Draw uintptr
178 Map uintptr
179 Unmap uintptr
180 PSSetConstantBuffers uintptr
181 IASetInputLayout uintptr
182 IASetVertexBuffers uintptr
183 IASetIndexBuffer uintptr
184 DrawIndexedInstanced uintptr
185 DrawInstanced uintptr
186 GSSetConstantBuffers uintptr
187 GSSetShader uintptr
188 IASetPrimitiveTopology uintptr
189 VSSetShaderResources uintptr
190 VSSetSamplers uintptr
191 Begin uintptr
192 End uintptr
193 GetData uintptr
194 SetPredication uintptr
195 GSSetShaderResources uintptr
196 GSSetSamplers uintptr
197 OMSetRenderTargets uintptr
198 OMSetRenderTargetsAndUnorderedAccessViews uintptr
199 OMSetBlendState uintptr
200 OMSetDepthStencilState uintptr
201 SOSetTargets uintptr
202 DrawAuto uintptr
203 DrawIndexedInstancedIndirect uintptr
204 DrawInstancedIndirect uintptr
205 Dispatch uintptr
206 DispatchIndirect uintptr
207 RSSetState uintptr
208 RSSetViewports uintptr
209 RSSetScissorRects uintptr
210 CopySubresourceRegion uintptr
211 CopyResource uintptr
212 UpdateSubresource uintptr
213 CopyStructureCount uintptr
214 ClearRenderTargetView uintptr
215 ClearUnorderedAccessViewUint uintptr
216 ClearUnorderedAccessViewFloat uintptr
217 ClearDepthStencilView uintptr
218 GenerateMips uintptr
219 SetResourceMinLOD uintptr
220 GetResourceMinLOD uintptr
221 ResolveSubresource uintptr
222 ExecuteCommandList uintptr
223 HSSetShaderResources uintptr
224 HSSetShader uintptr
225 HSSetSamplers uintptr
226 HSSetConstantBuffers uintptr
227 DSSetShaderResources uintptr
228 DSSetShader uintptr
229 DSSetSamplers uintptr
230 DSSetConstantBuffers uintptr
231 CSSetShaderResources uintptr
232 CSSetUnorderedAccessViews uintptr
233 CSSetShader uintptr
234 CSSetSamplers uintptr
235 CSSetConstantBuffers uintptr
236 VSGetConstantBuffers uintptr
237 PSGetShaderResources uintptr
238 PSGetShader uintptr
239 PSGetSamplers uintptr
240 VSGetShader uintptr
241 PSGetConstantBuffers uintptr
242 IAGetInputLayout uintptr
243 IAGetVertexBuffers uintptr
244 IAGetIndexBuffer uintptr
245 GSGetConstantBuffers uintptr
246 GSGetShader uintptr
247 IAGetPrimitiveTopology uintptr
248 VSGetShaderResources uintptr
249 VSGetSamplers uintptr
250 GetPredication uintptr
251 GSGetShaderResources uintptr
252 GSGetSamplers uintptr
253 OMGetRenderTargets uintptr
254 OMGetRenderTargetsAndUnorderedAccessViews uintptr
255 OMGetBlendState uintptr
256 OMGetDepthStencilState uintptr
257 SOGetTargets uintptr
258 RSGetState uintptr
259 RSGetViewports uintptr
260 RSGetScissorRects uintptr
261 HSGetShaderResources uintptr
262 HSGetShader uintptr
263 HSGetSamplers uintptr
264 HSGetConstantBuffers uintptr
265 DSGetShaderResources uintptr
266 DSGetShader uintptr
267 DSGetSamplers uintptr
268 DSGetConstantBuffers uintptr
269 CSGetShaderResources uintptr
270 CSGetUnorderedAccessViews uintptr
271 CSGetShader uintptr
272 CSGetSamplers uintptr
273 CSGetConstantBuffers uintptr
274 ClearState uintptr
275 Flush uintptr
276 GetType uintptr
277 GetContextFlags uintptr
278 FinishCommandList uintptr
279 }
280 }
281
282 type RenderTargetView struct {
283 Vtbl *struct {
284 _IUnknownVTbl
285 }
286 }
287
288 type Resource struct {
289 Vtbl *struct {
290 _IUnknownVTbl
291 }
292 }
293
294 type Texture2D struct {
295 Vtbl *struct {
296 _IUnknownVTbl
297 }
298 }
299
300 type Buffer struct {
301 Vtbl *struct {
302 _IUnknownVTbl
303 }
304 }
305
306 type SamplerState struct {
307 Vtbl *struct {
308 _IUnknownVTbl
309 }
310 }
311
312 type PixelShader struct {
313 Vtbl *struct {
314 _IUnknownVTbl
315 }
316 }
317
318 type ShaderResourceView struct {
319 Vtbl *struct {
320 _IUnknownVTbl
321 }
322 }
323
324 type DepthStencilView struct {
325 Vtbl *struct {
326 _IUnknownVTbl
327 }
328 }
329
330 type BlendState struct {
331 Vtbl *struct {
332 _IUnknownVTbl
333 }
334 }
335
336 type DepthStencilState struct {
337 Vtbl *struct {
338 _IUnknownVTbl
339 }
340 }
341
342 type VertexShader struct {
343 Vtbl *struct {
344 _IUnknownVTbl
345 }
346 }
347
348 type RasterizerState struct {
349 Vtbl *struct {
350 _IUnknownVTbl
351 }
352 }
353
354 type InputLayout struct {
355 Vtbl *struct {
356 _IUnknownVTbl
357 GetBufferPointer uintptr
358 GetBufferSize uintptr
359 }
360 }
361
362 type DEPTH_STENCIL_DESC struct {
363 DepthEnable uint32
364 DepthWriteMask uint32
365 DepthFunc uint32
366 StencilEnable uint32
367 StencilReadMask uint8
368 StencilWriteMask uint8
369 FrontFace DEPTH_STENCILOP_DESC
370 BackFace DEPTH_STENCILOP_DESC
371 }
372
373 type DEPTH_STENCILOP_DESC struct {
374 StencilFailOp uint32
375 StencilDepthFailOp uint32
376 StencilPassOp uint32
377 StencilFunc uint32
378 }
379
380 type DEPTH_STENCIL_VIEW_DESC_TEX2D struct {
381 Format uint32
382 ViewDimension uint32
383 Flags uint32
384 Texture2D TEX2D_DSV
385 }
386
387 type TEX2D_DSV struct {
388 MipSlice uint32
389 }
390
391 type BLEND_DESC struct {
392 AlphaToCoverageEnable uint32
393 IndependentBlendEnable uint32
394 RenderTarget [8]RENDER_TARGET_BLEND_DESC
395 }
396
397 type RENDER_TARGET_BLEND_DESC struct {
398 BlendEnable uint32
399 SrcBlend uint32
400 DestBlend uint32
401 BlendOp uint32
402 SrcBlendAlpha uint32
403 DestBlendAlpha uint32
404 BlendOpAlpha uint32
405 RenderTargetWriteMask uint8
406 }
407
408 type IDXGIObject struct {
409 Vtbl *struct {
410 _IUnknownVTbl
411 SetPrivateData uintptr
412 SetPrivateDataInterface uintptr
413 GetPrivateData uintptr
414 GetParent uintptr
415 }
416 }
417
418 type IDXGIAdapter struct {
419 Vtbl *struct {
420 _IUnknownVTbl
421 SetPrivateData uintptr
422 SetPrivateDataInterface uintptr
423 GetPrivateData uintptr
424 GetParent uintptr
425 EnumOutputs uintptr
426 GetDesc uintptr
427 CheckInterfaceSupport uintptr
428 GetDesc1 uintptr
429 }
430 }
431
432 type IDXGIFactory struct {
433 Vtbl *struct {
434 _IUnknownVTbl
435 SetPrivateData uintptr
436 SetPrivateDataInterface uintptr
437 GetPrivateData uintptr
438 GetParent uintptr
439 EnumAdapters uintptr
440 MakeWindowAssociation uintptr
441 GetWindowAssociation uintptr
442 CreateSwapChain uintptr
443 CreateSoftwareAdapter uintptr
444 }
445 }
446
447 type IDXGIDevice struct {
448 Vtbl *struct {
449 _IUnknownVTbl
450 SetPrivateData uintptr
451 SetPrivateDataInterface uintptr
452 GetPrivateData uintptr
453 GetParent uintptr
454 GetAdapter uintptr
455 CreateSurface uintptr
456 QueryResourceResidency uintptr
457 SetGPUThreadPriority uintptr
458 GetGPUThreadPriority uintptr
459 }
460 }
461
462 type IUnknown struct {
463 Vtbl *struct {
464 _IUnknownVTbl
465 }
466 }
467
468 type _IUnknownVTbl struct {
469 QueryInterface uintptr
470 AddRef uintptr
471 Release uintptr
472 }
473
474 type BUFFER_DESC struct {
475 ByteWidth uint32
476 Usage uint32
477 BindFlags uint32
478 CPUAccessFlags uint32
479 MiscFlags uint32
480 StructureByteStride uint32
481 }
482
483 type GUID struct {
484 Data1 uint32
485 Data2 uint16
486 Data3 uint16
487 Data4_0 uint8
488 Data4_1 uint8
489 Data4_2 uint8
490 Data4_3 uint8
491 Data4_4 uint8
492 Data4_5 uint8
493 Data4_6 uint8
494 Data4_7 uint8
495 }
496
497 type VIEWPORT struct {
498 TopLeftX float32
499 TopLeftY float32
500 Width float32
501 Height float32
502 MinDepth float32
503 MaxDepth float32
504 }
505
506 type SUBRESOURCE_DATA struct {
507 pSysMem *byte
508 }
509
510 type BOX struct {
511 Left uint32
512 Top uint32
513 Front uint32
514 Right uint32
515 Bottom uint32
516 Back uint32
517 }
518
519 type MAPPED_SUBRESOURCE struct {
520 PData uintptr
521 RowPitch uint32
522 DepthPitch uint32
523 }
524
525 type ErrorCode struct {
526 Name string
527 Code uint32
528 }
529
530 type RASTERIZER_DESC struct {
531 FillMode uint32
532 CullMode uint32
533 FrontCounterClockwise uint32
534 DepthBias int32
535 DepthBiasClamp float32
536 SlopeScaledDepthBias float32
537 DepthClipEnable uint32
538 ScissorEnable uint32
539 MultisampleEnable uint32
540 AntialiasedLineEnable uint32
541 }
542
543 var (
544 IID_Texture2D = GUID{0x6f15aaf2, 0xd208, 0x4e89, 0x9a, 0xb4, 0x48, 0x95, 0x35, 0xd3, 0x4f, 0x9c}
545 IID_IDXGIDevice = GUID{0x54ec77fa, 0x1377, 0x44e6, 0x8c, 0x32, 0x88, 0xfd, 0x5f, 0x44, 0xc8, 0x4c}
546 IID_IDXGIFactory = GUID{0x7b7166ec, 0x21c7, 0x44ae, 0xb2, 0x1a, 0xc9, 0xae, 0x32, 0x1a, 0xe3, 0x69}
547 )
548
549 var (
550 d3d11 = windows.NewLazySystemDLL("d3d11.dll")
551
552 _D3D11CreateDevice = d3d11.NewProc("D3D11CreateDevice")
553 _D3D11CreateDeviceAndSwapChain = d3d11.NewProc("D3D11CreateDeviceAndSwapChain")
554 )
555
556 const (
557 SDK_VERSION = 7
558 DRIVER_TYPE_HARDWARE = 1
559
560 DXGI_FORMAT_UNKNOWN = 0
561 DXGI_FORMAT_R16_FLOAT = 54
562 DXGI_FORMAT_R32_FLOAT = 41
563 DXGI_FORMAT_R32G32_FLOAT = 16
564 DXGI_FORMAT_R32G32B32_FLOAT = 6
565 DXGI_FORMAT_R32G32B32A32_FLOAT = 2
566 DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
567 DXGI_FORMAT_R16_SINT = 59
568 DXGI_FORMAT_R16G16_SINT = 38
569 DXGI_FORMAT_R16_UINT = 57
570 DXGI_FORMAT_D24_UNORM_S8_UINT = 45
571 DXGI_FORMAT_R16G16_FLOAT = 34
572 DXGI_FORMAT_R16G16B16A16_FLOAT = 10
573
574 FORMAT_SUPPORT_TEXTURE2D = 0x20
575 FORMAT_SUPPORT_RENDER_TARGET = 0x4000
576
577 DXGI_USAGE_RENDER_TARGET_OUTPUT = 1 << (1 + 4)
578
579 CPU_ACCESS_READ = 0x20000
580
581 MAP_READ = 1
582
583 DXGI_SWAP_EFFECT_DISCARD = 0
584
585 FEATURE_LEVEL_9_1 = 0x9100
586 FEATURE_LEVEL_9_3 = 0x9300
587 FEATURE_LEVEL_11_0 = 0xb000
588
589 USAGE_IMMUTABLE = 1
590 USAGE_STAGING = 3
591
592 BIND_VERTEX_BUFFER = 0x1
593 BIND_INDEX_BUFFER = 0x2
594 BIND_CONSTANT_BUFFER = 0x4
595 BIND_SHADER_RESOURCE = 0x8
596 BIND_RENDER_TARGET = 0x20
597 BIND_DEPTH_STENCIL = 0x40
598
599 PRIMITIVE_TOPOLOGY_TRIANGLELIST = 4
600 PRIMITIVE_TOPOLOGY_TRIANGLESTRIP = 5
601
602 FILTER_MIN_MAG_LINEAR_MIP_POINT = 0x14
603 FILTER_MIN_MAG_MIP_POINT = 0
604
605 TEXTURE_ADDRESS_MIRROR = 2
606 TEXTURE_ADDRESS_CLAMP = 3
607 TEXTURE_ADDRESS_WRAP = 1
608
609 SRV_DIMENSION_TEXTURE2D = 4
610
611 CREATE_DEVICE_DEBUG = 0x2
612
613 FILL_SOLID = 3
614
615 CULL_NONE = 1
616
617 CLEAR_DEPTH = 0x1
618 CLEAR_STENCIL = 0x2
619
620 DSV_DIMENSION_TEXTURE2D = 3
621
622 DEPTH_WRITE_MASK_ALL = 1
623
624 COMPARISON_GREATER = 5
625 COMPARISON_GREATER_EQUAL = 7
626
627 BLEND_OP_ADD = 1
628 BLEND_ONE = 2
629 BLEND_INV_SRC_ALPHA = 6
630 BLEND_ZERO = 1
631 BLEND_DEST_COLOR = 9
632 BLEND_DEST_ALPHA = 7
633
634 COLOR_WRITE_ENABLE_ALL = 1 | 2 | 4 | 8
635
636 DXGI_STATUS_OCCLUDED = 0x087A0001
637 DXGI_ERROR_DEVICE_RESET = 0x887A0007
638 DXGI_ERROR_DEVICE_REMOVED = 0x887A0005
639 D3DDDIERR_DEVICEREMOVED = 1<<31 | 0x876<<16 | 2160
640 )
641
642 func CreateDevice(driverType uint32, flags uint32) (*Device, *DeviceContext, uint32, error) {
643 var (
644 dev *Device
645 ctx *DeviceContext
646 featLvl uint32
647 )
648 r, _, _ := _D3D11CreateDevice.Call(
649 0, // pAdapter
650 uintptr(driverType), // driverType
651 0, // Software
652 uintptr(flags), // Flags
653 0, // pFeatureLevels
654 0, // FeatureLevels
655 SDK_VERSION, // SDKVersion
656 uintptr(unsafe.Pointer(&dev)), // ppDevice
657 uintptr(unsafe.Pointer(&featLvl)), // pFeatureLevel
658 uintptr(unsafe.Pointer(&ctx)), // ppImmediateContext
659 )
660 if r != 0 {
661 return nil, nil, 0, ErrorCode{Name: "D3D11CreateDevice", Code: uint32(r)}
662 }
663 return dev, ctx, featLvl, nil
664 }
665
666 func CreateDeviceAndSwapChain(driverType uint32, flags uint32, swapDesc *DXGI_SWAP_CHAIN_DESC) (*Device, *DeviceContext, *IDXGISwapChain, uint32, error) {
667 var (
668 dev *Device
669 ctx *DeviceContext
670 swchain *IDXGISwapChain
671 featLvl uint32
672 )
673 r, _, _ := _D3D11CreateDeviceAndSwapChain.Call(
674 0, // pAdapter
675 uintptr(driverType), // driverType
676 0, // Software
677 uintptr(flags), // Flags
678 0, // pFeatureLevels
679 0, // FeatureLevels
680 SDK_VERSION, // SDKVersion
681 uintptr(unsafe.Pointer(swapDesc)), // pSwapChainDesc
682 uintptr(unsafe.Pointer(&swchain)), // ppSwapChain
683 uintptr(unsafe.Pointer(&dev)), // ppDevice
684 uintptr(unsafe.Pointer(&featLvl)), // pFeatureLevel
685 uintptr(unsafe.Pointer(&ctx)), // ppImmediateContext
686 )
687 if r != 0 {
688 return nil, nil, nil, 0, ErrorCode{Name: "D3D11CreateDeviceAndSwapChain", Code: uint32(r)}
689 }
690 return dev, ctx, swchain, featLvl, nil
691 }
692
693 func (d *Device) CheckFormatSupport(format uint32) (uint32, error) {
694 var support uint32
695 r, _, _ := syscall.Syscall(
696 d.Vtbl.CheckFormatSupport,
697 3,
698 uintptr(unsafe.Pointer(d)),
699 uintptr(format),
700 uintptr(unsafe.Pointer(&support)),
701 )
702 if r != 0 {
703 return 0, ErrorCode{Name: "DeviceCheckFormatSupport", Code: uint32(r)}
704 }
705 return support, nil
706 }
707
708 func (d *Device) CreateBuffer(desc *BUFFER_DESC, data []byte) (*Buffer, error) {
709 var dataDesc *SUBRESOURCE_DATA
710 if len(data) > 0 {
711 dataDesc = &SUBRESOURCE_DATA{
712 pSysMem: &data[0],
713 }
714 }
715 var buf *Buffer
716 r, _, _ := syscall.Syscall6(
717 d.Vtbl.CreateBuffer,
718 4,
719 uintptr(unsafe.Pointer(d)),
720 uintptr(unsafe.Pointer(desc)),
721 uintptr(unsafe.Pointer(dataDesc)),
722 uintptr(unsafe.Pointer(&buf)),
723 0, 0,
724 )
725 if r != 0 {
726 return nil, ErrorCode{Name: "DeviceCreateBuffer", Code: uint32(r)}
727 }
728 return buf, nil
729 }
730
731 func (d *Device) CreateDepthStencilViewTEX2D(res *Resource, desc *DEPTH_STENCIL_VIEW_DESC_TEX2D) (*DepthStencilView, error) {
732 var view *DepthStencilView
733 r, _, _ := syscall.Syscall6(
734 d.Vtbl.CreateDepthStencilView,
735 4,
736 uintptr(unsafe.Pointer(d)),
737 uintptr(unsafe.Pointer(res)),
738 uintptr(unsafe.Pointer(desc)),
739 uintptr(unsafe.Pointer(&view)),
740 0, 0,
741 )
742 if r != 0 {
743 return nil, ErrorCode{Name: "DeviceCreateDepthStencilView", Code: uint32(r)}
744 }
745 return view, nil
746 }
747
748 func (d *Device) CreatePixelShader(bytecode []byte) (*PixelShader, error) {
749 var shader *PixelShader
750 r, _, _ := syscall.Syscall6(
751 d.Vtbl.CreatePixelShader,
752 5,
753 uintptr(unsafe.Pointer(d)),
754 uintptr(unsafe.Pointer(&bytecode[0])),
755 uintptr(len(bytecode)),
756 0, // pClassLinkage
757 uintptr(unsafe.Pointer(&shader)),
758 0,
759 )
760 if r != 0 {
761 return nil, ErrorCode{Name: "DeviceCreatePixelShader", Code: uint32(r)}
762 }
763 return shader, nil
764 }
765
766 func (d *Device) CreateVertexShader(bytecode []byte) (*VertexShader, error) {
767 var shader *VertexShader
768 r, _, _ := syscall.Syscall6(
769 d.Vtbl.CreateVertexShader,
770 5,
771 uintptr(unsafe.Pointer(d)),
772 uintptr(unsafe.Pointer(&bytecode[0])),
773 uintptr(len(bytecode)),
774 0, // pClassLinkage
775 uintptr(unsafe.Pointer(&shader)),
776 0,
777 )
778 if r != 0 {
779 return nil, ErrorCode{Name: "DeviceCreateVertexShader", Code: uint32(r)}
780 }
781 return shader, nil
782 }
783
784 func (d *Device) CreateShaderResourceViewTEX2D(res *Resource, desc *SHADER_RESOURCE_VIEW_DESC_TEX2D) (*ShaderResourceView, error) {
785 var resView *ShaderResourceView
786 r, _, _ := syscall.Syscall6(
787 d.Vtbl.CreateShaderResourceView,
788 4,
789 uintptr(unsafe.Pointer(d)),
790 uintptr(unsafe.Pointer(res)),
791 uintptr(unsafe.Pointer(desc)),
792 uintptr(unsafe.Pointer(&resView)),
793 0, 0,
794 )
795 if r != 0 {
796 return nil, ErrorCode{Name: "DeviceCreateShaderResourceView", Code: uint32(r)}
797 }
798 return resView, nil
799 }
800
801 func (d *Device) CreateRasterizerState(desc *RASTERIZER_DESC) (*RasterizerState, error) {
802 var state *RasterizerState
803 r, _, _ := syscall.Syscall(
804 d.Vtbl.CreateRasterizerState,
805 3,
806 uintptr(unsafe.Pointer(d)),
807 uintptr(unsafe.Pointer(desc)),
808 uintptr(unsafe.Pointer(&state)),
809 )
810 if r != 0 {
811 return nil, ErrorCode{Name: "DeviceCreateRasterizerState", Code: uint32(r)}
812 }
813 return state, nil
814 }
815
816 func (d *Device) CreateInputLayout(descs []INPUT_ELEMENT_DESC, bytecode []byte) (*InputLayout, error) {
817 var pdesc *INPUT_ELEMENT_DESC
818 if len(descs) > 0 {
819 pdesc = &descs[0]
820 }
821 var layout *InputLayout
822 r, _, _ := syscall.Syscall6(
823 d.Vtbl.CreateInputLayout,
824 6,
825 uintptr(unsafe.Pointer(d)),
826 uintptr(unsafe.Pointer(pdesc)),
827 uintptr(len(descs)),
828 uintptr(unsafe.Pointer(&bytecode[0])),
829 uintptr(len(bytecode)),
830 uintptr(unsafe.Pointer(&layout)),
831 )
832 if r != 0 {
833 return nil, ErrorCode{Name: "DeviceCreateInputLayout", Code: uint32(r)}
834 }
835 return layout, nil
836 }
837
838 func (d *Device) CreateSamplerState(desc *SAMPLER_DESC) (*SamplerState, error) {
839 var sampler *SamplerState
840 r, _, _ := syscall.Syscall(
841 d.Vtbl.CreateSamplerState,
842 3,
843 uintptr(unsafe.Pointer(d)),
844 uintptr(unsafe.Pointer(desc)),
845 uintptr(unsafe.Pointer(&sampler)),
846 )
847 if r != 0 {
848 return nil, ErrorCode{Name: "DeviceCreateSamplerState", Code: uint32(r)}
849 }
850 return sampler, nil
851 }
852
853 func (d *Device) CreateTexture2D(desc *TEXTURE2D_DESC) (*Texture2D, error) {
854 var tex *Texture2D
855 r, _, _ := syscall.Syscall6(
856 d.Vtbl.CreateTexture2D,
857 4,
858 uintptr(unsafe.Pointer(d)),
859 uintptr(unsafe.Pointer(desc)),
860 0, // pInitialData
861 uintptr(unsafe.Pointer(&tex)),
862 0, 0,
863 )
864 if r != 0 {
865 return nil, ErrorCode{Name: "CreateTexture2D", Code: uint32(r)}
866 }
867 return tex, nil
868 }
869
870 func (d *Device) CreateRenderTargetView(res *Resource) (*RenderTargetView, error) {
871 var target *RenderTargetView
872 r, _, _ := syscall.Syscall6(
873 d.Vtbl.CreateRenderTargetView,
874 4,
875 uintptr(unsafe.Pointer(d)),
876 uintptr(unsafe.Pointer(res)),
877 0, // pDesc
878 uintptr(unsafe.Pointer(&target)),
879 0, 0,
880 )
881 if r != 0 {
882 return nil, ErrorCode{Name: "DeviceCreateRenderTargetView", Code: uint32(r)}
883 }
884 return target, nil
885 }
886
887 func (d *Device) CreateBlendState(desc *BLEND_DESC) (*BlendState, error) {
888 var state *BlendState
889 r, _, _ := syscall.Syscall(
890 d.Vtbl.CreateBlendState,
891 3,
892 uintptr(unsafe.Pointer(d)),
893 uintptr(unsafe.Pointer(desc)),
894 uintptr(unsafe.Pointer(&state)),
895 )
896 if r != 0 {
897 return nil, ErrorCode{Name: "DeviceCreateBlendState", Code: uint32(r)}
898 }
899 return state, nil
900 }
901
902 func (d *Device) CreateDepthStencilState(desc *DEPTH_STENCIL_DESC) (*DepthStencilState, error) {
903 var state *DepthStencilState
904 r, _, _ := syscall.Syscall(
905 d.Vtbl.CreateDepthStencilState,
906 3,
907 uintptr(unsafe.Pointer(d)),
908 uintptr(unsafe.Pointer(desc)),
909 uintptr(unsafe.Pointer(&state)),
910 )
911 if r != 0 {
912 return nil, ErrorCode{Name: "DeviceCreateDepthStencilState", Code: uint32(r)}
913 }
914 return state, nil
915 }
916
917 func (d *Device) GetFeatureLevel() int {
918 lvl, _, _ := syscall.Syscall(
919 d.Vtbl.GetFeatureLevel,
920 1,
921 uintptr(unsafe.Pointer(d)),
922 0, 0,
923 )
924 return int(lvl)
925 }
926
927 func (d *Device) GetImmediateContext() *DeviceContext {
928 var ctx *DeviceContext
929 syscall.Syscall(
930 d.Vtbl.GetImmediateContext,
931 2,
932 uintptr(unsafe.Pointer(d)),
933 uintptr(unsafe.Pointer(&ctx)),
934 0,
935 )
936 return ctx
937 }
938
939 func (s *IDXGISwapChain) GetDesc() (DXGI_SWAP_CHAIN_DESC, error) {
940 var desc DXGI_SWAP_CHAIN_DESC
941 r, _, _ := syscall.Syscall(
942 s.Vtbl.GetDesc,
943 2,
944 uintptr(unsafe.Pointer(s)),
945 uintptr(unsafe.Pointer(&desc)),
946 0,
947 )
948 if r != 0 {
949 return DXGI_SWAP_CHAIN_DESC{}, ErrorCode{Name: "IDXGISwapChainGetDesc", Code: uint32(r)}
950 }
951 return desc, nil
952 }
953
954 func (s *IDXGISwapChain) ResizeBuffers(buffers, width, height, newFormat, flags uint32) error {
955 r, _, _ := syscall.Syscall6(
956 s.Vtbl.ResizeBuffers,
957 6,
958 uintptr(unsafe.Pointer(s)),
959 uintptr(buffers),
960 uintptr(width),
961 uintptr(height),
962 uintptr(newFormat),
963 uintptr(flags),
964 )
965 if r != 0 {
966 return ErrorCode{Name: "IDXGISwapChainResizeBuffers", Code: uint32(r)}
967 }
968 return nil
969 }
970
971 func (s *IDXGISwapChain) Present(SyncInterval int, Flags uint32) error {
972 r, _, _ := syscall.Syscall(
973 s.Vtbl.Present,
974 3,
975 uintptr(unsafe.Pointer(s)),
976 uintptr(SyncInterval),
977 uintptr(Flags),
978 )
979 if r != 0 {
980 return ErrorCode{Name: "IDXGISwapChainPresent", Code: uint32(r)}
981 }
982 return nil
983 }
984
985 func (s *IDXGISwapChain) GetBuffer(index int, riid *GUID) (*IUnknown, error) {
986 var buf *IUnknown
987 r, _, _ := syscall.Syscall6(
988 s.Vtbl.GetBuffer,
989 4,
990 uintptr(unsafe.Pointer(s)),
991 uintptr(index),
992 uintptr(unsafe.Pointer(riid)),
993 uintptr(unsafe.Pointer(&buf)),
994 0,
995 0,
996 )
997 if r != 0 {
998 return nil, ErrorCode{Name: "IDXGISwapChainGetBuffer", Code: uint32(r)}
999 }
1000 return buf, nil
1001 }
1002
1003 func (c *DeviceContext) Unmap(resource *Resource, subResource uint32) {
1004 syscall.Syscall(
1005 c.Vtbl.Unmap,
1006 3,
1007 uintptr(unsafe.Pointer(c)),
1008 uintptr(unsafe.Pointer(resource)),
1009 uintptr(subResource),
1010 )
1011 }
1012
1013 func (c *DeviceContext) Map(resource *Resource, subResource, mapType, mapFlags uint32) (MAPPED_SUBRESOURCE, error) {
1014 var resMap MAPPED_SUBRESOURCE
1015 r, _, _ := syscall.Syscall6(
1016 c.Vtbl.Map,
1017 6,
1018 uintptr(unsafe.Pointer(c)),
1019 uintptr(unsafe.Pointer(resource)),
1020 uintptr(subResource),
1021 uintptr(mapType),
1022 uintptr(mapFlags),
1023 uintptr(unsafe.Pointer(&resMap)),
1024 )
1025 if r != 0 {
1026 return resMap, ErrorCode{Name: "DeviceContextMap", Code: uint32(r)}
1027 }
1028 return resMap, nil
1029 }
1030
1031 func (c *DeviceContext) CopySubresourceRegion(dst *Resource, dstSubresource, dstX, dstY, dstZ uint32, src *Resource, srcSubresource uint32, srcBox *BOX) {
1032 syscall.Syscall9(
1033 c.Vtbl.CopySubresourceRegion,
1034 9,
1035 uintptr(unsafe.Pointer(c)),
1036 uintptr(unsafe.Pointer(dst)),
1037 uintptr(dstSubresource),
1038 uintptr(dstX),
1039 uintptr(dstY),
1040 uintptr(dstZ),
1041 uintptr(unsafe.Pointer(src)),
1042 uintptr(srcSubresource),
1043 uintptr(unsafe.Pointer(srcBox)),
1044 )
1045 }
1046
1047 func (c *DeviceContext) ClearDepthStencilView(target *DepthStencilView, flags uint32, depth float32, stencil uint8) {
1048 syscall.Syscall6(
1049 c.Vtbl.ClearDepthStencilView,
1050 5,
1051 uintptr(unsafe.Pointer(c)),
1052 uintptr(unsafe.Pointer(target)),
1053 uintptr(flags),
1054 uintptr(math.Float32bits(depth)),
1055 uintptr(stencil),
1056 0,
1057 )
1058 }
1059
1060 func (c *DeviceContext) ClearRenderTargetView(target *RenderTargetView, color *[4]float32) {
1061 syscall.Syscall(
1062 c.Vtbl.ClearRenderTargetView,
1063 3,
1064 uintptr(unsafe.Pointer(c)),
1065 uintptr(unsafe.Pointer(target)),
1066 uintptr(unsafe.Pointer(color)),
1067 )
1068 }
1069
1070 func (c *DeviceContext) RSSetViewports(viewport *VIEWPORT) {
1071 syscall.Syscall(
1072 c.Vtbl.RSSetViewports,
1073 3,
1074 uintptr(unsafe.Pointer(c)),
1075 1, // NumViewports
1076 uintptr(unsafe.Pointer(viewport)),
1077 )
1078 }
1079
1080 func (c *DeviceContext) VSSetShader(s *VertexShader) {
1081 syscall.Syscall6(
1082 c.Vtbl.VSSetShader,
1083 4,
1084 uintptr(unsafe.Pointer(c)),
1085 uintptr(unsafe.Pointer(s)),
1086 0, // ppClassInstances
1087 0, // NumClassInstances
1088 0, 0,
1089 )
1090 }
1091
1092 func (c *DeviceContext) VSSetConstantBuffers(b *Buffer) {
1093 syscall.Syscall6(
1094 c.Vtbl.VSSetConstantBuffers,
1095 4,
1096 uintptr(unsafe.Pointer(c)),
1097 0, // StartSlot
1098 1, // NumBuffers
1099 uintptr(unsafe.Pointer(&b)),
1100 0, 0,
1101 )
1102 }
1103
1104 func (c *DeviceContext) PSSetConstantBuffers(b *Buffer) {
1105 syscall.Syscall6(
1106 c.Vtbl.PSSetConstantBuffers,
1107 4,
1108 uintptr(unsafe.Pointer(c)),
1109 0, // StartSlot
1110 1, // NumBuffers
1111 uintptr(unsafe.Pointer(&b)),
1112 0, 0,
1113 )
1114 }
1115
1116 func (c *DeviceContext) PSSetShaderResources(startSlot uint32, s *ShaderResourceView) {
1117 syscall.Syscall6(
1118 c.Vtbl.PSSetShaderResources,
1119 4,
1120 uintptr(unsafe.Pointer(c)),
1121 uintptr(startSlot),
1122 1, // NumViews
1123 uintptr(unsafe.Pointer(&s)),
1124 0, 0,
1125 )
1126 }
1127
1128 func (c *DeviceContext) PSSetSamplers(startSlot uint32, s *SamplerState) {
1129 syscall.Syscall6(
1130 c.Vtbl.PSSetSamplers,
1131 4,
1132 uintptr(unsafe.Pointer(c)),
1133 uintptr(startSlot),
1134 1, // NumSamplers
1135 uintptr(unsafe.Pointer(&s)),
1136 0, 0,
1137 )
1138 }
1139
1140 func (c *DeviceContext) PSSetShader(s *PixelShader) {
1141 syscall.Syscall6(
1142 c.Vtbl.PSSetShader,
1143 4,
1144 uintptr(unsafe.Pointer(c)),
1145 uintptr(unsafe.Pointer(s)),
1146 0, // ppClassInstances
1147 0, // NumClassInstances
1148 0, 0,
1149 )
1150 }
1151
1152 func (c *DeviceContext) UpdateSubresource(res *Resource, dstBox *BOX, rowPitch, depthPitch uint32, data []byte) {
1153 syscall.Syscall9(
1154 c.Vtbl.UpdateSubresource,
1155 7,
1156 uintptr(unsafe.Pointer(c)),
1157 uintptr(unsafe.Pointer(res)),
1158 0, // DstSubresource
1159 uintptr(unsafe.Pointer(dstBox)),
1160 uintptr(unsafe.Pointer(&data[0])),
1161 uintptr(rowPitch),
1162 uintptr(depthPitch),
1163 0, 0,
1164 )
1165 }
1166
1167 func (c *DeviceContext) RSSetState(state *RasterizerState) {
1168 syscall.Syscall(
1169 c.Vtbl.RSSetState,
1170 2,
1171 uintptr(unsafe.Pointer(c)),
1172 uintptr(unsafe.Pointer(state)),
1173 0,
1174 )
1175 }
1176
1177 func (c *DeviceContext) IASetInputLayout(layout *InputLayout) {
1178 syscall.Syscall(
1179 c.Vtbl.IASetInputLayout,
1180 2,
1181 uintptr(unsafe.Pointer(c)),
1182 uintptr(unsafe.Pointer(layout)),
1183 0,
1184 )
1185 }
1186
1187 func (c *DeviceContext) IASetIndexBuffer(buf *Buffer, format, offset uint32) {
1188 syscall.Syscall6(
1189 c.Vtbl.IASetIndexBuffer,
1190 4,
1191 uintptr(unsafe.Pointer(c)),
1192 uintptr(unsafe.Pointer(buf)),
1193 uintptr(format),
1194 uintptr(offset),
1195 0, 0,
1196 )
1197 }
1198
1199 func (c *DeviceContext) IASetVertexBuffers(buf *Buffer, stride, offset uint32) {
1200 syscall.Syscall6(
1201 c.Vtbl.IASetVertexBuffers,
1202 6,
1203 uintptr(unsafe.Pointer(c)),
1204 0, // StartSlot
1205 1, // NumBuffers,
1206 uintptr(unsafe.Pointer(&buf)),
1207 uintptr(unsafe.Pointer(&stride)),
1208 uintptr(unsafe.Pointer(&offset)),
1209 )
1210 }
1211
1212 func (c *DeviceContext) IASetPrimitiveTopology(mode uint32) {
1213 syscall.Syscall(
1214 c.Vtbl.IASetPrimitiveTopology,
1215 2,
1216 uintptr(unsafe.Pointer(c)),
1217 uintptr(mode),
1218 0,
1219 )
1220 }
1221
1222 func (c *DeviceContext) OMGetRenderTargets() (*RenderTargetView, *DepthStencilView) {
1223 var (
1224 target *RenderTargetView
1225 depthStencilView *DepthStencilView
1226 )
1227 syscall.Syscall6(
1228 c.Vtbl.OMGetRenderTargets,
1229 4,
1230 uintptr(unsafe.Pointer(c)),
1231 1, // NumViews
1232 uintptr(unsafe.Pointer(&target)),
1233 uintptr(unsafe.Pointer(&depthStencilView)),
1234 0, 0,
1235 )
1236 return target, depthStencilView
1237 }
1238
1239 func (c *DeviceContext) OMSetRenderTargets(target *RenderTargetView, depthStencil *DepthStencilView) {
1240 syscall.Syscall6(
1241 c.Vtbl.OMSetRenderTargets,
1242 4,
1243 uintptr(unsafe.Pointer(c)),
1244 1, // NumViews
1245 uintptr(unsafe.Pointer(&target)),
1246 uintptr(unsafe.Pointer(depthStencil)),
1247 0, 0,
1248 )
1249 }
1250
1251 func (c *DeviceContext) Draw(count, start uint32) {
1252 syscall.Syscall(
1253 c.Vtbl.Draw,
1254 3,
1255 uintptr(unsafe.Pointer(c)),
1256 uintptr(count),
1257 uintptr(start),
1258 )
1259 }
1260
1261 func (c *DeviceContext) DrawIndexed(count, start uint32, base int32) {
1262 syscall.Syscall6(
1263 c.Vtbl.DrawIndexed,
1264 4,
1265 uintptr(unsafe.Pointer(c)),
1266 uintptr(count),
1267 uintptr(start),
1268 uintptr(base),
1269 0, 0,
1270 )
1271 }
1272
1273 func (c *DeviceContext) OMSetBlendState(state *BlendState, factor *f32color.RGBA, sampleMask uint32) {
1274 syscall.Syscall6(
1275 c.Vtbl.OMSetBlendState,
1276 4,
1277 uintptr(unsafe.Pointer(c)),
1278 uintptr(unsafe.Pointer(state)),
1279 uintptr(unsafe.Pointer(factor)),
1280 uintptr(sampleMask),
1281 0, 0,
1282 )
1283 }
1284
1285 func (c *DeviceContext) OMSetDepthStencilState(state *DepthStencilState, stencilRef uint32) {
1286 syscall.Syscall(
1287 c.Vtbl.OMSetDepthStencilState,
1288 3,
1289 uintptr(unsafe.Pointer(c)),
1290 uintptr(unsafe.Pointer(state)),
1291 uintptr(stencilRef),
1292 )
1293 }
1294
1295 func (d *IDXGIObject) GetParent(guid *GUID) (*IDXGIObject, error) {
1296 var parent *IDXGIObject
1297 r, _, _ := syscall.Syscall(
1298 d.Vtbl.GetParent,
1299 3,
1300 uintptr(unsafe.Pointer(d)),
1301 uintptr(unsafe.Pointer(guid)),
1302 uintptr(unsafe.Pointer(&parent)),
1303 )
1304 if r != 0 {
1305 return nil, ErrorCode{Name: "IDXGIObjectGetParent", Code: uint32(r)}
1306 }
1307 return parent, nil
1308 }
1309
1310 func (d *IDXGIFactory) CreateSwapChain(device *IUnknown, desc *DXGI_SWAP_CHAIN_DESC) (*IDXGISwapChain, error) {
1311 var swchain *IDXGISwapChain
1312 r, _, _ := syscall.Syscall6(
1313 d.Vtbl.CreateSwapChain,
1314 4,
1315 uintptr(unsafe.Pointer(d)),
1316 uintptr(unsafe.Pointer(device)),
1317 uintptr(unsafe.Pointer(desc)),
1318 uintptr(unsafe.Pointer(&swchain)),
1319 0, 0,
1320 )
1321 if r != 0 {
1322 return nil, ErrorCode{Name: "IDXGIFactory", Code: uint32(r)}
1323 }
1324 return swchain, nil
1325 }
1326
1327 func (d *IDXGIDevice) GetAdapter() (*IDXGIAdapter, error) {
1328 var adapter *IDXGIAdapter
1329 r, _, _ := syscall.Syscall(
1330 d.Vtbl.GetAdapter,
1331 2,
1332 uintptr(unsafe.Pointer(d)),
1333 uintptr(unsafe.Pointer(&adapter)),
1334 0,
1335 )
1336 if r != 0 {
1337 return nil, ErrorCode{Name: "IDXGIDeviceGetAdapter", Code: uint32(r)}
1338 }
1339 return adapter, nil
1340 }
1341
1342 func IUnknownQueryInterface(obj unsafe.Pointer, queryInterfaceMethod uintptr, guid *GUID) (*IUnknown, error) {
1343 var ref *IUnknown
1344 r, _, _ := syscall.Syscall(
1345 queryInterfaceMethod,
1346 3,
1347 uintptr(obj),
1348 uintptr(unsafe.Pointer(guid)),
1349 uintptr(unsafe.Pointer(&ref)),
1350 )
1351 if r != 0 {
1352 return nil, ErrorCode{Name: "IUnknownQueryInterface", Code: uint32(r)}
1353 }
1354 return ref, nil
1355 }
1356
1357 func IUnknownRelease(obj unsafe.Pointer, releaseMethod uintptr) {
1358 syscall.Syscall(
1359 releaseMethod,
1360 1,
1361 uintptr(obj),
1362 0,
1363 0,
1364 )
1365 }
1366
1367 func (e ErrorCode) Error() string {
1368 return fmt.Sprintf("%s: %#x", e.Name, e.Code)
1369 }
1370
1371 func CreateSwapChain(dev *Device, hwnd windows.Handle) (*IDXGISwapChain, error) {
1372 dxgiDev, err := IUnknownQueryInterface(unsafe.Pointer(dev), dev.Vtbl.QueryInterface, &IID_IDXGIDevice)
1373 if err != nil {
1374 return nil, fmt.Errorf("NewContext: %v", err)
1375 }
1376 adapter, err := (*IDXGIDevice)(unsafe.Pointer(dxgiDev)).GetAdapter()
1377 IUnknownRelease(unsafe.Pointer(dxgiDev), dxgiDev.Vtbl.Release)
1378 if err != nil {
1379 return nil, fmt.Errorf("NewContext: %v", err)
1380 }
1381 dxgiFactory, err := (*IDXGIObject)(unsafe.Pointer(adapter)).GetParent(&IID_IDXGIFactory)
1382 IUnknownRelease(unsafe.Pointer(adapter), adapter.Vtbl.Release)
1383 if err != nil {
1384 return nil, fmt.Errorf("NewContext: %v", err)
1385 }
1386 swchain, err := (*IDXGIFactory)(unsafe.Pointer(dxgiFactory)).CreateSwapChain(
1387 (*IUnknown)(unsafe.Pointer(dev)),
1388 &DXGI_SWAP_CHAIN_DESC{
1389 BufferDesc: DXGI_MODE_DESC{
1390 Format: DXGI_FORMAT_R8G8B8A8_UNORM_SRGB,
1391 },
1392 SampleDesc: DXGI_SAMPLE_DESC{
1393 Count: 1,
1394 },
1395 BufferUsage: DXGI_USAGE_RENDER_TARGET_OUTPUT,
1396 BufferCount: 1,
1397 OutputWindow: hwnd,
1398 Windowed: 1,
1399 SwapEffect: DXGI_SWAP_EFFECT_DISCARD,
1400 },
1401 )
1402 IUnknownRelease(unsafe.Pointer(dxgiFactory), dxgiFactory.Vtbl.Release)
1403 if err != nil {
1404 return nil, fmt.Errorf("NewContext: %v", err)
1405 }
1406 return swchain, nil
1407 }
1408
1409 func CreateDepthView(d *Device, width, height, depthBits int) (*DepthStencilView, error) {
1410 depthTex, err := d.CreateTexture2D(&TEXTURE2D_DESC{
1411 Width: uint32(width),
1412 Height: uint32(height),
1413 MipLevels: 1,
1414 ArraySize: 1,
1415 Format: DXGI_FORMAT_D24_UNORM_S8_UINT,
1416 SampleDesc: DXGI_SAMPLE_DESC{
1417 Count: 1,
1418 Quality: 0,
1419 },
1420 BindFlags: BIND_DEPTH_STENCIL,
1421 })
1422 if err != nil {
1423 return nil, err
1424 }
1425 depthView, err := d.CreateDepthStencilViewTEX2D(
1426 (*Resource)(unsafe.Pointer(depthTex)),
1427 &DEPTH_STENCIL_VIEW_DESC_TEX2D{
1428 Format: DXGI_FORMAT_D24_UNORM_S8_UINT,
1429 ViewDimension: DSV_DIMENSION_TEXTURE2D,
1430 },
1431 )
1432 IUnknownRelease(unsafe.Pointer(depthTex), depthTex.Vtbl.Release)
1433 return depthView, err
1434 }
1435