1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
//
// Device.cs
//
// Author:
// Jean-Philippe Bruyère <jp.bruyere@hotmail.com>
//
// Copyright (c) 2013-2017 Jean-Philippe Bruyère
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
using System;
using System.Runtime.InteropServices;
namespace Linux.GBM
{
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void DestroyUserDataCallback(ref GBM.gbm_bo bo, IntPtr data);
[StructLayout(LayoutKind.Sequential)]
public struct gbm_bo {
IntPtr device;
public uint Width, Height;
public SurfaceFormat Format;
public SurfaceFlags Flags;
public uint Handle32
{
get { return (uint)BufferObject.gbm_bo_get_handle(ref this); }
}
public uint Stride
{
get { return BufferObject.gbm_bo_get_stride(ref this); }
}
public void SetUserData(IntPtr data, DestroyUserDataCallback destroyFB)
{
BufferObject.gbm_bo_set_user_data(ref this, data, destroyFB);
}
}
unsafe public class BufferObject : IDisposable
{
#region pinvoke
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern gbm_bo* gbm_bo_create (IntPtr gbm, uint width, uint height, SurfaceFormat format, SurfaceFlags flags);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern void gbm_bo_destroy (gbm_bo* bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern int gbm_bo_write(gbm_bo* bo, IntPtr buf, IntPtr count);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern Device gbm_bo_get_device(ref gbm_bo bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern ulong gbm_bo_get_handle(ref gbm_bo bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern int gbm_bo_get_height(ref gbm_bo bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern int gbm_bo_get_width(ref gbm_bo bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern uint gbm_bo_get_stride (ref gbm_bo bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern void gbm_bo_set_user_data(ref gbm_bo bo, IntPtr data, DestroyUserDataCallback callback);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr gbm_bo_get_user_data (IntPtr bo);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern IntPtr gbm_bo_map (ref gbm_bo bo, uint x, uint y, uint width, uint height, TransferFlags flags, ref uint stride, out IntPtr data);
[DllImport("gbm", CallingConvention = CallingConvention.Cdecl)]
internal static extern void gbm_bo_unmap (ref gbm_bo bo, IntPtr data);
#endregion
internal gbm_bo* handle;
#region ctor
public BufferObject (gbm_bo* _handle){
handle = _handle;
}
public BufferObject (Device dev, uint _width, uint _height, SurfaceFormat format, SurfaceFlags flags)
{
handle = gbm_bo_create (dev.handle, _width, _height, format, flags);
if (handle == null)
throw new NotSupportedException("[GBM] BO creation failed.");
}
#endregion
public uint Stride { get { return handle->Stride; }}
public byte[] Data {
set {
fixed (byte* pdata = value) {
gbm_bo_write (handle, (IntPtr)pdata, (IntPtr)value.Length);
}
}
}
#region IDisposable implementation
~BufferObject(){
Dispose (false);
}
public void Dispose ()
{
Dispose (true);
GC.SuppressFinalize (this);
}
protected virtual void Dispose (bool disposing){
if (handle != null)
gbm_bo_destroy (handle);
handle = null;
}
#endregion
}
}
|