DXGI Desktop Duplication API

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

DXGI Desktop Duplication API

Beitrag von Mijikai »

Aufgrund dieses Threads: viewtopic.php?f=6&t=30879
versuche ich gerade eine Screen-Capture Programm mit DXGI (DirectX11) zu programmieren.

Bin schon ein Stück vorwärts gekommen aber momentan bin ich etwas verwirrt wo es um
das IDXGIOutput1-Interface geht:

Code: Alles auswählen

Interface IDXGIOutput1 Extends IDXGIOutput;00cddea8-939b-4b83-a340-a685226666cc
  GetDisplayModeList1(EnumFormat.i,Flags.i,*pNumModes,*pDesc)
  FindClosestMatchingMode1(*pModeToMatch,*pClosestMatch,*pConcernedDevice)
  GetDisplaySurfaceData1(*pDestination)
  DuplicateOutput(*pDevice,*ppOutputDuplication)
EndInterface
Laut msdn (https://docs.microsoft.com/en-us/window ... xgioutput1) heisst es:
To determine the outputs that are available from the adapter, use IDXGIAdapter::EnumOutputs. To determine the specific output that the swap chain will update, use IDXGISwapChain::GetContainingOutput. You can then call QueryInterface from any IDXGIOutput object to obtain an IDXGIOutput1 object.
Jetzt weiß ich nicht ob ->

Code: Alles auswählen

... Extends IDXGIOutput
korrekt ist oder ich das Interface nur über IDXGIOutput::QueryInterface bekomme?

Hier noch der Source von OBS den ich als Anhaltspunkt verwende:
Hier heisst es:

Code: Alles auswählen

IDXGIOutput1 : public IDXGIOutput
weshalb ich denke das -> Extends IDXGIOutput korrekt ist!?

Irgend etwas muss es geben da es sonst keine Release() Funktion gibt!!!

Bin für jede Hilfe dankbar :)
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: DXGI Desktop Duplication API

Beitrag von _JON_ »

Schau dir doch einfach mal die VTable von IDXGIOutput1 an.
Dann weißte doch wie das Interface aussehen muss.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: DXGI Desktop Duplication API

Beitrag von Mijikai »

_JON_ hat geschrieben:Schau dir doch einfach mal die VTable von IDXGIOutput1 an.
Dann weißte doch wie das Interface aussehen muss.
Hab ich versucht, der Code steht in meinem ersten Beitrag :)
und so wie es aussieht ist dieser auch korrekt.

War etwas verwirrt wie das Interface erzeugt wird.
Zuletzt geändert von Mijikai am 07.07.2018 14:43, insgesamt 1-mal geändert.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: DXGI Desktop Duplication API

Beitrag von Mijikai »

Zumindest funktioniert jetzt:

Code: Alles auswählen

DXGIOutput1\DuplicateOutput()
Allerdings hänge ich jetzt bei der Textur-Erstellung fest:

Code: Alles auswählen

;...
\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()\D3D11Device\CreateTexture2D(@\Output()\Texture,#Null,@\Output()\D3D11Texture2D); -> ALWAYS RETURNS: #E_INVALIDARG !?
Hier noch die Struktur:

Code: Alles auswählen

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

Es gibt immer #E_INVALIDARG zurück aber ich komm noch nicht dahinter.

Eventuell ist mein Interface ID3D11Device falsch:

Code: Alles auswählen

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
Schade das PureBasic von Haus aus nur die Interfaces bis DirectX 9 bietet :(
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: DXGI Desktop Duplication API

Beitrag von _JON_ »

Hmm, also erwarte jetzt mal nicht, dass hier irgendwer ne Lösung postet, wenn Du nur so kleine Code Schnipsel postet.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: DXGI Desktop Duplication API

Beitrag von Mijikai »

_JON_ hat geschrieben:Hmm, also erwarte jetzt mal nicht, dass hier irgendwer ne Lösung postet, wenn Du nur so kleine Code Schnipsel postet.
Da die Informationen nicht ausreichen hier mein kompletter Code.

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()
Soweit funktioniert alles bis ->

Code: Alles auswählen

;...
\Output()\D3D11Device\CreateTexture2D()
;...
Ich kann nicht nachvollziehen was falsch ist!
Die Funktion gibt jedoch -> #E_INVALIDARG zurück (falsche Parameter)!?
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: DXGI Desktop Duplication API

Beitrag von _JON_ »

Deine Struckturen sind falsch.

Code: Alles auswählen

Structure DXGI_OUTPUT_DESC
  DeviceName.s{32}
  DesktopCoordinates.RECT
  AttachedToDesktop.l
  Rotation.l
  Monitor.i
EndStructure

Structure DXGI_SAMPLE_DESC
  Count.l
  Quality.l
EndStructure

Structure D3D11_TEXTURE2D_DESC
  Width.l
  Height.l
  MipLevels.l
  ArraySize.l
  Format.l
  SampleDesc.DXGI_SAMPLE_DESC
  Usage.l
  BindFlags.l
  CPUAccessFlags.l
  MiscFlags.l
EndStructure
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: DXGI Desktop Duplication API

Beitrag von Mijikai »

_JON_ hat geschrieben:Deine Struckturen sind falsch.

Code: Alles auswählen

Structure DXGI_OUTPUT_DESC
  DeviceName.s{32}
  DesktopCoordinates.RECT
  AttachedToDesktop.l
  Rotation.l
  Monitor.i
EndStructure

Structure DXGI_SAMPLE_DESC
  Count.l
  Quality.l
EndStructure

Structure D3D11_TEXTURE2D_DESC
  Width.l
  Height.l
  MipLevels.l
  ArraySize.l
  Format.l
  SampleDesc.DXGI_SAMPLE_DESC
  Usage.l
  BindFlags.l
  CPUAccessFlags.l
  MiscFlags.l
EndStructure
Danke das erstellen der Textur funktioniert nun :)

Wusste nicht das UINT -> zu Long wird (auch in x64).

Allerdings verstehe ich nocht warum BOOL in dieser Struktur auch zu Long wird?
->

Code: Alles auswählen

typedef struct DXGI_OUTPUT_DESC {
  WCHAR              DeviceName[32];
  RECT               DesktopCoordinates;
  BOOL               AttachedToDesktop;
  DXGI_MODE_ROTATION Rotation;
  HMONITOR           Monitor;
};
Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: DXGI Desktop Duplication API

Beitrag von _JON_ »

Mijikai hat geschrieben:Allerdings verstehe ich nocht warum BOOL in dieser Struktur auch zu Long wird?
Schon richtig .b wäre korrekter, bin aber zu faul fürs "Align #PB_Structure_AlignC" Schreiben gewesen.
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: DXGI Desktop Duplication API

Beitrag von NicTheQuick »

Das hat nichts mit dem Alignment zu tun. Bools in C nutzen 32 Bit, sind also vergleichbar mit Purebasics Longs.
Bild
Antworten