Code: Alles auswählen
;-----------------------
;DXGI - Screen Capture
;Author: mijikai
;Version: DRAFT 12
;PureBasic v.5.62 / x64
;Windows 10 / x64
;-----------------------
Import "dxgi.lib"
CreateDXGIFactory(uuid.i,*pFactory)
CreateDXGIFactory1(riid.i,*ppFactory)
EndImport
Import "d3d11.lib"
D3D11CreateDevice(*pAdapter,DriverType.i,Software.i,Flags.i,*pFeatureLevels,FeatureLevels.i,SDKVersion.i,*ppDevice,*pFeatureLevel,*ppImmediateContext)
EndImport
Interface IDXGIObject Extends IUnknown;uuid( aec22fb8-76f3-4639-9be0-28eb43a67a2e )
SetPrivateData(Name.i,DataSize.i,pData)
SetPrivateDataInterface(Name.i,*pUnknown)
GetPrivateData(Name.i,*pDataSize,*pData)
GetParent(riid,*ppParent)
EndInterface
Interface IDXGIDevice Extends IDXGIObject
GetAdapter(*pAdapter)
CreateSurface(*pDesc,NumSurfaces.i,Usage.i,*pSharedResource,*ppSurface)
QueryResourceResidency(*ppResources,*pResidencyStatus,NumResources.i)
SetGPUThreadPriority(Priority.i)
GetGPUThreadPriority(*pPriority)
EndInterface
Interface IDXGIOutput Extends IDXGIObject;uuid( ae02eedb-c735-4690-8d52-5a8dc20213aa )
GetDesc(*pDesc)
GetDisplayModeList(EnumFormat.i,Flags.i,*pNumModes,*pDesc)
FindClosestMatchingMode(*pModeToMatch,*pClosestMatch,*pConcernedDevice)
WaitForVBlank()
TakeOwnership(*pDevice,Exclusive.b)
ReleaseOwnership()
GetGammaControlCapabilities(*pGammaCaps)
SetGammaControl(*pArray)
GetGammaControl(*pArray)
SetDisplaySurface(*pScanoutSurface)
GetDisplaySurfaceData(*pDestination)
GetFrameStatistics(*pStats)
EndInterface
Interface IDXGIOutput1 Extends IDXGIOutput;uuid( 00cddea8-939b-4b83-a340-a685226666cc )
GetDisplayModeList1(EnumFormat.i,Flags.i,*pNumModes,*pDesc)
FindClosestMatchingMode1(*pModeToMatch,*pClosestMatch,*pConcernedDevice)
GetDisplaySurfaceData1(*pDestination)
DuplicateOutput(*pDevice,*ppOutputDuplication)
EndInterface
Interface IDXGIAdapter Extends IDXGIObject;uuid( 2411e7e1-12ac-4ccf-bd14-9798e8534dc0 )
EnumOutputs(Output.i,*ppOutput)
GetDesc(*pDesc )
CheckInterfaceSupport(InterfaceName.i,*pUMDVersion)
EndInterface
Interface IDXGIAdapter1 Extends IDXGIAdapter;uuid( 29038f61-3839-4626-91fd-086879011a05 )
GetDesc1(*pDesc )
EndInterface
Interface IDXGIOutputDuplication Extends IDXGIObject
GetDesc(*pDesc)
AcquireNextFrame(TimeoutInMilliseconds.i,*pFrameInfo,*ppDesktopResource)
GetFrameDirtyRects(DirtyRectsBufferSize.i,*pDirtyRectsBuffer,*pDirtyRectsBufferSizeRequired)
GetFrameMoveRects(MoveRectsBufferSize.i,*pMoveRectBuffer,*pMoveRectsBufferSizeRequired)
GetFramePointerShape(PointerShapeBufferSize.i,*pPointerShapeBuffer,*pPointerShapeBufferSizeRequired,*pPointerShapeInfo)
MapDesktopSurface(*pLockedRect)
UnMapDesktopSurface()
ReleaseFrame()
EndInterface
Interface IDXGIFactory Extends IDXGIObject;uuid( 7b7166ec-21c7-44ae-b21a-c9ae321ae369 )
EnumAdapters(Adapter.i,*ppAdapter)
MakeWindowAssociation(WindowHandle.i,Flags.i)
GetWindowAssociation(*pWindowHandle)
CreateSwapChain(*pDevice,*pDesc,*ppSwapChain)
CreateSoftwareAdapter(hModule.i,*ppAdapter)
EndInterface
Interface IDXGIFactory1 Extends IDXGIFactory;uuid( 770aae78-f26f-4dba-a829-253c83d1b387 )
EnumAdapters1(Adapter.i,*ppAdapter )
IsCurrent()
EndInterface
Interface ID3D11Texture2D
QueryInterface(a.i, b.i)
AddRef()
Release()
GetDevice(a.i)
GetPrivateData(a.i, b.i, c.i)
SetPrivateData(a.i, b.i, c.i)
SetPrivateDataInterface(a.i, b.i)
GetType(a.i)
SetEvictionPriority(a.i)
GetEvictionPriority()
GetDesc(a.i)
EndInterface
Interface ID3D11Device
QueryInterface(a.i,b.i)
AddRef()
Release()
CreateBuffer(a.i,b.i,c.i)
CreateTexture1D(a.i,b.i,c.i)
CreateTexture2D(a.i,b.i,c.i)
CreateTexture3D(a.i,b.i,c.i)
CreateShaderResourceView(a.i,b.i,c.i)
CreateUnorderedAccessView(a.i,b.i,c.i)
CreateRenderTargetView(a.i,b.i,c.i)
CreateDepthStencilView(a.i,b.i,c.i)
CreateInputLayout(a.i,b.i,c.i,d.i,e.i)
CreateVertexShader(a.i,b.i,c.i,d.i)
CreateGeometryShader(a.i,b.i,c.i,d.i)
CreateGeometryShaderWithStreamOutput(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i,i.i,j.i,k.i)
CreatePixelShader(a.i,b.i,c.i,d.i)
CreateHullShader(a.i,b.i,c.i,d.i)
CreateDomainShader(a.i,b.i,c.i,d.i)
CreateComputeShader(a.i,b.i,c.i,d.i)
CreateClassLinkage(a.i)
CreateBlendState(a.i,b.i)
CreateDepthStencilState(a.i,b.i)
CreateRasterizerState(a.i,b.i)
CreateSamplerState(a.i,b.i)
CreateQuery(a.i,b.i)
CreatePredicate(a.i,b.i)
CreateCounter(a.i,b.i)
CreateDeferredContext(a.i,b.i)
OpenSharedResource(a.i,b.i,c.i)
CheckFormatSupport(a.i,b.i)
CheckMultisampleQualityLevels(a.i,b.i,c.i)
CheckCounterInfo(a.i)
CheckCounter(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i,i.i)
CheckFeatureSupport(a.i,b.i,c.i)
GetPrivateData(a.i,b.i,c.i)
SetPrivateData(a.i,b.i,c.i)
SetPrivateDataInterface(a.i,b.i)
GetFeatureLevel()
GetCreationFlags()
GetDeviceRemovedReason()
GetImmediateContext(a.i)
SetExceptionMode(a.i)
GetExceptionMode()
EndInterface
Interface ID3D11DeviceChild Extends IUnknown
GetDevice(a.i)
GetPrivateData(a.i,b.i,c.i)
SetPrivateData(a.i,b.i,c.i)
SetPrivateDataInterface(a.i,b.i)
EndInterface
Interface ID3D11DeviceContext Extends ID3D11DeviceChild
VSSetConstantBuffers(a.i,b.i,c.i)
PSSetShaderResources(a.i,b.i,c.i)
PSSetShader(a.i,b.i,c.i)
PSSetSamplers(a.i,b.i,c.i)
VSSetShader(a.i,b.i,c.i)
DrawIndexed(a.i,b.i,c.i)
Draw(a.i,b.i)
Map_(a.i,b.i,c.i,d.i,e.i)
Unmap(a.i,b.i)
PSSetConstantBuffers(a.i,b.i,c.i)
IASetInputLayout(a.i)
IASetVertexBuffers(a.i,b.i,c.i,d.i,e.i)
IASetIndexBuffer(a.i,b.i,c.i)
DrawIndexedInstanced(a.i,b.i,c.i,d.i,e.i)
DrawInstanced(a.i,b.i,c.i,d.i)
GSSetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
GSSetShader(a.i,b.i,c.i)
IASetPrimitiveTopology(a.i)
VSSetShaderResources(a.i,b.i,c.i,d.i,e.i)
VSSetSamplers(a.i,b.i,c.i,d.i,e.i)
Begin(a.i)
End_(a.i)
GetData(a.i,b.i,c.i,d.i)
SetPredication(a.i,b.i)
GSSetShaderResources(a.i,b.i,c.i,d.i,e.i)
GSSetSamplers(a.i,b.i,c.i,d.i,e.i)
OMSetRenderTargets(a.i,b.i,c.i)
OMSetRenderTargetsAndUnorderedAccessViews(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i)
OMSetBlendState(a.i,b.i,c.i)
OMSetDepthStencilState(a.i,b.i)
SOSetTargets(a.i,b.i,c.i,d.i)
DrawAuto()
DrawIndexedInstancedIndirect(a.i,b.i)
DrawInstancedIndirect(a.i,b.i)
Dispatch(a.i,b.i,c.i)
DispatchIndirect(a.i,b.i)
RSSetState(a.i)
RSSetViewports(a.i,b.i)
RSSetScissorRects(a.i,b.i,c.i)
CopySubresourceRegion(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i)
CopyResource(a.i,b.i)
UpdateSubresource(a.i,b.i,c.i,d.i,e.i,f.i)
CopyStructureCount(a.i,b.i,c.i)
ClearRenderTargetView(a.i,b.i)
ClearUnorderedAccessViewUint(a.i,b.i)
ClearUnorderedAccessViewFloat(a.i,b.i)
ClearDepthStencilView(a.i,b.i,c.f,d.i)
GenerateMips(a.i)
SetResourceMinLOD(a.i,b.i)
GetResourceMinLOD(a.i)
ResolveSubresource(a.i,b.i,c.i,d.i,e.i)
ExecuteCommandList(a.i,b.i)
HSSetShaderResources(a.i,b.i,c.i,d.i,e.i)
HSSetShader(a.i,b.i,c.i)
HSSetSamplers(a.i,b.i,c.i,d.i,e.i)
HSSetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
DSSetShaderResources(a.i,b.i,c.i,d.i,e.i)
DSSetShader(a.i,b.i,c.i)
DSSetSamplers(a.i,b.i,c.i,d.i,e.i)
DSSetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
CSSetShaderResources(a.i,b.i,c.i,d.i,e.i)
CSSetUnorderedAccessViews(a.i,b.i,c.i,d.i,e.i,f.i)
CSSetShader(a.i,b.i,c.i)
CSSetSamplers(a.i,b.i,c.i,d.i,e.i)
CSSetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
VSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
PSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
PSGetShader(a.i,b.i,c.i)
PSGetSamplers(a.i,b.i,c.i,d.i,e.i)
VSGetShader(a.i,b.i,c.i)
PSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
IAGetInputLayout(a.i)
IAGetVertexBuffers(a.i,b.i,c.i,d.i,e.i,f.i,g.i)
IAGetIndexBuffer(a.i,b.i,c.i)
GSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
GSGetShader(a.i,b.i,c.i)
IAGetPrimitiveTopology(a.i)
VSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
VSGetSamplers(a.i,b.i,c.i,d.i,e.i)
GetPredication(a.i,b.i)
GSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
GSGetSamplers(a.i,b.i,c.i,d.i,e.i)
OMGetRenderTargets(a.i,b.i,c.i,d.i)
OMGetRenderTargetsAndUnorderedAccessViews(a.i,b.i,c.i,d.i,e.i,f.i,g.i,h.i,i.i)
OMGetBlendState(a.i,b.i,c.i)
OMGetDepthStencilState(a.i,b.i)
SOGetTargets(a.i,b.i,c.i)
RSGetState(a.i)
RSGetViewports(a.i,b.i)
RSGetScissorRects(a.i,b.i)
HSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
HSGetShader(a.i,b.i,c.i)
HSGetSamplers(a.i,b.i,c.i,d.i,e.i)
HSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
DSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
DSGetShader(a.i,b.i,c.i)
DSGetSamplers(a.i,b.i,c.i,d.i,e.i)
DSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
CSGetShaderResources(a.i,b.i,c.i,d.i,e.i)
CSGetUnorderedAccessViews(a.i,b.i,c.i,d.i,e.i)
CSGetShader(a.i,b.i,c.i)
CSGetSamplers(a.i,b.i,c.i,d.i,e.i)
CSGetConstantBuffers(a.i,b.i,c.i,d.i,e.i)
ClearState()
Flush()
GetType()
GetContextFlags()
FinishCommandList(a.i,b.i)
EndInterface
Structure DXGI_OUTPUT_DESC
DeviceName.s{32}
DesktopCoordinates.RECT
AttachedToDesktop.b
Rotation.b
Monitor.i
EndStructure
Enumeration DXGI_MODE_ROTATION
#DXGI_MODE_ROTATION_UNSPECIFIED
#DXGI_MODE_ROTATION_IDENTITY
#DXGI_MODE_ROTATION_ROTATE90
#DXGI_MODE_ROTATION_ROTATE180
#DXGI_MODE_ROTATION_ROTATE270
EndEnumeration
#DXGI_ERROR_NOT_FOUND = $887A0002
#D3D_DRIVER_TYPE_UNKNOWN = 0
#D3D11_SDK_VERSION = 7
#D3D_FEATURE_LEVEL_11_0 = $B000
#D3D_FEATURE_LEVEL_9_1 = $9100
#DXGI_FORMAT_B8G8R8A8_UNORM = 87
#D3D11_USAGE_STAGING = 3
#D3D11_CPU_ACCESS_READ = $20000
Structure DXGI_SAMPLE_DESC
Count.i
Quality.i
EndStructure
Structure D3D11_TEXTURE2D_DESC
Width.i
Height.i
MipLevels.i
ArraySize.i
Format.i
SampleDesc.DXGI_SAMPLE_DESC
Usage.i
BindFlags.i
CPUAccessFlags.i
MiscFlags.i
EndStructure
Structure DXGI_OUTPUT_STRUCT
*DXGIOutput.IDXGIOutput
*DXGIOutput1.IDXGIOutput1
*D3D11Device.ID3D11Device
*D3D11DeviceContext.ID3D11DeviceContext
*DXGIOutputDuplication.IDXGIOutputDuplication
*D3D11Texture2D.ID3D11Texture2D
Description.DXGI_OUTPUT_DESC
Texture.D3D11_TEXTURE2D_DESC
EndStructure
Structure DXGI_ADAPTER_STRUCT
*DXGIAdapter1.IDXGIAdapter1
EndStructure
Structure DXGI_STRUCT
*DXGIFactory1.IDXGIFactory1
List Adapter.DXGI_ADAPTER_STRUCT()
List Output.DXGI_OUTPUT_STRUCT()
EndStructure
Global DXGI.DXGI_STRUCT
Procedure.i dxgiRelease()
With DXGI
ForEach \Output()
If \Output()\D3D11Texture2D
\Output()\D3D11Texture2D\Release()
EndIf
If \Output()\DXGIOutputDuplication
\Output()\DXGIOutputDuplication\Release()
EndIf
If \Output()\D3D11DeviceContext
\Output()\D3D11DeviceContext\Release()
EndIf
If \Output()\D3D11Device
\Output()\D3D11Device\Release()
EndIf
If \Output()\DXGIOutput1
\Output()\DXGIOutput1\Release()
EndIf
If \Output()\DXGIOutput
\Output()\DXGIOutput\Release()
EndIf
Next
ForEach \Adapter()
If \Adapter()\DXGIAdapter1
\Adapter()\DXGIAdapter1\Release()
EndIf
Next
ClearList(\Output())
ClearList(\Adapter())
If \DXGIFactory1
\DXGIFactory1\Release()
\DXGIFactory1 = #Null
EndIf
EndWith
EndProcedure
Procedure.i dxgiInit()
Protected Index.i
Protected *Adapter
Protected *Output.IDXGIOutput1
Protected *Device.ID3D11Device
Protected *DeviceContext.ID3D11DeviceContext
Protected Description.DXGI_OUTPUT_DESC
Protected FeatureLevel.i
Protected Result.i
FeatureLevel = #D3D_FEATURE_LEVEL_11_0
With DXGI
dxgiRelease()
If CreateDXGIFactory1(?UUID_IDXGIFactory1,@\DXGIFactory1) = #S_OK
While Not \DXGIFactory1\EnumAdapters1(Index,@*Adapter) = #DXGI_ERROR_NOT_FOUND
If AddElement(\Adapter())
\Adapter()\DXGIAdapter1 = *Adapter
EndIf
Index + 1
Wend
ForEach \Adapter()
If \Adapter()\DXGIAdapter1
Index = 0
While Not \Adapter()\DXGIAdapter1\EnumOutputs(Index,@*Output) = #DXGI_ERROR_NOT_FOUND
If *Output\GetDesc(@Description) = #S_OK
If Description\AttachedToDesktop;IS THE OUTPUT RELEVANT?
If D3D11CreateDevice(\Adapter()\DXGIAdapter1,#D3D_DRIVER_TYPE_UNKNOWN,#Null,#Null,#Null,#Null,#D3D11_SDK_VERSION,@*Device,@FeatureLevel,@*DeviceContext) = #S_OK
If AddElement(\Output())
\Output()\DXGIOutput = *Output
\Output()\D3D11Device = *Device
\Output()\D3D11DeviceContext = *DeviceContext
If \Output()\DXGIOutput\QueryInterface(?UUID_IDXGIOutput1,@\Output()\DXGIOutput1) = #S_OK
*Output = #Null
;--------------
If \Output()\DXGIOutput1\DuplicateOutput(\Output()\D3D11Device,@\Output()\DXGIOutputDuplication) = #S_OK
CopyMemory(@Description,@\Output()\Description,SizeOf(DXGI_OUTPUT_DESC))
\Output()\Texture\Width = \Output()\Description\DesktopCoordinates\right
\Output()\Texture\Height = \Output()\Description\DesktopCoordinates\bottom
\Output()\Texture\MipLevels = 1
\Output()\Texture\ArraySize = 1
\Output()\Texture\Format = #DXGI_FORMAT_B8G8R8A8_UNORM
\Output()\Texture\SampleDesc\Count = 1
\Output()\Texture\SampleDesc\Quality = 0
\Output()\Texture\Usage = #D3D11_USAGE_STAGING
\Output()\Texture\BindFlags = 0
\Output()\Texture\CPUAccessFlags = #D3D11_CPU_ACCESS_READ
\Output()\Texture\MiscFlags = 0
Debug \Output()\Texture\Width
Debug \Output()\Texture\Height
Debug \Output()\D3D11Device\CreateTexture2D(@\Output()\Texture,#Null,@\Output()\D3D11Texture2D);<- gibt #E_INVALIDARG zurück!?
Debug \Output()\D3D11Texture2D
;---------
Result + 1
EndIf
;--------------
Else
*Device\Release()
*DeviceContext\Release()
DeleteElement(\Output())
EndIf
Else
*Device\Release()
*DeviceContext\Release()
EndIf
EndIf
EndIf
EndIf
If *Output
*Output\Release()
EndIf
Index + 1
Wend
EndIf
Next
EndIf
If Not Result
dxgiRelease()
EndIf
ProcedureReturn Result
EndWith
UUID_IDXGIFactory:
!dd 0x7b7166ec
!dw 0x21c7,0x44ae
!db 0xb2,0x1a,0xc9,0xae,0x32,0x1a,0xe3,0x69
UUID_IDXGIFactory1:
!dd 0x770aae78
!dw 0xf26f,0x4dba
!db 0xa8,0x29,0x25,0x3c,0x83,0xd1,0xb3,0x87
UUID_IDXGIOutput1:
!dd 0x00cddea8
!dw 0x939b,0x4b83
!db 0xa3,0x40,0xa6,0x85,0x22,0x66,0x66,0xcc
EndProcedure
Debug dxgiInit()