summaryrefslogtreecommitdiff
path: root/src/lib/ector/ector_buffer.eo
blob: c53ecc8962b896a5f928e910f7ef7de1126cb9e9 (plain) (blame)
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
import efl_gfx_types;

enum @beta Ector.Buffer.Flag {
   [[Buffer capabilities]]
   none              = 0x00, [[Buffer may not have any backing, indicates an invalid buffer.]]
   cpu_readable      = 0x01, [[Can be read from the CPU after map. Reading may still be very slow.]]
   cpu_writable      = 0x02, [[Can be written to by the CPU after map. Writing may still be very slow.]]
   renderable        = 0x04, [[Can be rendered to, ie CPU memory for SW rendering, or an FBO for GL engine.]]
   drawable          = 0x08, [[Can be used as a source of pixels to draw on Evas.]]
   cpu_readable_fast = 0x10, [[Can be read by the CPU at high speed, ie no need for glReadPixels.]]
   cpu_writable_fast = 0x20, [[Can be written by the CPU at high speed, ie no need for GPU texture upload.]]
   uncached          = 0x40, [[Backed by uncached memory, ie. slow-ish reads but faster than glReadPixels.]]
/* non_coherent      = 0x80, [[Memory may be mapped but will not be coherent between GPU and CPU. Call flush or invalidate to synchronize it.]] */
}

enum @beta Ector.Buffer.Access_Flag {
   [[Buffer access permissions]]
   none      = 0x0, [[No access permission]]
   read      = 0x1, [[Read access permission]]
   write     = 0x2, [[Write access permission]]
   cow       = 0x4, [[Forces copy-on-write if already mapped as read-only. Requires write.]]
}

mixin @beta Ector.Buffer
{
   [[2D pixel buffer interface for Ector
   ]]
   eo_prefix: ector_buffer;
   methods {
      @property size {
         [[The (rectangular) size of the pixel buffer.]]
         get {}
         values {
            w: int; [[Width]]
            h: int; [[Height]]
         }
      }
      @property cspace {
         [[The colorspace of the pixel buffer.]]
         get {}
         values {
            cspace: Efl.Gfx.Colorspace; [[Colorspace]]
         }
      }
      map @pure_virtual {
         [[Map a region of this buffer for read or write access by the CPU,
           fetch data from the GPU if needed. This operation may be slow if
           cpu_readable_fast or cpu_writeable_fast are not true, or if the
           required colorspace is different from the internal one.
         ]]
         params {
            @out length: uint; [[Accessible buffer size in bytes, should not be $null.]]
            @in mode: Ector.Buffer.Access_Flag; [[Specifies whether to map for read-only,
                                                  write-only or read-write access (OR combination of flags).]]
            @in x: uint; [[X position of the top-left pixel to map]]
            @in y: uint; [[Y position of the top-left pixel to map]]
            @in w: uint; [[If 0, defaults to the buffer width]]
            @in h: uint; [[If 0, defaults to the buffer height]]
            @in cspace: Efl.Gfx.Colorspace; [[Requested colorspace. If different from the internal cspace,
                                              map should try to convert the data into a new buffer]]
            @out stride: uint @optional; [[Returns the length in bytes of a mapped line]]
         }
         return: void_ptr @warn_unused; [[Pointer to the top-left pixel data. Returns $null in case of failure]]
      }
      unmap @pure_virtual {
         [[Unmap a region of this buffer, and upload data to the GPU (if needed).]]
         params {
            @in data: void_ptr; [[Data pointer returned by a previous call to map]]
            @in length: uint; [[Must be the same as returned by map.]]
         }
      }
      pixels_set @pure_virtual {
         [[Sets the source pixels for this buffer, or allocate a new memory region]]
         params {
            @in pixels: void_ptr; [[If $null, allocates an empty buffer]]
            @in width: int; [[Buffer width]]
            @in height: int; [[Buffer height]]
            @in stride: int; [[Buffer stride (in bytes). If 0 then calculated based on $cspace and $width]]
            @in cspace: Efl.Gfx.Colorspace; [[Buffer colorspace]]
            @in writable: bool; [[Buffer is writable]]
         }
         return: bool; [[True if pixels_set was successful]]
      }
      @property flags {
         [[The capabilities of this buffer]]
         get {}
         values {
            flag: Ector.Buffer.Flag; [[A bitmask of capability flags]]
         }
      }
   }
   events {
      detached: ptr(ubyte); [[Emitted whenever the previously attached pixels are detached during pixels_set]]
   }
}