Error Running jextract on d3d12.h
Michael Ennen
mike.ennen at gmail.com
Mon Sep 14 17:51:27 UTC 2020
It worked for me! Awesome!
One quick question:
I had to add the following:
LibraryLookup d3d12 = LibraryLookup.ofLibrary("D3D12");
LibraryLookup dxgi = LibraryLookup.ofLibrary("dxgi");
To get the methods to be wired up, is that expected? I don't see it in your
example.
Thanks again *so much*. This is a fantastic reference to get started as it
handles some complexities like function
pointers and the complexities of having a C API that really corresponds to
a C++ API which seems to be the case
with DirectX12.
On Mon, Sep 14, 2020 at 10:39 AM Michael Ennen <mike.ennen at gmail.com> wrote:
> Ahhh, this makes so much more sense now.
>
> Thank you both tremendously.
>
> On Mon, Sep 14, 2020 at 6:39 AM Jorn Vernee <jorn.vernee at oracle.com>
> wrote:
>
>> Ok, it looks like the formatting got messed up in the email, so I've
>> uploaded the example here as well:
>>
>> http://cr.openjdk.java.net/~jvernee/d3d12_example/Main.java
>>
>> Jorn
>>
>> On 14/09/2020 15:28, Jorn Vernee wrote:
>> > I've tried it out on my machine as well (I'm also on Windows). Here is
>> > a little bit more complete example that prints out the adapter
>> > description
>> >
>> > If you have extracted the shared/dxgi.h and the shared/guiddef.h
>> > headers as well, you can do something like this:
>> >
>> >
>> > import jdk.incubator.foreign.FunctionDescriptor;
>> > import jdk.incubator.foreign.MemoryAccess;
>> > import jdk.incubator.foreign.MemoryAddress;
>> > import jdk.incubator.foreign.MemoryLayout;
>> > import jdk.incubator.foreign.MemorySegment;
>> > import jdk.incubator.foreign.NativeScope;
>> > import org.jextract.dxgi_h;
>> > import org.jextract.guiddef_h;
>> >
>> > import java.lang.invoke.MethodHandle;
>> > import java.lang.invoke.MethodType;
>> > import java.nio.charset.StandardCharsets;
>> >
>> > import static jdk.incubator.foreign.CSupport.*;
>> > import static org.jextract.dxgi_h.*;
>> >
>> > public class Main {
>> >
>> > public static void main(String[] args)throws Throwable {
>> > try (NativeScope scope =NativeScope.unboundedScope()) {
>> > // IDXGIFactory1** dxgiFactory;
>> > var ppDxgiFactory =IDXGIFactory1.allocatePointer(scope);
>> > // HRESULT = CreateDXGIFactory1(_uuid(dxgiFactory),
>> > &dxgiFactory))
>> > checkResult(dxgi_h.CreateDXGIFactory1(IID_IDXGIFactory1,ppDxgiFactory));
>> > // IDXGIFactory1* MemorySegment pDxgiFactory
>> >
>> =asSegment(MemoryAccess.getAddress(ppDxgiFactory),IDXGIFactory1.$LAYOUT());
>> >
>> > // (This)->lpVtbl MemorySegment vtbl
>> >
>> =asSegment(IDXGIFactory1.lpVtbl$get(pDxgiFactory),IDXGIFactory1Vtbl.$LAYOUT());
>> > // lpVtbl->EnumAdapters1 MemoryAddress addrEnumAdapters
>> > =IDXGIFactory1Vtbl.EnumAdapters1$get(vtbl);
>> >
>> > // link the pointer MethodHandle MH_EnumAdapters1
>> > =getSystemLinker().downcallHandle(
>> > addrEnumAdapters,
>> >
>> MethodType.methodType(int.class,MemoryAddress.class,int.class,MemoryAddress.class),
>> > FunctionDescriptor.of(C_INT,C_POINTER,C_INT,C_POINTER));
>> >
>> > /* [annotation][out] _COM_Outptr_ IDXGIAdapter1** */
>> > MemorySegment ppOut =IDXGIAdapter1.allocatePointer(scope);
>> >
>> checkResult((int)MH_EnumAdapters1.invokeExact(pDxgiFactory.address(),0,ppOut.address()));//
>>
>> > IDXGIAdapter1* MemorySegment pAdapter
>> > =asSegment(MemoryAccess.getAddress(ppOut),IDXGIAdapter1.$LAYOUT());
>> >
>> > // (This)->lpVtbl MemorySegment vtbl2
>> >
>> =asSegment(IDXGIAdapter1.lpVtbl$get(pAdapter),IDXGIAdapter1Vtbl.$LAYOUT());
>> > // lpVtbl->EnumAdapters1 //
>> > HRESULT(*)(IDXGIAdapter1*,DXGI_ADAPTER_DESC1*) MemoryAddress
>> > addrGetDesc1 =IDXGIAdapter1Vtbl.GetDesc1$get(vtbl2);
>> >
>> > // link the pointer MethodHandle MH_GetDesc1
>> > =getSystemLinker().downcallHandle(
>> > addrGetDesc1,
>> >
>> MethodType.methodType(int.class,MemoryAddress.class,MemoryAddress.class),
>> > FunctionDescriptor.of(C_INT,C_POINTER,C_POINTER));
>> >
>> > /* DXGI_ADAPTER_DESC1* */ MemorySegment pDesc
>> > =DXGI_ADAPTER_DESC1.allocate(scope);
>> >
>> checkResult((int)MH_GetDesc1.invokeExact(pAdapter.address(),pDesc.address()));
>> >
>> > // print description MemorySegment descStr
>> > =DXGI_ADAPTER_DESC1.Description$slice(pDesc);
>> > String str =new
>> > String(descStr.toByteArray(),StandardCharsets.UTF_16LE);
>> > System.out.println(str);
>> > }
>> > }
>> >
>> > public static MemorySegment asSegment(MemoryAddress
>> > addr,MemoryLayout layout) {
>> > return MemorySegment.ofNativeRestricted(addr,
>> > layout.byteSize(),Thread.currentThread(),null,null);
>> > }
>> >
>> > static final MemorySegment IID_IDXGIFactory1 =GUID(
>> > (int)0x770aae78,
>> > (short)0xf26f,
>> > (short)0x4dba,
>> > new byte[]{(byte)0xa8,0x29,0x25,0x3c, (byte)0x83,
>> > (byte)0xd1, (byte)0xb3, (byte)0x87});
>> >
>> > static final MemorySegment GUID(int Data1,short Data2,short
>> > Data3,byte[] Data4) {
>> > MemorySegment ms
>> > =MemorySegment.allocateNative(guiddef_h.GUID.$LAYOUT());
>> > guiddef_h.GUID.Data1$set(ms, Data1);
>> > guiddef_h.GUID.Data2$set(ms, Data2);
>> > guiddef_h.GUID.Data3$set(ms, Data3);
>> > guiddef_h.GUID.Data4$slice(ms).copyFrom(MemorySegment.ofArray(Data4));
>> > return ms;
>> > }
>> >
>> > private static final int S_OK =0x00000000;
>> >
>> > private static void checkResult(int result) {
>> > switch (result) {
>> > case S_OK -> {}
>> > default ->throw new IllegalStateException("Unknown result:
>> > " +String.format("%X8", result));
>> > }
>> > }
>> > }
>> >
>> >
>> > Which on my machine prints: NVIDIA GeForce GTX 1050 Ti
>> >
>> > HTH,
>> > Jorn
>> >
>> > On 14/09/2020 12:52, Maurizio Cimadamore wrote:
>> >> I think there's something off in here:
>> >>
>> >>> MemorySegment segment =
>> >>>
>> MemorySegment.allocateNative(dxgi_h.IDXGIFactory1Vtbl.$LAYOUT().byteSize());
>>
>> >>>
>> >>> MemoryAddress address = segment.address().addOffset(64);
>> >> I see a couple of issues:
>> >>
>> >> 1) how do you determine that the offset of the function address you
>> >> want to obtain is 64 byte from the start? Didn't jextract give you a
>> >> getter for that?
>> >>
>> >> 2) Even assuming 64 byte is the correct offset, note that the segment
>> >> will be initialized to all zeros - I presume this vtable must be
>> >> filled in somehow, or perhaps obtained from a global variable?
>> >>
>> >> From your earlier email I see this:
>> >>
>> >>> interface IDXGIFactory
>> >>> {
>> >>> CONST_VTBL struct IDXGIFactoryVtbl *lpVtbl;
>> >>> };
>> >> So... perhaps once yo create a IDXGIFactory, you can just grab the
>> >> pointer to the vtable by accessing its `lpVtbl` field - no need to
>> >> allocate a new segment (the library has done the allocation for you).
>> >>
>> >> If I'm correct, this can be achieved with something like (not sure if
>> >> the names are going to be 100% correct since I don't have a
>> >> jextracted version of the API with me - so beware, I have NOT tested
>> >> this :-) ):
>> >>
>> >> var dxgiFactoryPtr =
>> >> MemoryAccess.getAddress(MemorySegment.ofNativeRestricted(),
>> >> dxgiFactory);
>> >> var lpVtbl =
>> >> MemoryAccess.getAddress(MemorySegment.ofNativeRestricted(),
>> >> dxgiFactoryPtr);
>> >> var vtable = RuntimeHelper.ofArrayRestricted(lpVtbl,
>> >> IDXGIFactory1Vtbl.$LAYOUT(), 1); //1
>> >> var address = IDXGIFactory1Vtbl$EnumAdapters$get(vtable);
>> >>
>> >>
>> >> And this should give the address pointer you are looking for. We need
>> >> to smooth the edges especially around (1) - e.g. to turn a random
>> >> native pointer into a struct with given layout (jextract should
>> >> generate a static helper for that, see [1]) - but with the code above
>> >> you should be able to get there, I hope.
>> >>
>> >> P.S.
>> >> In these situations, my suggestion is, especially when attacking a
>> >> native library for the first time, to always try the library directly
>> >> using C and see what happens, to understand exactly what kind of
>> >> pattern/idiom the library requires. I did that many times and
>> >> realized my assumptions on how library worked were wrong; other users
>> >> have posted similar instances in this mailing list. Once you get
>> >> things working in C, porting the code in Java using the Panama API is
>> >> typically a trivial matter.
>> >>
>> >> Maurizio
>> >>
>> >> [1] - https://bugs.openjdk.java.net/browse/JDK-8253102
>> >>
>> >>
>> >> On 13/09/2020 02:37, Michael Ennen wrote:
>> >>> Well, progress of a kind? This crashes the VM instead of not
>> >>> compiling or
>> >>> throwing an exception:
>> >>>
>> >>> // IDXGIFactory1** dxgiFactory;
>> >>> var dxgiFactory = scope.allocate(C_POINTER);
>> >>> // HRESULT = CreateDXGIFactory1(_uuid(dxgiFactory), &dxgiFactory))
>> >>> int hresult = dxgi_h.CreateDXGIFactory1(GUID(IID.IID_IDXGIFactory1),
>> >>> dxgiFactory);
>> >>> System.out.println("hresult: " + hresult);
>> >>> var dxgiAdapter = scope.allocate(C_POINTER);
>> >>> System.out.println("IDXGIFactory1Vtbl byte size: " +
>> >>> dxgi_h.IDXGIFactory1Vtbl.$LAYOUT().byteSize()); //112
>> >>> MemorySegment segment =
>> >>>
>> MemorySegment.allocateNative(dxgi_h.IDXGIFactory1Vtbl.$LAYOUT().byteSize());
>>
>> >>>
>> >>> MemoryAddress address = segment.address().addOffset(64);
>> >>> FunctionDescriptor functionDescriptor = FunctionDescriptor.of(C_INT,
>> >>> C_INT,
>> >>> C_POINTER);
>> >>> MethodType methodType = MethodType.methodType(int.class, int.class,
>> >>> MemoryAddress.class);
>> >>> MethodHandle methodHandle = getSystemLinker().downcallHandle(address,
>> >>> methodType, functionDescriptor);
>> >>> try {
>> >>> methodHandle.invokeWithArguments(0, dxgiAdapter.address());
>> >>> } catch (Throwable throwable) {
>> >>> throwable.printStackTrace();
>> >>> }
>> >>>
>> >>> On Sat, Sep 12, 2020 at 6:34 PM Michael Ennen <mike.ennen at gmail.com>
>> >>> wrote:
>> >>>
>> >>>> I think I see why. It's because I am passing in a MemorySegment,
>> >>>> which is
>> >>>> the dxgiAdapter which I initialize thusly:
>> >>>>
>> >>>> var dxgiAdapter = scope.allocate(C_POINTER);
>> >>>>
>> >>>> I guess I need to make it a MemoryAddress instead.
>> >>>>
>> >>>> On Sat, Sep 12, 2020 at 2:25 PM Michael Ennen <mike.ennen at gmail.com>
>> >>>> wrote:
>> >>>>
>> >>>>> Thanks so much Ty. That's super helpful. I think I was able to
>> >>>>> make quite
>> >>>>> a bit of progress:
>> >>>>>
>> >>>>> var dxgiAdapter = scope.allocate(C_POINTER);
>> >>>>> System.out.println("IDXGIFactory1Vtbl byte size: " +
>> >>>>> dxgi_h.IDXGIFactory1Vtbl.$LAYOUT().byteSize());
>> >>>>> MemorySegment segment =
>> >>>>>
>> MemorySegment.allocateNative(dxgi_h.IDXGIFactory1Vtbl.$LAYOUT().byteSize());
>>
>> >>>>>
>> >>>>> MemoryAddress address = segment.address().addOffset(64);
>> >>>>> FunctionDescriptor functionDescriptor = FunctionDescriptor.of(C_INT,
>> >>>>> C_INT, C_POINTER);
>> >>>>> MethodType methodType = MethodType.methodType(int.class, int.class,
>> >>>>> MemoryAddress.class);
>> >>>>> MethodHandle methodHandle =
>> getSystemLinker().downcallHandle(address,
>> >>>>> methodType, functionDescriptor);
>> >>>>> try {
>> >>>>> methodHandle.invokeWithArguments(0, dxgiAdapter);
>> >>>>> } catch (Throwable throwable) {
>> >>>>> throwable.printStackTrace();
>> >>>>> }
>> >>>>>
>> >>>>> Note that the EnumAdapters1 function signature is actually:
>> >>>>>
>> >>>>> HRESULT EnumAdapters1(
>> >>>>> UINT Adapter,
>> >>>>> IDXGIAdapter1 **ppAdapter
>> >>>>> );
>> >>>>>
>> >>>>>
>> >>>>> So that's why I went with:
>> >>>>>
>> >>>>> FunctionDescriptor functionDescriptor = FunctionDescriptor.of(C_INT,
>> >>>>> C_INT, C_POINTER);
>> >>>>>
>> >>>>> and then
>> >>>>>
>> >>>>> methodHandle.invokeWithArguments(0, dxgiAdapter);
>> >>>>>
>> >>>>> I did some fancy stuff as per your suggestion which I feel should be
>> >>>>> getting the address of the EumAdapters1 function
>> >>>>> pointer (basically start at the base address of the struct and
>> >>>>> then move
>> >>>>> 64 bytes past, which should be the 8th function
>> >>>>> pointer which in this case is EnumAdapters1).
>> >>>>>
>> >>>>> I do get the following exception on invoking the method handle,
>> >>>>> though:
>> >>>>>
>> >>>>> hresult: 0
>> >>>>> factory: MemorySegment{ id=0x3898fd8a limit: 8 }
>> >>>>> IDXGIFactory1Vtbl byte size: 112
>> >>>>> java.lang.ClassCastException: Cannot cast
>> >>>>> jdk.internal.foreign.NativeMemorySegmentImpl to
>> >>>>> jdk.incubator.foreign.MemoryAddress
>> >>>>> at java.base/java.lang.Class.cast(Class.java:3816)
>> >>>>> at
>> >>>>>
>> java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:733)
>>
>> >>>>>
>> >>>>> at com.dx12.DX12.main(DX12.java:91)
>> >>>>> at
>> >>>>>
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native
>> >>>>>
>> >>>>> Method)
>> >>>>> at
>> >>>>>
>> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
>>
>> >>>>>
>> >>>>> at
>> >>>>>
>> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>>
>> >>>>>
>> >>>>> at
>> >>>>> java.base/java.lang.reflect.Method.invoke(Method.java:564)
>> >>>>> at
>> >>>>>
>> jdk.compiler/com.sun.tools.javac.launcher.Main.execute(Main.java:415)
>> >>>>> at
>> >>>>> jdk.compiler/com.sun.tools.javac.launcher.Main.run(Main.java:192)
>> >>>>> at
>> >>>>> jdk.compiler/com.sun.tools.javac.launcher.Main.main(Main.java:132)
>> >>>>> vh: VarHandle[varType=jdk.incubator.foreign.MemoryAddress,
>> >>>>> coord=[interface jdk.incubator.foreign.MemorySegment]]
>> >>>>>
>> >>>>> Any more assistance would be greatly appreciate but undeserved :).
>> >>>>>
>> >>>>>
>> >>>>> On Sat, Sep 12, 2020 at 1:41 AM Ty Young <youngty1997 at gmail.com>
>> >>>>> wrote:
>> >>>>>
>> >>>>>> Not a JDK developer, but if you want to do this by hand(aka no
>> >>>>>> jextract), I had to do this for NVAPI which obfuscates function
>> >>>>>> pointers
>> >>>>>> using keys, e.g.:
>> >>>>>>
>> >>>>>>
>> >>>>>> nvapi_h.nvapi_QueryInterface(0x0150e828);
>> >>>>>>
>> >>>>>>
>> >>>>>> where "0x0150e828" is the "NvAPI_Initialize" function key as per
>> the
>> >>>>>> Open Source headers Nvidia released sometime ago.
>> >>>>>>
>> >>>>>>
>> >>>>>> The only difference is that, since the function pointer is in a
>> >>>>>> struct,
>> >>>>>> you need to get the segment in the struct containing the function
>> >>>>>> pointer(see "slice" MemorySegment method) and actually read from it
>> >>>>>> using a VarHandle. You then take that MemoryAddress, with a
>> >>>>>> FunctionDescriptor and MethodType, and create a MethodHandle. For
>> >>>>>> reference, this my working code("NativeFunction" and
>> >>>>>> "NativeTypes" do
>> >>>>>> not exist in Panama, those are mine but they dont matter) for the
>> >>>>>> NvAPI_Initalize API:
>> >>>>>>
>> >>>>>>
>> >>>>>> public class NvAPI_Initialize implements NativeFunction
>> >>>>>> {
>> >>>>>> private final MemoryAddress address;
>> >>>>>> private final FunctionDescriptor descriptor;
>> >>>>>> private final MethodType type;
>> >>>>>>
>> >>>>>> private final MethodHandle handle;
>> >>>>>>
>> >>>>>> public NvAPI_Initialize() throws NoSuchMethodException,
>> >>>>>> Throwable
>> >>>>>> {
>> >>>>>> this.address = nvapi_h.nvapi_QueryInterface(0x0150e828);
>> >>>>>>
>> >>>>>> this.descriptor = FunctionDescriptor.of(NativeTypes.INT);
>> >>>>>>
>> >>>>>> this.type = MethodType.methodType(int.class);
>> >>>>>>
>> >>>>>> this.handle =
>> >>>>>> CSupport.getSystemLinker().downcallHandle(this.address, this.type,
>> >>>>>> this.descriptor);
>> >>>>>> }
>> >>>>>>
>> >>>>>> // etc
>> >>>>>>
>> >>>>>> }
>> >>>>>>
>> >>>>>>
>> >>>>>> It looks like in your case the FunctionDescriptor would be:
>> >>>>>>
>> >>>>>>
>> >>>>>> this.descriptor = FunctionDescriptor.of(CSupport.C_POINTER,
>> >>>>>> CSupport.C_INT, CSupport.C_POINTER);
>> >>>>>>
>> >>>>>>
>> >>>>>> for MethodType:
>> >>>>>>
>> >>>>>>
>> >>>>>> MethodType.methodType(MemoryAddress.class, int.class,
>> >>>>>> MemoryAddress.class);
>> >>>>>>
>> >>>>>>
>> >>>>>> where the first argument takes in a IDXGIFactory, the second an
>> >>>>>> unsigned
>> >>>>>> int, and the third a pointer to what looks like an opaque device
>> >>>>>> that
>> >>>>>> you pass to other functions.
>> >>>>>>
>> >>>>>>
>> >>>>>> If you haven't already, it might help to make bindings with a
>> >>>>>> smaller,
>> >>>>>> less complicated library just to get a feel with how things work
>> >>>>>> under
>> >>>>>> the hood.
>> >>>>>>
>> >>>>>>
>> >>>>>> Hope this helps.
>> >>>>>>
>> >>>>>>
>> >>>>>> On 9/12/20 2:23 AM, Michael Ennen wrote:
>> >>>>>>> Looking into this a bit further I think I chose a really bad
>> >>>>>>> library to
>> >>>>>>> start with as the function I need to call, EnumAdapters, is inside
>> >>>>>>> some type of "VTbl" struct that is trying to emulate a C++ class
>> >>>>>>> with
>> >>>>>>> virtual functions. What jextract is returning is most likely
>> >>>>>>> *correct*
>> >>>>>>> but in this case so complicated because of how it is laid out in
>> >>>>>>> C. It
>> >>>>>> is
>> >>>>>>> not clear at all how to grab the EnumAdapters function from
>> >>>>>>> this mess, and it is probably above my head.
>> >>>>>>>
>> >>>>>>> EXTERN_C const IID IID_IDXGIFactory;
>> >>>>>>>
>> >>>>>>> #if defined(__cplusplus) && !defined(CINTERFACE)
>> >>>>>>>
>> >>>>>>> MIDL_INTERFACE("7b7166ec-21c7-44ae-b21a-c9ae321ae369")
>> >>>>>>> IDXGIFactory : public IDXGIObject
>> >>>>>>> {
>> >>>>>>> public:
>> >>>>>>> virtual HRESULT STDMETHODCALLTYPE EnumAdapters(
>> >>>>>>> /* [in] */ UINT Adapter,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGIAdapter **ppAdapter) = 0;
>> >>>>>>>
>> >>>>>>> virtual HRESULT STDMETHODCALLTYPE MakeWindowAssociation(
>> >>>>>>> HWND WindowHandle,
>> >>>>>>> UINT Flags) = 0;
>> >>>>>>>
>> >>>>>>> virtual HRESULT STDMETHODCALLTYPE GetWindowAssociation(
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _Out_ HWND *pWindowHandle) = 0;
>> >>>>>>>
>> >>>>>>> virtual HRESULT STDMETHODCALLTYPE CreateSwapChain(
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ IUnknown *pDevice,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ DXGI_SWAP_CHAIN_DESC *pDesc,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGISwapChain **ppSwapChain) = 0;
>> >>>>>>>
>> >>>>>>> virtual HRESULT STDMETHODCALLTYPE CreateSoftwareAdapter(
>> >>>>>>> /* [in] */ HMODULE Module,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGIAdapter **ppAdapter) = 0;
>> >>>>>>>
>> >>>>>>> };
>> >>>>>>>
>> >>>>>>>
>> >>>>>>> #else /* C style interface */
>> >>>>>>>
>> >>>>>>> typedef struct IDXGIFactoryVtbl
>> >>>>>>> {
>> >>>>>>> BEGIN_INTERFACE
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [in] */ REFIID riid,
>> >>>>>>> /* [annotation][iid_is][out] */
>> >>>>>>> _COM_Outptr_ void **ppvObject);
>> >>>>>>>
>> >>>>>>> ULONG ( STDMETHODCALLTYPE *AddRef )(
>> >>>>>>> IDXGIFactory * This);
>> >>>>>>>
>> >>>>>>> ULONG ( STDMETHODCALLTYPE *Release )(
>> >>>>>>> IDXGIFactory * This);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *SetPrivateData )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ REFGUID Name,
>> >>>>>>> /* [in] */ UINT DataSize,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_reads_bytes_(DataSize) const void *pData);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *SetPrivateDataInterface )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ REFGUID Name,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_opt_ const IUnknown *pUnknown);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *GetPrivateData )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ REFGUID Name,
>> >>>>>>> /* [annotation][out][in] */
>> >>>>>>> _Inout_ UINT *pDataSize,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _Out_writes_bytes_(*pDataSize) void *pData);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *GetParent )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ REFIID riid,
>> >>>>>>> /* [annotation][retval][out] */
>> >>>>>>> _COM_Outptr_ void **ppParent);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *EnumAdapters )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [in] */ UINT Adapter,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGIAdapter **ppAdapter);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *MakeWindowAssociation )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> HWND WindowHandle,
>> >>>>>>> UINT Flags);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *GetWindowAssociation )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _Out_ HWND *pWindowHandle);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *CreateSwapChain )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ IUnknown *pDevice,
>> >>>>>>> /* [annotation][in] */
>> >>>>>>> _In_ DXGI_SWAP_CHAIN_DESC *pDesc,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGISwapChain **ppSwapChain);
>> >>>>>>>
>> >>>>>>> HRESULT ( STDMETHODCALLTYPE *CreateSoftwareAdapter )(
>> >>>>>>> IDXGIFactory * This,
>> >>>>>>> /* [in] */ HMODULE Module,
>> >>>>>>> /* [annotation][out] */
>> >>>>>>> _COM_Outptr_ IDXGIAdapter **ppAdapter);
>> >>>>>>>
>> >>>>>>> END_INTERFACE
>> >>>>>>> } IDXGIFactoryVtbl;
>> >>>>>>>
>> >>>>>>> interface IDXGIFactory
>> >>>>>>> {
>> >>>>>>> CONST_VTBL struct IDXGIFactoryVtbl *lpVtbl;
>> >>>>>>> };
>> >>>>>>>
>> >>>>>>>
>> >>>>>
>> >>>>> --
>> >>>>> Michael Ennen
>> >>>>>
>> >>>>
>> >>>> --
>> >>>> Michael Ennen
>> >>>>
>> >>>
>>
>
>
> --
> Michael Ennen
>
--
Michael Ennen
More information about the panama-dev
mailing list