1 /*
2 * Copyright 2011 Joakim Sindholt <[email protected]>
3 * SPDX-License-Identifier: MIT
4 */
5
6 #include "indexbuffer9.h"
7 #include "device9.h"
8 #include "nine_helpers.h"
9 #include "nine_pipe.h"
10 #include "nine_dump.h"
11
12 #include "pipe/p_screen.h"
13 #include "pipe/p_context.h"
14 #include "pipe/p_state.h"
15 #include "pipe/p_defines.h"
16 #include "util/format/u_formats.h"
17 #include "util/box.h"
18
19 #define DBG_CHANNEL DBG_INDEXBUFFER
20
21 HRESULT
NineIndexBuffer9_ctor(struct NineIndexBuffer9 * This,struct NineUnknownParams * pParams,D3DINDEXBUFFER_DESC * pDesc)22 NineIndexBuffer9_ctor( struct NineIndexBuffer9 *This,
23 struct NineUnknownParams *pParams,
24 D3DINDEXBUFFER_DESC *pDesc )
25 {
26 HRESULT hr;
27 DBG("This=%p pParams=%p pDesc=%p Usage=%s\n",
28 This, pParams, pDesc, nine_D3DUSAGE_to_str(pDesc->Usage));
29
30 hr = NineBuffer9_ctor(&This->base, pParams, D3DRTYPE_INDEXBUFFER,
31 pDesc->Usage, pDesc->Size, pDesc->Pool);
32 if (FAILED(hr))
33 return hr;
34
35 switch (pDesc->Format) {
36 case D3DFMT_INDEX16: This->index_size = 2; break;
37 case D3DFMT_INDEX32: This->index_size = 4; break;
38 default:
39 user_assert(!"Invalid index format.", D3DERR_INVALIDCALL);
40 break;
41 }
42
43 pDesc->Type = D3DRTYPE_INDEXBUFFER;
44 This->desc = *pDesc;
45
46 return D3D_OK;
47 }
48
49 void
NineIndexBuffer9_dtor(struct NineIndexBuffer9 * This)50 NineIndexBuffer9_dtor( struct NineIndexBuffer9 *This )
51 {
52 NineBuffer9_dtor(&This->base);
53 }
54
55 struct pipe_resource *
NineIndexBuffer9_GetBuffer(struct NineIndexBuffer9 * This,unsigned * offset)56 NineIndexBuffer9_GetBuffer( struct NineIndexBuffer9 *This, unsigned *offset )
57 {
58 /* The resource may change */
59 return NineBuffer9_GetResource(&This->base, offset);
60 }
61
62 HRESULT NINE_WINAPI
NineIndexBuffer9_Lock(struct NineIndexBuffer9 * This,UINT OffsetToLock,UINT SizeToLock,void ** ppbData,DWORD Flags)63 NineIndexBuffer9_Lock( struct NineIndexBuffer9 *This,
64 UINT OffsetToLock,
65 UINT SizeToLock,
66 void **ppbData,
67 DWORD Flags )
68 {
69 return NineBuffer9_Lock(&This->base, OffsetToLock, SizeToLock, ppbData, Flags);
70 }
71
72 HRESULT NINE_WINAPI
NineIndexBuffer9_Unlock(struct NineIndexBuffer9 * This)73 NineIndexBuffer9_Unlock( struct NineIndexBuffer9 *This )
74 {
75 return NineBuffer9_Unlock(&This->base);
76 }
77
78 HRESULT NINE_WINAPI
NineIndexBuffer9_GetDesc(struct NineIndexBuffer9 * This,D3DINDEXBUFFER_DESC * pDesc)79 NineIndexBuffer9_GetDesc( struct NineIndexBuffer9 *This,
80 D3DINDEXBUFFER_DESC *pDesc )
81 {
82 user_assert(pDesc, E_POINTER);
83 *pDesc = This->desc;
84 return D3D_OK;
85 }
86
87 IDirect3DIndexBuffer9Vtbl NineIndexBuffer9_vtable = {
88 (void *)NineUnknown_QueryInterface,
89 (void *)NineUnknown_AddRef,
90 (void *)NineUnknown_Release,
91 (void *)NineUnknown_GetDevice, /* actually part of Resource9 iface */
92 (void *)NineUnknown_SetPrivateData,
93 (void *)NineUnknown_GetPrivateData,
94 (void *)NineUnknown_FreePrivateData,
95 (void *)NineResource9_SetPriority,
96 (void *)NineResource9_GetPriority,
97 (void *)NineResource9_PreLoad,
98 (void *)NineResource9_GetType,
99 (void *)NineIndexBuffer9_Lock,
100 (void *)NineIndexBuffer9_Unlock,
101 (void *)NineIndexBuffer9_GetDesc
102 };
103
104 static const GUID *NineIndexBuffer9_IIDs[] = {
105 &IID_IDirect3DIndexBuffer9,
106 &IID_IDirect3DResource9,
107 &IID_IUnknown,
108 NULL
109 };
110
111 HRESULT
NineIndexBuffer9_new(struct NineDevice9 * pDevice,D3DINDEXBUFFER_DESC * pDesc,struct NineIndexBuffer9 ** ppOut)112 NineIndexBuffer9_new( struct NineDevice9 *pDevice,
113 D3DINDEXBUFFER_DESC *pDesc,
114 struct NineIndexBuffer9 **ppOut )
115 {
116 NINE_DEVICE_CHILD_NEW(IndexBuffer9, ppOut, /* args */ pDevice, pDesc);
117 }
118