1
2 package dri2
3
4
5
6 import (
7 "github.com/jezek/xgb"
8
9 "github.com/jezek/xgb/xproto"
10 )
11
12
13 func Init(c *xgb.Conn) error {
14 reply, err := xproto.QueryExtension(c, 4, "DRI2").Reply()
15 switch {
16 case err != nil:
17 return err
18 case !reply.Present:
19 return xgb.Errorf("No extension named DRI2 could be found on on the server.")
20 }
21
22 c.ExtLock.Lock()
23 c.Extensions["DRI2"] = reply.MajorOpcode
24 c.ExtLock.Unlock()
25 for evNum, fun := range xgb.NewExtEventFuncs["DRI2"] {
26 xgb.NewEventFuncs[int(reply.FirstEvent)+evNum] = fun
27 }
28 for errNum, fun := range xgb.NewExtErrorFuncs["DRI2"] {
29 xgb.NewErrorFuncs[int(reply.FirstError)+errNum] = fun
30 }
31 return nil
32 }
33
34 func init() {
35 xgb.NewExtEventFuncs["DRI2"] = make(map[int]xgb.NewEventFun)
36 xgb.NewExtErrorFuncs["DRI2"] = make(map[int]xgb.NewErrorFun)
37 }
38
39 type AttachFormat struct {
40 Attachment uint32
41 Format uint32
42 }
43
44
45 func AttachFormatRead(buf []byte, v *AttachFormat) int {
46 b := 0
47
48 v.Attachment = xgb.Get32(buf[b:])
49 b += 4
50
51 v.Format = xgb.Get32(buf[b:])
52 b += 4
53
54 return b
55 }
56
57
58 func AttachFormatReadList(buf []byte, dest []AttachFormat) int {
59 b := 0
60 for i := 0; i < len(dest); i++ {
61 dest[i] = AttachFormat{}
62 b += AttachFormatRead(buf[b:], &dest[i])
63 }
64 return xgb.Pad(b)
65 }
66
67
68 func (v AttachFormat) Bytes() []byte {
69 buf := make([]byte, 8)
70 b := 0
71
72 xgb.Put32(buf[b:], v.Attachment)
73 b += 4
74
75 xgb.Put32(buf[b:], v.Format)
76 b += 4
77
78 return buf[:b]
79 }
80
81
82 func AttachFormatListBytes(buf []byte, list []AttachFormat) int {
83 b := 0
84 var structBytes []byte
85 for _, item := range list {
86 structBytes = item.Bytes()
87 copy(buf[b:], structBytes)
88 b += len(structBytes)
89 }
90 return xgb.Pad(b)
91 }
92
93 const (
94 AttachmentBufferFrontLeft = 0
95 AttachmentBufferBackLeft = 1
96 AttachmentBufferFrontRight = 2
97 AttachmentBufferBackRight = 3
98 AttachmentBufferDepth = 4
99 AttachmentBufferStencil = 5
100 AttachmentBufferAccum = 6
101 AttachmentBufferFakeFrontLeft = 7
102 AttachmentBufferFakeFrontRight = 8
103 AttachmentBufferDepthStencil = 9
104 AttachmentBufferHiz = 10
105 )
106
107
108 const BufferSwapComplete = 0
109
110 type BufferSwapCompleteEvent struct {
111 Sequence uint16
112
113 EventType uint16
114
115 Drawable xproto.Drawable
116 UstHi uint32
117 UstLo uint32
118 MscHi uint32
119 MscLo uint32
120 Sbc uint32
121 }
122
123
124 func BufferSwapCompleteEventNew(buf []byte) xgb.Event {
125 v := BufferSwapCompleteEvent{}
126 b := 1
127
128 b += 1
129
130 v.Sequence = xgb.Get16(buf[b:])
131 b += 2
132
133 v.EventType = xgb.Get16(buf[b:])
134 b += 2
135
136 b += 2
137
138 v.Drawable = xproto.Drawable(xgb.Get32(buf[b:]))
139 b += 4
140
141 v.UstHi = xgb.Get32(buf[b:])
142 b += 4
143
144 v.UstLo = xgb.Get32(buf[b:])
145 b += 4
146
147 v.MscHi = xgb.Get32(buf[b:])
148 b += 4
149
150 v.MscLo = xgb.Get32(buf[b:])
151 b += 4
152
153 v.Sbc = xgb.Get32(buf[b:])
154 b += 4
155
156 return v
157 }
158
159
160 func (v BufferSwapCompleteEvent) Bytes() []byte {
161 buf := make([]byte, 32)
162 b := 0
163
164
165 buf[b] = 0
166 b += 1
167
168 b += 1
169
170 b += 2
171
172 xgb.Put16(buf[b:], v.EventType)
173 b += 2
174
175 b += 2
176
177 xgb.Put32(buf[b:], uint32(v.Drawable))
178 b += 4
179
180 xgb.Put32(buf[b:], v.UstHi)
181 b += 4
182
183 xgb.Put32(buf[b:], v.UstLo)
184 b += 4
185
186 xgb.Put32(buf[b:], v.MscHi)
187 b += 4
188
189 xgb.Put32(buf[b:], v.MscLo)
190 b += 4
191
192 xgb.Put32(buf[b:], v.Sbc)
193 b += 4
194
195 return buf
196 }
197
198
199
200
201 func (v BufferSwapCompleteEvent) SequenceId() uint16 {
202 return v.Sequence
203 }
204
205
206 func (v BufferSwapCompleteEvent) String() string {
207 fieldVals := make([]string, 0, 9)
208 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence))
209 fieldVals = append(fieldVals, xgb.Sprintf("EventType: %d", v.EventType))
210 fieldVals = append(fieldVals, xgb.Sprintf("Drawable: %d", v.Drawable))
211 fieldVals = append(fieldVals, xgb.Sprintf("UstHi: %d", v.UstHi))
212 fieldVals = append(fieldVals, xgb.Sprintf("UstLo: %d", v.UstLo))
213 fieldVals = append(fieldVals, xgb.Sprintf("MscHi: %d", v.MscHi))
214 fieldVals = append(fieldVals, xgb.Sprintf("MscLo: %d", v.MscLo))
215 fieldVals = append(fieldVals, xgb.Sprintf("Sbc: %d", v.Sbc))
216 return "BufferSwapComplete {" + xgb.StringsJoin(fieldVals, ", ") + "}"
217 }
218
219 func init() {
220 xgb.NewExtEventFuncs["DRI2"][0] = BufferSwapCompleteEventNew
221 }
222
223 type DRI2Buffer struct {
224 Attachment uint32
225 Name uint32
226 Pitch uint32
227 Cpp uint32
228 Flags uint32
229 }
230
231
232 func DRI2BufferRead(buf []byte, v *DRI2Buffer) int {
233 b := 0
234
235 v.Attachment = xgb.Get32(buf[b:])
236 b += 4
237
238 v.Name = xgb.Get32(buf[b:])
239 b += 4
240
241 v.Pitch = xgb.Get32(buf[b:])
242 b += 4
243
244 v.Cpp = xgb.Get32(buf[b:])
245 b += 4
246
247 v.Flags = xgb.Get32(buf[b:])
248 b += 4
249
250 return b
251 }
252
253
254 func DRI2BufferReadList(buf []byte, dest []DRI2Buffer) int {
255 b := 0
256 for i := 0; i < len(dest); i++ {
257 dest[i] = DRI2Buffer{}
258 b += DRI2BufferRead(buf[b:], &dest[i])
259 }
260 return xgb.Pad(b)
261 }
262
263
264 func (v DRI2Buffer) Bytes() []byte {
265 buf := make([]byte, 20)
266 b := 0
267
268 xgb.Put32(buf[b:], v.Attachment)
269 b += 4
270
271 xgb.Put32(buf[b:], v.Name)
272 b += 4
273
274 xgb.Put32(buf[b:], v.Pitch)
275 b += 4
276
277 xgb.Put32(buf[b:], v.Cpp)
278 b += 4
279
280 xgb.Put32(buf[b:], v.Flags)
281 b += 4
282
283 return buf[:b]
284 }
285
286
287 func DRI2BufferListBytes(buf []byte, list []DRI2Buffer) int {
288 b := 0
289 var structBytes []byte
290 for _, item := range list {
291 structBytes = item.Bytes()
292 copy(buf[b:], structBytes)
293 b += len(structBytes)
294 }
295 return xgb.Pad(b)
296 }
297
298 const (
299 DriverTypeDri = 0
300 DriverTypeVdpau = 1
301 )
302
303 const (
304 EventTypeExchangeComplete = 1
305 EventTypeBlitComplete = 2
306 EventTypeFlipComplete = 3
307 )
308
309
310 const InvalidateBuffers = 1
311
312 type InvalidateBuffersEvent struct {
313 Sequence uint16
314
315 Drawable xproto.Drawable
316 }
317
318
319 func InvalidateBuffersEventNew(buf []byte) xgb.Event {
320 v := InvalidateBuffersEvent{}
321 b := 1
322
323 b += 1
324
325 v.Sequence = xgb.Get16(buf[b:])
326 b += 2
327
328 v.Drawable = xproto.Drawable(xgb.Get32(buf[b:]))
329 b += 4
330
331 return v
332 }
333
334
335 func (v InvalidateBuffersEvent) Bytes() []byte {
336 buf := make([]byte, 32)
337 b := 0
338
339
340 buf[b] = 1
341 b += 1
342
343 b += 1
344
345 b += 2
346
347 xgb.Put32(buf[b:], uint32(v.Drawable))
348 b += 4
349
350 return buf
351 }
352
353
354
355
356 func (v InvalidateBuffersEvent) SequenceId() uint16 {
357 return v.Sequence
358 }
359
360
361 func (v InvalidateBuffersEvent) String() string {
362 fieldVals := make([]string, 0, 2)
363 fieldVals = append(fieldVals, xgb.Sprintf("Sequence: %d", v.Sequence))
364 fieldVals = append(fieldVals, xgb.Sprintf("Drawable: %d", v.Drawable))
365 return "InvalidateBuffers {" + xgb.StringsJoin(fieldVals, ", ") + "}"
366 }
367
368 func init() {
369 xgb.NewExtEventFuncs["DRI2"][1] = InvalidateBuffersEventNew
370 }
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397 type AuthenticateCookie struct {
398 *xgb.Cookie
399 }
400
401
402
403 func Authenticate(c *xgb.Conn, Window xproto.Window, Magic uint32) AuthenticateCookie {
404 c.ExtLock.RLock()
405 defer c.ExtLock.RUnlock()
406 if _, ok := c.Extensions["DRI2"]; !ok {
407 panic("Cannot issue request 'Authenticate' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
408 }
409 cookie := c.NewCookie(true, true)
410 c.NewRequest(authenticateRequest(c, Window, Magic), cookie)
411 return AuthenticateCookie{cookie}
412 }
413
414
415
416 func AuthenticateUnchecked(c *xgb.Conn, Window xproto.Window, Magic uint32) AuthenticateCookie {
417 c.ExtLock.RLock()
418 defer c.ExtLock.RUnlock()
419 if _, ok := c.Extensions["DRI2"]; !ok {
420 panic("Cannot issue request 'Authenticate' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
421 }
422 cookie := c.NewCookie(false, true)
423 c.NewRequest(authenticateRequest(c, Window, Magic), cookie)
424 return AuthenticateCookie{cookie}
425 }
426
427
428 type AuthenticateReply struct {
429 Sequence uint16
430 Length uint32
431
432 Authenticated uint32
433 }
434
435
436 func (cook AuthenticateCookie) Reply() (*AuthenticateReply, error) {
437 buf, err := cook.Cookie.Reply()
438 if err != nil {
439 return nil, err
440 }
441 if buf == nil {
442 return nil, nil
443 }
444 return authenticateReply(buf), nil
445 }
446
447
448 func authenticateReply(buf []byte) *AuthenticateReply {
449 v := new(AuthenticateReply)
450 b := 1
451
452 b += 1
453
454 v.Sequence = xgb.Get16(buf[b:])
455 b += 2
456
457 v.Length = xgb.Get32(buf[b:])
458 b += 4
459
460 v.Authenticated = xgb.Get32(buf[b:])
461 b += 4
462
463 return v
464 }
465
466
467
468 func authenticateRequest(c *xgb.Conn, Window xproto.Window, Magic uint32) []byte {
469 size := 12
470 b := 0
471 buf := make([]byte, size)
472
473 c.ExtLock.RLock()
474 buf[b] = c.Extensions["DRI2"]
475 c.ExtLock.RUnlock()
476 b += 1
477
478 buf[b] = 2
479 b += 1
480
481 xgb.Put16(buf[b:], uint16(size/4))
482 b += 2
483
484 xgb.Put32(buf[b:], uint32(Window))
485 b += 4
486
487 xgb.Put32(buf[b:], Magic)
488 b += 4
489
490 return buf
491 }
492
493
494 type ConnectCookie struct {
495 *xgb.Cookie
496 }
497
498
499
500 func Connect(c *xgb.Conn, Window xproto.Window, DriverType uint32) ConnectCookie {
501 c.ExtLock.RLock()
502 defer c.ExtLock.RUnlock()
503 if _, ok := c.Extensions["DRI2"]; !ok {
504 panic("Cannot issue request 'Connect' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
505 }
506 cookie := c.NewCookie(true, true)
507 c.NewRequest(connectRequest(c, Window, DriverType), cookie)
508 return ConnectCookie{cookie}
509 }
510
511
512
513 func ConnectUnchecked(c *xgb.Conn, Window xproto.Window, DriverType uint32) ConnectCookie {
514 c.ExtLock.RLock()
515 defer c.ExtLock.RUnlock()
516 if _, ok := c.Extensions["DRI2"]; !ok {
517 panic("Cannot issue request 'Connect' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
518 }
519 cookie := c.NewCookie(false, true)
520 c.NewRequest(connectRequest(c, Window, DriverType), cookie)
521 return ConnectCookie{cookie}
522 }
523
524
525 type ConnectReply struct {
526 Sequence uint16
527 Length uint32
528
529 DriverNameLength uint32
530 DeviceNameLength uint32
531
532 DriverName string
533 AlignmentPad []byte
534 DeviceName string
535 }
536
537
538 func (cook ConnectCookie) Reply() (*ConnectReply, error) {
539 buf, err := cook.Cookie.Reply()
540 if err != nil {
541 return nil, err
542 }
543 if buf == nil {
544 return nil, nil
545 }
546 return connectReply(buf), nil
547 }
548
549
550 func connectReply(buf []byte) *ConnectReply {
551 v := new(ConnectReply)
552 b := 1
553
554 b += 1
555
556 v.Sequence = xgb.Get16(buf[b:])
557 b += 2
558
559 v.Length = xgb.Get32(buf[b:])
560 b += 4
561
562 v.DriverNameLength = xgb.Get32(buf[b:])
563 b += 4
564
565 v.DeviceNameLength = xgb.Get32(buf[b:])
566 b += 4
567
568 b += 16
569
570 {
571 byteString := make([]byte, v.DriverNameLength)
572 copy(byteString[:v.DriverNameLength], buf[b:])
573 v.DriverName = string(byteString)
574 b += int(v.DriverNameLength)
575 }
576
577 v.AlignmentPad = make([]byte, (((int(v.DriverNameLength) + 3) & -4) - int(v.DriverNameLength)))
578 copy(v.AlignmentPad[:(((int(v.DriverNameLength)+3)&-4)-int(v.DriverNameLength))], buf[b:])
579 b += int((((int(v.DriverNameLength) + 3) & -4) - int(v.DriverNameLength)))
580
581 {
582 byteString := make([]byte, v.DeviceNameLength)
583 copy(byteString[:v.DeviceNameLength], buf[b:])
584 v.DeviceName = string(byteString)
585 b += int(v.DeviceNameLength)
586 }
587
588 return v
589 }
590
591
592
593 func connectRequest(c *xgb.Conn, Window xproto.Window, DriverType uint32) []byte {
594 size := 12
595 b := 0
596 buf := make([]byte, size)
597
598 c.ExtLock.RLock()
599 buf[b] = c.Extensions["DRI2"]
600 c.ExtLock.RUnlock()
601 b += 1
602
603 buf[b] = 1
604 b += 1
605
606 xgb.Put16(buf[b:], uint16(size/4))
607 b += 2
608
609 xgb.Put32(buf[b:], uint32(Window))
610 b += 4
611
612 xgb.Put32(buf[b:], DriverType)
613 b += 4
614
615 return buf
616 }
617
618
619 type CopyRegionCookie struct {
620 *xgb.Cookie
621 }
622
623
624
625 func CopyRegion(c *xgb.Conn, Drawable xproto.Drawable, Region uint32, Dest uint32, Src uint32) CopyRegionCookie {
626 c.ExtLock.RLock()
627 defer c.ExtLock.RUnlock()
628 if _, ok := c.Extensions["DRI2"]; !ok {
629 panic("Cannot issue request 'CopyRegion' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
630 }
631 cookie := c.NewCookie(true, true)
632 c.NewRequest(copyRegionRequest(c, Drawable, Region, Dest, Src), cookie)
633 return CopyRegionCookie{cookie}
634 }
635
636
637
638 func CopyRegionUnchecked(c *xgb.Conn, Drawable xproto.Drawable, Region uint32, Dest uint32, Src uint32) CopyRegionCookie {
639 c.ExtLock.RLock()
640 defer c.ExtLock.RUnlock()
641 if _, ok := c.Extensions["DRI2"]; !ok {
642 panic("Cannot issue request 'CopyRegion' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
643 }
644 cookie := c.NewCookie(false, true)
645 c.NewRequest(copyRegionRequest(c, Drawable, Region, Dest, Src), cookie)
646 return CopyRegionCookie{cookie}
647 }
648
649
650 type CopyRegionReply struct {
651 Sequence uint16
652 Length uint32
653
654 }
655
656
657 func (cook CopyRegionCookie) Reply() (*CopyRegionReply, error) {
658 buf, err := cook.Cookie.Reply()
659 if err != nil {
660 return nil, err
661 }
662 if buf == nil {
663 return nil, nil
664 }
665 return copyRegionReply(buf), nil
666 }
667
668
669 func copyRegionReply(buf []byte) *CopyRegionReply {
670 v := new(CopyRegionReply)
671 b := 1
672
673 b += 1
674
675 v.Sequence = xgb.Get16(buf[b:])
676 b += 2
677
678 v.Length = xgb.Get32(buf[b:])
679 b += 4
680
681 return v
682 }
683
684
685
686 func copyRegionRequest(c *xgb.Conn, Drawable xproto.Drawable, Region uint32, Dest uint32, Src uint32) []byte {
687 size := 20
688 b := 0
689 buf := make([]byte, size)
690
691 c.ExtLock.RLock()
692 buf[b] = c.Extensions["DRI2"]
693 c.ExtLock.RUnlock()
694 b += 1
695
696 buf[b] = 6
697 b += 1
698
699 xgb.Put16(buf[b:], uint16(size/4))
700 b += 2
701
702 xgb.Put32(buf[b:], uint32(Drawable))
703 b += 4
704
705 xgb.Put32(buf[b:], Region)
706 b += 4
707
708 xgb.Put32(buf[b:], Dest)
709 b += 4
710
711 xgb.Put32(buf[b:], Src)
712 b += 4
713
714 return buf
715 }
716
717
718 type CreateDrawableCookie struct {
719 *xgb.Cookie
720 }
721
722
723
724 func CreateDrawable(c *xgb.Conn, Drawable xproto.Drawable) CreateDrawableCookie {
725 c.ExtLock.RLock()
726 defer c.ExtLock.RUnlock()
727 if _, ok := c.Extensions["DRI2"]; !ok {
728 panic("Cannot issue request 'CreateDrawable' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
729 }
730 cookie := c.NewCookie(false, false)
731 c.NewRequest(createDrawableRequest(c, Drawable), cookie)
732 return CreateDrawableCookie{cookie}
733 }
734
735
736
737 func CreateDrawableChecked(c *xgb.Conn, Drawable xproto.Drawable) CreateDrawableCookie {
738 c.ExtLock.RLock()
739 defer c.ExtLock.RUnlock()
740 if _, ok := c.Extensions["DRI2"]; !ok {
741 panic("Cannot issue request 'CreateDrawable' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
742 }
743 cookie := c.NewCookie(true, false)
744 c.NewRequest(createDrawableRequest(c, Drawable), cookie)
745 return CreateDrawableCookie{cookie}
746 }
747
748
749
750 func (cook CreateDrawableCookie) Check() error {
751 return cook.Cookie.Check()
752 }
753
754
755
756 func createDrawableRequest(c *xgb.Conn, Drawable xproto.Drawable) []byte {
757 size := 8
758 b := 0
759 buf := make([]byte, size)
760
761 c.ExtLock.RLock()
762 buf[b] = c.Extensions["DRI2"]
763 c.ExtLock.RUnlock()
764 b += 1
765
766 buf[b] = 3
767 b += 1
768
769 xgb.Put16(buf[b:], uint16(size/4))
770 b += 2
771
772 xgb.Put32(buf[b:], uint32(Drawable))
773 b += 4
774
775 return buf
776 }
777
778
779 type DestroyDrawableCookie struct {
780 *xgb.Cookie
781 }
782
783
784
785 func DestroyDrawable(c *xgb.Conn, Drawable xproto.Drawable) DestroyDrawableCookie {
786 c.ExtLock.RLock()
787 defer c.ExtLock.RUnlock()
788 if _, ok := c.Extensions["DRI2"]; !ok {
789 panic("Cannot issue request 'DestroyDrawable' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
790 }
791 cookie := c.NewCookie(false, false)
792 c.NewRequest(destroyDrawableRequest(c, Drawable), cookie)
793 return DestroyDrawableCookie{cookie}
794 }
795
796
797
798 func DestroyDrawableChecked(c *xgb.Conn, Drawable xproto.Drawable) DestroyDrawableCookie {
799 c.ExtLock.RLock()
800 defer c.ExtLock.RUnlock()
801 if _, ok := c.Extensions["DRI2"]; !ok {
802 panic("Cannot issue request 'DestroyDrawable' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
803 }
804 cookie := c.NewCookie(true, false)
805 c.NewRequest(destroyDrawableRequest(c, Drawable), cookie)
806 return DestroyDrawableCookie{cookie}
807 }
808
809
810
811 func (cook DestroyDrawableCookie) Check() error {
812 return cook.Cookie.Check()
813 }
814
815
816
817 func destroyDrawableRequest(c *xgb.Conn, Drawable xproto.Drawable) []byte {
818 size := 8
819 b := 0
820 buf := make([]byte, size)
821
822 c.ExtLock.RLock()
823 buf[b] = c.Extensions["DRI2"]
824 c.ExtLock.RUnlock()
825 b += 1
826
827 buf[b] = 4
828 b += 1
829
830 xgb.Put16(buf[b:], uint16(size/4))
831 b += 2
832
833 xgb.Put32(buf[b:], uint32(Drawable))
834 b += 4
835
836 return buf
837 }
838
839
840 type GetBuffersCookie struct {
841 *xgb.Cookie
842 }
843
844
845
846 func GetBuffers(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []uint32) GetBuffersCookie {
847 c.ExtLock.RLock()
848 defer c.ExtLock.RUnlock()
849 if _, ok := c.Extensions["DRI2"]; !ok {
850 panic("Cannot issue request 'GetBuffers' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
851 }
852 cookie := c.NewCookie(true, true)
853 c.NewRequest(getBuffersRequest(c, Drawable, Count, Attachments), cookie)
854 return GetBuffersCookie{cookie}
855 }
856
857
858
859 func GetBuffersUnchecked(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []uint32) GetBuffersCookie {
860 c.ExtLock.RLock()
861 defer c.ExtLock.RUnlock()
862 if _, ok := c.Extensions["DRI2"]; !ok {
863 panic("Cannot issue request 'GetBuffers' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
864 }
865 cookie := c.NewCookie(false, true)
866 c.NewRequest(getBuffersRequest(c, Drawable, Count, Attachments), cookie)
867 return GetBuffersCookie{cookie}
868 }
869
870
871 type GetBuffersReply struct {
872 Sequence uint16
873 Length uint32
874
875 Width uint32
876 Height uint32
877 Count uint32
878
879 Buffers []DRI2Buffer
880 }
881
882
883 func (cook GetBuffersCookie) Reply() (*GetBuffersReply, error) {
884 buf, err := cook.Cookie.Reply()
885 if err != nil {
886 return nil, err
887 }
888 if buf == nil {
889 return nil, nil
890 }
891 return getBuffersReply(buf), nil
892 }
893
894
895 func getBuffersReply(buf []byte) *GetBuffersReply {
896 v := new(GetBuffersReply)
897 b := 1
898
899 b += 1
900
901 v.Sequence = xgb.Get16(buf[b:])
902 b += 2
903
904 v.Length = xgb.Get32(buf[b:])
905 b += 4
906
907 v.Width = xgb.Get32(buf[b:])
908 b += 4
909
910 v.Height = xgb.Get32(buf[b:])
911 b += 4
912
913 v.Count = xgb.Get32(buf[b:])
914 b += 4
915
916 b += 12
917
918 v.Buffers = make([]DRI2Buffer, v.Count)
919 b += DRI2BufferReadList(buf[b:], v.Buffers)
920
921 return v
922 }
923
924
925
926 func getBuffersRequest(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []uint32) []byte {
927 size := xgb.Pad((12 + xgb.Pad((len(Attachments) * 4))))
928 b := 0
929 buf := make([]byte, size)
930
931 c.ExtLock.RLock()
932 buf[b] = c.Extensions["DRI2"]
933 c.ExtLock.RUnlock()
934 b += 1
935
936 buf[b] = 5
937 b += 1
938
939 xgb.Put16(buf[b:], uint16(size/4))
940 b += 2
941
942 xgb.Put32(buf[b:], uint32(Drawable))
943 b += 4
944
945 xgb.Put32(buf[b:], Count)
946 b += 4
947
948 for i := 0; i < int(len(Attachments)); i++ {
949 xgb.Put32(buf[b:], Attachments[i])
950 b += 4
951 }
952
953 return buf
954 }
955
956
957 type GetBuffersWithFormatCookie struct {
958 *xgb.Cookie
959 }
960
961
962
963 func GetBuffersWithFormat(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []AttachFormat) GetBuffersWithFormatCookie {
964 c.ExtLock.RLock()
965 defer c.ExtLock.RUnlock()
966 if _, ok := c.Extensions["DRI2"]; !ok {
967 panic("Cannot issue request 'GetBuffersWithFormat' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
968 }
969 cookie := c.NewCookie(true, true)
970 c.NewRequest(getBuffersWithFormatRequest(c, Drawable, Count, Attachments), cookie)
971 return GetBuffersWithFormatCookie{cookie}
972 }
973
974
975
976 func GetBuffersWithFormatUnchecked(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []AttachFormat) GetBuffersWithFormatCookie {
977 c.ExtLock.RLock()
978 defer c.ExtLock.RUnlock()
979 if _, ok := c.Extensions["DRI2"]; !ok {
980 panic("Cannot issue request 'GetBuffersWithFormat' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
981 }
982 cookie := c.NewCookie(false, true)
983 c.NewRequest(getBuffersWithFormatRequest(c, Drawable, Count, Attachments), cookie)
984 return GetBuffersWithFormatCookie{cookie}
985 }
986
987
988 type GetBuffersWithFormatReply struct {
989 Sequence uint16
990 Length uint32
991
992 Width uint32
993 Height uint32
994 Count uint32
995
996 Buffers []DRI2Buffer
997 }
998
999
1000 func (cook GetBuffersWithFormatCookie) Reply() (*GetBuffersWithFormatReply, error) {
1001 buf, err := cook.Cookie.Reply()
1002 if err != nil {
1003 return nil, err
1004 }
1005 if buf == nil {
1006 return nil, nil
1007 }
1008 return getBuffersWithFormatReply(buf), nil
1009 }
1010
1011
1012 func getBuffersWithFormatReply(buf []byte) *GetBuffersWithFormatReply {
1013 v := new(GetBuffersWithFormatReply)
1014 b := 1
1015
1016 b += 1
1017
1018 v.Sequence = xgb.Get16(buf[b:])
1019 b += 2
1020
1021 v.Length = xgb.Get32(buf[b:])
1022 b += 4
1023
1024 v.Width = xgb.Get32(buf[b:])
1025 b += 4
1026
1027 v.Height = xgb.Get32(buf[b:])
1028 b += 4
1029
1030 v.Count = xgb.Get32(buf[b:])
1031 b += 4
1032
1033 b += 12
1034
1035 v.Buffers = make([]DRI2Buffer, v.Count)
1036 b += DRI2BufferReadList(buf[b:], v.Buffers)
1037
1038 return v
1039 }
1040
1041
1042
1043 func getBuffersWithFormatRequest(c *xgb.Conn, Drawable xproto.Drawable, Count uint32, Attachments []AttachFormat) []byte {
1044 size := xgb.Pad((12 + xgb.Pad((len(Attachments) * 8))))
1045 b := 0
1046 buf := make([]byte, size)
1047
1048 c.ExtLock.RLock()
1049 buf[b] = c.Extensions["DRI2"]
1050 c.ExtLock.RUnlock()
1051 b += 1
1052
1053 buf[b] = 7
1054 b += 1
1055
1056 xgb.Put16(buf[b:], uint16(size/4))
1057 b += 2
1058
1059 xgb.Put32(buf[b:], uint32(Drawable))
1060 b += 4
1061
1062 xgb.Put32(buf[b:], Count)
1063 b += 4
1064
1065 b += AttachFormatListBytes(buf[b:], Attachments)
1066
1067 return buf
1068 }
1069
1070
1071 type GetMSCCookie struct {
1072 *xgb.Cookie
1073 }
1074
1075
1076
1077 func GetMSC(c *xgb.Conn, Drawable xproto.Drawable) GetMSCCookie {
1078 c.ExtLock.RLock()
1079 defer c.ExtLock.RUnlock()
1080 if _, ok := c.Extensions["DRI2"]; !ok {
1081 panic("Cannot issue request 'GetMSC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1082 }
1083 cookie := c.NewCookie(true, true)
1084 c.NewRequest(getMSCRequest(c, Drawable), cookie)
1085 return GetMSCCookie{cookie}
1086 }
1087
1088
1089
1090 func GetMSCUnchecked(c *xgb.Conn, Drawable xproto.Drawable) GetMSCCookie {
1091 c.ExtLock.RLock()
1092 defer c.ExtLock.RUnlock()
1093 if _, ok := c.Extensions["DRI2"]; !ok {
1094 panic("Cannot issue request 'GetMSC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1095 }
1096 cookie := c.NewCookie(false, true)
1097 c.NewRequest(getMSCRequest(c, Drawable), cookie)
1098 return GetMSCCookie{cookie}
1099 }
1100
1101
1102 type GetMSCReply struct {
1103 Sequence uint16
1104 Length uint32
1105
1106 UstHi uint32
1107 UstLo uint32
1108 MscHi uint32
1109 MscLo uint32
1110 SbcHi uint32
1111 SbcLo uint32
1112 }
1113
1114
1115 func (cook GetMSCCookie) Reply() (*GetMSCReply, error) {
1116 buf, err := cook.Cookie.Reply()
1117 if err != nil {
1118 return nil, err
1119 }
1120 if buf == nil {
1121 return nil, nil
1122 }
1123 return getMSCReply(buf), nil
1124 }
1125
1126
1127 func getMSCReply(buf []byte) *GetMSCReply {
1128 v := new(GetMSCReply)
1129 b := 1
1130
1131 b += 1
1132
1133 v.Sequence = xgb.Get16(buf[b:])
1134 b += 2
1135
1136 v.Length = xgb.Get32(buf[b:])
1137 b += 4
1138
1139 v.UstHi = xgb.Get32(buf[b:])
1140 b += 4
1141
1142 v.UstLo = xgb.Get32(buf[b:])
1143 b += 4
1144
1145 v.MscHi = xgb.Get32(buf[b:])
1146 b += 4
1147
1148 v.MscLo = xgb.Get32(buf[b:])
1149 b += 4
1150
1151 v.SbcHi = xgb.Get32(buf[b:])
1152 b += 4
1153
1154 v.SbcLo = xgb.Get32(buf[b:])
1155 b += 4
1156
1157 return v
1158 }
1159
1160
1161
1162 func getMSCRequest(c *xgb.Conn, Drawable xproto.Drawable) []byte {
1163 size := 8
1164 b := 0
1165 buf := make([]byte, size)
1166
1167 c.ExtLock.RLock()
1168 buf[b] = c.Extensions["DRI2"]
1169 c.ExtLock.RUnlock()
1170 b += 1
1171
1172 buf[b] = 9
1173 b += 1
1174
1175 xgb.Put16(buf[b:], uint16(size/4))
1176 b += 2
1177
1178 xgb.Put32(buf[b:], uint32(Drawable))
1179 b += 4
1180
1181 return buf
1182 }
1183
1184
1185 type GetParamCookie struct {
1186 *xgb.Cookie
1187 }
1188
1189
1190
1191 func GetParam(c *xgb.Conn, Drawable xproto.Drawable, Param uint32) GetParamCookie {
1192 c.ExtLock.RLock()
1193 defer c.ExtLock.RUnlock()
1194 if _, ok := c.Extensions["DRI2"]; !ok {
1195 panic("Cannot issue request 'GetParam' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1196 }
1197 cookie := c.NewCookie(true, true)
1198 c.NewRequest(getParamRequest(c, Drawable, Param), cookie)
1199 return GetParamCookie{cookie}
1200 }
1201
1202
1203
1204 func GetParamUnchecked(c *xgb.Conn, Drawable xproto.Drawable, Param uint32) GetParamCookie {
1205 c.ExtLock.RLock()
1206 defer c.ExtLock.RUnlock()
1207 if _, ok := c.Extensions["DRI2"]; !ok {
1208 panic("Cannot issue request 'GetParam' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1209 }
1210 cookie := c.NewCookie(false, true)
1211 c.NewRequest(getParamRequest(c, Drawable, Param), cookie)
1212 return GetParamCookie{cookie}
1213 }
1214
1215
1216 type GetParamReply struct {
1217 Sequence uint16
1218 Length uint32
1219 IsParamRecognized bool
1220 ValueHi uint32
1221 ValueLo uint32
1222 }
1223
1224
1225 func (cook GetParamCookie) Reply() (*GetParamReply, error) {
1226 buf, err := cook.Cookie.Reply()
1227 if err != nil {
1228 return nil, err
1229 }
1230 if buf == nil {
1231 return nil, nil
1232 }
1233 return getParamReply(buf), nil
1234 }
1235
1236
1237 func getParamReply(buf []byte) *GetParamReply {
1238 v := new(GetParamReply)
1239 b := 1
1240
1241 if buf[b] == 1 {
1242 v.IsParamRecognized = true
1243 } else {
1244 v.IsParamRecognized = false
1245 }
1246 b += 1
1247
1248 v.Sequence = xgb.Get16(buf[b:])
1249 b += 2
1250
1251 v.Length = xgb.Get32(buf[b:])
1252 b += 4
1253
1254 v.ValueHi = xgb.Get32(buf[b:])
1255 b += 4
1256
1257 v.ValueLo = xgb.Get32(buf[b:])
1258 b += 4
1259
1260 return v
1261 }
1262
1263
1264
1265 func getParamRequest(c *xgb.Conn, Drawable xproto.Drawable, Param uint32) []byte {
1266 size := 12
1267 b := 0
1268 buf := make([]byte, size)
1269
1270 c.ExtLock.RLock()
1271 buf[b] = c.Extensions["DRI2"]
1272 c.ExtLock.RUnlock()
1273 b += 1
1274
1275 buf[b] = 13
1276 b += 1
1277
1278 xgb.Put16(buf[b:], uint16(size/4))
1279 b += 2
1280
1281 xgb.Put32(buf[b:], uint32(Drawable))
1282 b += 4
1283
1284 xgb.Put32(buf[b:], Param)
1285 b += 4
1286
1287 return buf
1288 }
1289
1290
1291 type QueryVersionCookie struct {
1292 *xgb.Cookie
1293 }
1294
1295
1296
1297 func QueryVersion(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) QueryVersionCookie {
1298 c.ExtLock.RLock()
1299 defer c.ExtLock.RUnlock()
1300 if _, ok := c.Extensions["DRI2"]; !ok {
1301 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1302 }
1303 cookie := c.NewCookie(true, true)
1304 c.NewRequest(queryVersionRequest(c, MajorVersion, MinorVersion), cookie)
1305 return QueryVersionCookie{cookie}
1306 }
1307
1308
1309
1310 func QueryVersionUnchecked(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) QueryVersionCookie {
1311 c.ExtLock.RLock()
1312 defer c.ExtLock.RUnlock()
1313 if _, ok := c.Extensions["DRI2"]; !ok {
1314 panic("Cannot issue request 'QueryVersion' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1315 }
1316 cookie := c.NewCookie(false, true)
1317 c.NewRequest(queryVersionRequest(c, MajorVersion, MinorVersion), cookie)
1318 return QueryVersionCookie{cookie}
1319 }
1320
1321
1322 type QueryVersionReply struct {
1323 Sequence uint16
1324 Length uint32
1325
1326 MajorVersion uint32
1327 MinorVersion uint32
1328 }
1329
1330
1331 func (cook QueryVersionCookie) Reply() (*QueryVersionReply, error) {
1332 buf, err := cook.Cookie.Reply()
1333 if err != nil {
1334 return nil, err
1335 }
1336 if buf == nil {
1337 return nil, nil
1338 }
1339 return queryVersionReply(buf), nil
1340 }
1341
1342
1343 func queryVersionReply(buf []byte) *QueryVersionReply {
1344 v := new(QueryVersionReply)
1345 b := 1
1346
1347 b += 1
1348
1349 v.Sequence = xgb.Get16(buf[b:])
1350 b += 2
1351
1352 v.Length = xgb.Get32(buf[b:])
1353 b += 4
1354
1355 v.MajorVersion = xgb.Get32(buf[b:])
1356 b += 4
1357
1358 v.MinorVersion = xgb.Get32(buf[b:])
1359 b += 4
1360
1361 return v
1362 }
1363
1364
1365
1366 func queryVersionRequest(c *xgb.Conn, MajorVersion uint32, MinorVersion uint32) []byte {
1367 size := 12
1368 b := 0
1369 buf := make([]byte, size)
1370
1371 c.ExtLock.RLock()
1372 buf[b] = c.Extensions["DRI2"]
1373 c.ExtLock.RUnlock()
1374 b += 1
1375
1376 buf[b] = 0
1377 b += 1
1378
1379 xgb.Put16(buf[b:], uint16(size/4))
1380 b += 2
1381
1382 xgb.Put32(buf[b:], MajorVersion)
1383 b += 4
1384
1385 xgb.Put32(buf[b:], MinorVersion)
1386 b += 4
1387
1388 return buf
1389 }
1390
1391
1392 type SwapBuffersCookie struct {
1393 *xgb.Cookie
1394 }
1395
1396
1397
1398 func SwapBuffers(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) SwapBuffersCookie {
1399 c.ExtLock.RLock()
1400 defer c.ExtLock.RUnlock()
1401 if _, ok := c.Extensions["DRI2"]; !ok {
1402 panic("Cannot issue request 'SwapBuffers' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1403 }
1404 cookie := c.NewCookie(true, true)
1405 c.NewRequest(swapBuffersRequest(c, Drawable, TargetMscHi, TargetMscLo, DivisorHi, DivisorLo, RemainderHi, RemainderLo), cookie)
1406 return SwapBuffersCookie{cookie}
1407 }
1408
1409
1410
1411 func SwapBuffersUnchecked(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) SwapBuffersCookie {
1412 c.ExtLock.RLock()
1413 defer c.ExtLock.RUnlock()
1414 if _, ok := c.Extensions["DRI2"]; !ok {
1415 panic("Cannot issue request 'SwapBuffers' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1416 }
1417 cookie := c.NewCookie(false, true)
1418 c.NewRequest(swapBuffersRequest(c, Drawable, TargetMscHi, TargetMscLo, DivisorHi, DivisorLo, RemainderHi, RemainderLo), cookie)
1419 return SwapBuffersCookie{cookie}
1420 }
1421
1422
1423 type SwapBuffersReply struct {
1424 Sequence uint16
1425 Length uint32
1426
1427 SwapHi uint32
1428 SwapLo uint32
1429 }
1430
1431
1432 func (cook SwapBuffersCookie) Reply() (*SwapBuffersReply, error) {
1433 buf, err := cook.Cookie.Reply()
1434 if err != nil {
1435 return nil, err
1436 }
1437 if buf == nil {
1438 return nil, nil
1439 }
1440 return swapBuffersReply(buf), nil
1441 }
1442
1443
1444 func swapBuffersReply(buf []byte) *SwapBuffersReply {
1445 v := new(SwapBuffersReply)
1446 b := 1
1447
1448 b += 1
1449
1450 v.Sequence = xgb.Get16(buf[b:])
1451 b += 2
1452
1453 v.Length = xgb.Get32(buf[b:])
1454 b += 4
1455
1456 v.SwapHi = xgb.Get32(buf[b:])
1457 b += 4
1458
1459 v.SwapLo = xgb.Get32(buf[b:])
1460 b += 4
1461
1462 return v
1463 }
1464
1465
1466
1467 func swapBuffersRequest(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) []byte {
1468 size := 32
1469 b := 0
1470 buf := make([]byte, size)
1471
1472 c.ExtLock.RLock()
1473 buf[b] = c.Extensions["DRI2"]
1474 c.ExtLock.RUnlock()
1475 b += 1
1476
1477 buf[b] = 8
1478 b += 1
1479
1480 xgb.Put16(buf[b:], uint16(size/4))
1481 b += 2
1482
1483 xgb.Put32(buf[b:], uint32(Drawable))
1484 b += 4
1485
1486 xgb.Put32(buf[b:], TargetMscHi)
1487 b += 4
1488
1489 xgb.Put32(buf[b:], TargetMscLo)
1490 b += 4
1491
1492 xgb.Put32(buf[b:], DivisorHi)
1493 b += 4
1494
1495 xgb.Put32(buf[b:], DivisorLo)
1496 b += 4
1497
1498 xgb.Put32(buf[b:], RemainderHi)
1499 b += 4
1500
1501 xgb.Put32(buf[b:], RemainderLo)
1502 b += 4
1503
1504 return buf
1505 }
1506
1507
1508 type SwapIntervalCookie struct {
1509 *xgb.Cookie
1510 }
1511
1512
1513
1514 func SwapInterval(c *xgb.Conn, Drawable xproto.Drawable, Interval uint32) SwapIntervalCookie {
1515 c.ExtLock.RLock()
1516 defer c.ExtLock.RUnlock()
1517 if _, ok := c.Extensions["DRI2"]; !ok {
1518 panic("Cannot issue request 'SwapInterval' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1519 }
1520 cookie := c.NewCookie(false, false)
1521 c.NewRequest(swapIntervalRequest(c, Drawable, Interval), cookie)
1522 return SwapIntervalCookie{cookie}
1523 }
1524
1525
1526
1527 func SwapIntervalChecked(c *xgb.Conn, Drawable xproto.Drawable, Interval uint32) SwapIntervalCookie {
1528 c.ExtLock.RLock()
1529 defer c.ExtLock.RUnlock()
1530 if _, ok := c.Extensions["DRI2"]; !ok {
1531 panic("Cannot issue request 'SwapInterval' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1532 }
1533 cookie := c.NewCookie(true, false)
1534 c.NewRequest(swapIntervalRequest(c, Drawable, Interval), cookie)
1535 return SwapIntervalCookie{cookie}
1536 }
1537
1538
1539
1540 func (cook SwapIntervalCookie) Check() error {
1541 return cook.Cookie.Check()
1542 }
1543
1544
1545
1546 func swapIntervalRequest(c *xgb.Conn, Drawable xproto.Drawable, Interval uint32) []byte {
1547 size := 12
1548 b := 0
1549 buf := make([]byte, size)
1550
1551 c.ExtLock.RLock()
1552 buf[b] = c.Extensions["DRI2"]
1553 c.ExtLock.RUnlock()
1554 b += 1
1555
1556 buf[b] = 12
1557 b += 1
1558
1559 xgb.Put16(buf[b:], uint16(size/4))
1560 b += 2
1561
1562 xgb.Put32(buf[b:], uint32(Drawable))
1563 b += 4
1564
1565 xgb.Put32(buf[b:], Interval)
1566 b += 4
1567
1568 return buf
1569 }
1570
1571
1572 type WaitMSCCookie struct {
1573 *xgb.Cookie
1574 }
1575
1576
1577
1578 func WaitMSC(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) WaitMSCCookie {
1579 c.ExtLock.RLock()
1580 defer c.ExtLock.RUnlock()
1581 if _, ok := c.Extensions["DRI2"]; !ok {
1582 panic("Cannot issue request 'WaitMSC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1583 }
1584 cookie := c.NewCookie(true, true)
1585 c.NewRequest(waitMSCRequest(c, Drawable, TargetMscHi, TargetMscLo, DivisorHi, DivisorLo, RemainderHi, RemainderLo), cookie)
1586 return WaitMSCCookie{cookie}
1587 }
1588
1589
1590
1591 func WaitMSCUnchecked(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) WaitMSCCookie {
1592 c.ExtLock.RLock()
1593 defer c.ExtLock.RUnlock()
1594 if _, ok := c.Extensions["DRI2"]; !ok {
1595 panic("Cannot issue request 'WaitMSC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1596 }
1597 cookie := c.NewCookie(false, true)
1598 c.NewRequest(waitMSCRequest(c, Drawable, TargetMscHi, TargetMscLo, DivisorHi, DivisorLo, RemainderHi, RemainderLo), cookie)
1599 return WaitMSCCookie{cookie}
1600 }
1601
1602
1603 type WaitMSCReply struct {
1604 Sequence uint16
1605 Length uint32
1606
1607 UstHi uint32
1608 UstLo uint32
1609 MscHi uint32
1610 MscLo uint32
1611 SbcHi uint32
1612 SbcLo uint32
1613 }
1614
1615
1616 func (cook WaitMSCCookie) Reply() (*WaitMSCReply, error) {
1617 buf, err := cook.Cookie.Reply()
1618 if err != nil {
1619 return nil, err
1620 }
1621 if buf == nil {
1622 return nil, nil
1623 }
1624 return waitMSCReply(buf), nil
1625 }
1626
1627
1628 func waitMSCReply(buf []byte) *WaitMSCReply {
1629 v := new(WaitMSCReply)
1630 b := 1
1631
1632 b += 1
1633
1634 v.Sequence = xgb.Get16(buf[b:])
1635 b += 2
1636
1637 v.Length = xgb.Get32(buf[b:])
1638 b += 4
1639
1640 v.UstHi = xgb.Get32(buf[b:])
1641 b += 4
1642
1643 v.UstLo = xgb.Get32(buf[b:])
1644 b += 4
1645
1646 v.MscHi = xgb.Get32(buf[b:])
1647 b += 4
1648
1649 v.MscLo = xgb.Get32(buf[b:])
1650 b += 4
1651
1652 v.SbcHi = xgb.Get32(buf[b:])
1653 b += 4
1654
1655 v.SbcLo = xgb.Get32(buf[b:])
1656 b += 4
1657
1658 return v
1659 }
1660
1661
1662
1663 func waitMSCRequest(c *xgb.Conn, Drawable xproto.Drawable, TargetMscHi uint32, TargetMscLo uint32, DivisorHi uint32, DivisorLo uint32, RemainderHi uint32, RemainderLo uint32) []byte {
1664 size := 32
1665 b := 0
1666 buf := make([]byte, size)
1667
1668 c.ExtLock.RLock()
1669 buf[b] = c.Extensions["DRI2"]
1670 c.ExtLock.RUnlock()
1671 b += 1
1672
1673 buf[b] = 10
1674 b += 1
1675
1676 xgb.Put16(buf[b:], uint16(size/4))
1677 b += 2
1678
1679 xgb.Put32(buf[b:], uint32(Drawable))
1680 b += 4
1681
1682 xgb.Put32(buf[b:], TargetMscHi)
1683 b += 4
1684
1685 xgb.Put32(buf[b:], TargetMscLo)
1686 b += 4
1687
1688 xgb.Put32(buf[b:], DivisorHi)
1689 b += 4
1690
1691 xgb.Put32(buf[b:], DivisorLo)
1692 b += 4
1693
1694 xgb.Put32(buf[b:], RemainderHi)
1695 b += 4
1696
1697 xgb.Put32(buf[b:], RemainderLo)
1698 b += 4
1699
1700 return buf
1701 }
1702
1703
1704 type WaitSBCCookie struct {
1705 *xgb.Cookie
1706 }
1707
1708
1709
1710 func WaitSBC(c *xgb.Conn, Drawable xproto.Drawable, TargetSbcHi uint32, TargetSbcLo uint32) WaitSBCCookie {
1711 c.ExtLock.RLock()
1712 defer c.ExtLock.RUnlock()
1713 if _, ok := c.Extensions["DRI2"]; !ok {
1714 panic("Cannot issue request 'WaitSBC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1715 }
1716 cookie := c.NewCookie(true, true)
1717 c.NewRequest(waitSBCRequest(c, Drawable, TargetSbcHi, TargetSbcLo), cookie)
1718 return WaitSBCCookie{cookie}
1719 }
1720
1721
1722
1723 func WaitSBCUnchecked(c *xgb.Conn, Drawable xproto.Drawable, TargetSbcHi uint32, TargetSbcLo uint32) WaitSBCCookie {
1724 c.ExtLock.RLock()
1725 defer c.ExtLock.RUnlock()
1726 if _, ok := c.Extensions["DRI2"]; !ok {
1727 panic("Cannot issue request 'WaitSBC' using the uninitialized extension 'DRI2'. dri2.Init(connObj) must be called first.")
1728 }
1729 cookie := c.NewCookie(false, true)
1730 c.NewRequest(waitSBCRequest(c, Drawable, TargetSbcHi, TargetSbcLo), cookie)
1731 return WaitSBCCookie{cookie}
1732 }
1733
1734
1735 type WaitSBCReply struct {
1736 Sequence uint16
1737 Length uint32
1738
1739 UstHi uint32
1740 UstLo uint32
1741 MscHi uint32
1742 MscLo uint32
1743 SbcHi uint32
1744 SbcLo uint32
1745 }
1746
1747
1748 func (cook WaitSBCCookie) Reply() (*WaitSBCReply, error) {
1749 buf, err := cook.Cookie.Reply()
1750 if err != nil {
1751 return nil, err
1752 }
1753 if buf == nil {
1754 return nil, nil
1755 }
1756 return waitSBCReply(buf), nil
1757 }
1758
1759
1760 func waitSBCReply(buf []byte) *WaitSBCReply {
1761 v := new(WaitSBCReply)
1762 b := 1
1763
1764 b += 1
1765
1766 v.Sequence = xgb.Get16(buf[b:])
1767 b += 2
1768
1769 v.Length = xgb.Get32(buf[b:])
1770 b += 4
1771
1772 v.UstHi = xgb.Get32(buf[b:])
1773 b += 4
1774
1775 v.UstLo = xgb.Get32(buf[b:])
1776 b += 4
1777
1778 v.MscHi = xgb.Get32(buf[b:])
1779 b += 4
1780
1781 v.MscLo = xgb.Get32(buf[b:])
1782 b += 4
1783
1784 v.SbcHi = xgb.Get32(buf[b:])
1785 b += 4
1786
1787 v.SbcLo = xgb.Get32(buf[b:])
1788 b += 4
1789
1790 return v
1791 }
1792
1793
1794
1795 func waitSBCRequest(c *xgb.Conn, Drawable xproto.Drawable, TargetSbcHi uint32, TargetSbcLo uint32) []byte {
1796 size := 16
1797 b := 0
1798 buf := make([]byte, size)
1799
1800 c.ExtLock.RLock()
1801 buf[b] = c.Extensions["DRI2"]
1802 c.ExtLock.RUnlock()
1803 b += 1
1804
1805 buf[b] = 11
1806 b += 1
1807
1808 xgb.Put16(buf[b:], uint16(size/4))
1809 b += 2
1810
1811 xgb.Put32(buf[b:], uint32(Drawable))
1812 b += 4
1813
1814 xgb.Put32(buf[b:], TargetSbcHi)
1815 b += 4
1816
1817 xgb.Put32(buf[b:], TargetSbcLo)
1818 b += 4
1819
1820 return buf
1821 }
1822
View as plain text