github.com/BurntSushi/xgb@v0.0.0-20210121224620-deaf085860bc/dri2/dri2.go (about) 1 // Package dri2 is the X client API for the DRI2 extension. 2 package dri2 3 4 // This file is automatically generated from dri2.xml. Edit at your peril! 5 6 import ( 7 "github.com/BurntSushi/xgb" 8 9 "github.com/BurntSushi/xgb/xproto" 10 ) 11 12 // Init must be called before using the DRI2 extension. 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 // AttachFormatRead reads a byte slice into a AttachFormat value. 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 // AttachFormatReadList reads a byte slice into a list of AttachFormat values. 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 // Bytes writes a AttachFormat value to a byte slice. 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 // AttachFormatListBytes writes a list of AttachFormat values to a byte slice. 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 // BufferSwapComplete is the event number for a BufferSwapCompleteEvent. 108 const BufferSwapComplete = 0 109 110 type BufferSwapCompleteEvent struct { 111 Sequence uint16 112 // padding: 1 bytes 113 EventType uint16 114 // padding: 2 bytes 115 Drawable xproto.Drawable 116 UstHi uint32 117 UstLo uint32 118 MscHi uint32 119 MscLo uint32 120 Sbc uint32 121 } 122 123 // BufferSwapCompleteEventNew constructs a BufferSwapCompleteEvent value that implements xgb.Event from a byte slice. 124 func BufferSwapCompleteEventNew(buf []byte) xgb.Event { 125 v := BufferSwapCompleteEvent{} 126 b := 1 // don't read event number 127 128 b += 1 // padding 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 // padding 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 // Bytes writes a BufferSwapCompleteEvent value to a byte slice. 160 func (v BufferSwapCompleteEvent) Bytes() []byte { 161 buf := make([]byte, 32) 162 b := 0 163 164 // write event number 165 buf[b] = 0 166 b += 1 167 168 b += 1 // padding 169 170 b += 2 // skip sequence number 171 172 xgb.Put16(buf[b:], v.EventType) 173 b += 2 174 175 b += 2 // padding 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 // SequenceId returns the sequence id attached to the BufferSwapComplete event. 199 // Events without a sequence number (KeymapNotify) return 0. 200 // This is mostly used internally. 201 func (v BufferSwapCompleteEvent) SequenceId() uint16 { 202 return v.Sequence 203 } 204 205 // String is a rudimentary string representation of BufferSwapCompleteEvent. 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 // DRI2BufferRead reads a byte slice into a DRI2Buffer value. 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 // DRI2BufferReadList reads a byte slice into a list of DRI2Buffer values. 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 // Bytes writes a DRI2Buffer value to a byte slice. 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 // DRI2BufferListBytes writes a list of DRI2Buffer values to a byte slice. 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 // InvalidateBuffers is the event number for a InvalidateBuffersEvent. 310 const InvalidateBuffers = 1 311 312 type InvalidateBuffersEvent struct { 313 Sequence uint16 314 // padding: 1 bytes 315 Drawable xproto.Drawable 316 } 317 318 // InvalidateBuffersEventNew constructs a InvalidateBuffersEvent value that implements xgb.Event from a byte slice. 319 func InvalidateBuffersEventNew(buf []byte) xgb.Event { 320 v := InvalidateBuffersEvent{} 321 b := 1 // don't read event number 322 323 b += 1 // padding 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 // Bytes writes a InvalidateBuffersEvent value to a byte slice. 335 func (v InvalidateBuffersEvent) Bytes() []byte { 336 buf := make([]byte, 32) 337 b := 0 338 339 // write event number 340 buf[b] = 1 341 b += 1 342 343 b += 1 // padding 344 345 b += 2 // skip sequence number 346 347 xgb.Put32(buf[b:], uint32(v.Drawable)) 348 b += 4 349 350 return buf 351 } 352 353 // SequenceId returns the sequence id attached to the InvalidateBuffers event. 354 // Events without a sequence number (KeymapNotify) return 0. 355 // This is mostly used internally. 356 func (v InvalidateBuffersEvent) SequenceId() uint16 { 357 return v.Sequence 358 } 359 360 // String is a rudimentary string representation of InvalidateBuffersEvent. 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 // Skipping definition for base type 'Bool' 373 374 // Skipping definition for base type 'Byte' 375 376 // Skipping definition for base type 'Card8' 377 378 // Skipping definition for base type 'Char' 379 380 // Skipping definition for base type 'Void' 381 382 // Skipping definition for base type 'Double' 383 384 // Skipping definition for base type 'Float' 385 386 // Skipping definition for base type 'Int16' 387 388 // Skipping definition for base type 'Int32' 389 390 // Skipping definition for base type 'Int8' 391 392 // Skipping definition for base type 'Card16' 393 394 // Skipping definition for base type 'Card32' 395 396 // AuthenticateCookie is a cookie used only for Authenticate requests. 397 type AuthenticateCookie struct { 398 *xgb.Cookie 399 } 400 401 // Authenticate sends a checked request. 402 // If an error occurs, it will be returned with the reply by calling AuthenticateCookie.Reply() 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 // AuthenticateUnchecked sends an unchecked request. 415 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // AuthenticateReply represents the data returned from a Authenticate request. 428 type AuthenticateReply struct { 429 Sequence uint16 // sequence number of the request for this reply 430 Length uint32 // number of bytes in this reply 431 // padding: 1 bytes 432 Authenticated uint32 433 } 434 435 // Reply blocks and returns the reply data for a Authenticate request. 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 // authenticateReply reads a byte slice into a AuthenticateReply value. 448 func authenticateReply(buf []byte) *AuthenticateReply { 449 v := new(AuthenticateReply) 450 b := 1 // skip reply determinant 451 452 b += 1 // padding 453 454 v.Sequence = xgb.Get16(buf[b:]) 455 b += 2 456 457 v.Length = xgb.Get32(buf[b:]) // 4-byte units 458 b += 4 459 460 v.Authenticated = xgb.Get32(buf[b:]) 461 b += 4 462 463 return v 464 } 465 466 // Write request to wire for Authenticate 467 // authenticateRequest writes a Authenticate request to a byte slice. 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 // request opcode 479 b += 1 480 481 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // ConnectCookie is a cookie used only for Connect requests. 494 type ConnectCookie struct { 495 *xgb.Cookie 496 } 497 498 // Connect sends a checked request. 499 // If an error occurs, it will be returned with the reply by calling ConnectCookie.Reply() 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 // ConnectUnchecked sends an unchecked request. 512 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // ConnectReply represents the data returned from a Connect request. 525 type ConnectReply struct { 526 Sequence uint16 // sequence number of the request for this reply 527 Length uint32 // number of bytes in this reply 528 // padding: 1 bytes 529 DriverNameLength uint32 530 DeviceNameLength uint32 531 // padding: 16 bytes 532 DriverName string // size: xgb.Pad((int(DriverNameLength) * 1)) 533 AlignmentPad []byte // size: xgb.Pad(((((int(DriverNameLength) + 3) & -4) - int(DriverNameLength)) * 1)) 534 DeviceName string // size: xgb.Pad((int(DeviceNameLength) * 1)) 535 } 536 537 // Reply blocks and returns the reply data for a Connect request. 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 // connectReply reads a byte slice into a ConnectReply value. 550 func connectReply(buf []byte) *ConnectReply { 551 v := new(ConnectReply) 552 b := 1 // skip reply determinant 553 554 b += 1 // padding 555 556 v.Sequence = xgb.Get16(buf[b:]) 557 b += 2 558 559 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // padding 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 // Write request to wire for Connect 592 // connectRequest writes a Connect request to a byte slice. 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 // request opcode 604 b += 1 605 606 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // CopyRegionCookie is a cookie used only for CopyRegion requests. 619 type CopyRegionCookie struct { 620 *xgb.Cookie 621 } 622 623 // CopyRegion sends a checked request. 624 // If an error occurs, it will be returned with the reply by calling CopyRegionCookie.Reply() 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 // CopyRegionUnchecked sends an unchecked request. 637 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // CopyRegionReply represents the data returned from a CopyRegion request. 650 type CopyRegionReply struct { 651 Sequence uint16 // sequence number of the request for this reply 652 Length uint32 // number of bytes in this reply 653 // padding: 1 bytes 654 } 655 656 // Reply blocks and returns the reply data for a CopyRegion request. 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 // copyRegionReply reads a byte slice into a CopyRegionReply value. 669 func copyRegionReply(buf []byte) *CopyRegionReply { 670 v := new(CopyRegionReply) 671 b := 1 // skip reply determinant 672 673 b += 1 // padding 674 675 v.Sequence = xgb.Get16(buf[b:]) 676 b += 2 677 678 v.Length = xgb.Get32(buf[b:]) // 4-byte units 679 b += 4 680 681 return v 682 } 683 684 // Write request to wire for CopyRegion 685 // copyRegionRequest writes a CopyRegion request to a byte slice. 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 // request opcode 697 b += 1 698 699 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // CreateDrawableCookie is a cookie used only for CreateDrawable requests. 718 type CreateDrawableCookie struct { 719 *xgb.Cookie 720 } 721 722 // CreateDrawable sends an unchecked request. 723 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // CreateDrawableChecked sends a checked request. 736 // If an error occurs, it can be retrieved using CreateDrawableCookie.Check() 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 // Check returns an error if one occurred for checked requests that are not expecting a reply. 749 // This cannot be called for requests expecting a reply, nor for unchecked requests. 750 func (cook CreateDrawableCookie) Check() error { 751 return cook.Cookie.Check() 752 } 753 754 // Write request to wire for CreateDrawable 755 // createDrawableRequest writes a CreateDrawable request to a byte slice. 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 // request opcode 767 b += 1 768 769 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 770 b += 2 771 772 xgb.Put32(buf[b:], uint32(Drawable)) 773 b += 4 774 775 return buf 776 } 777 778 // DestroyDrawableCookie is a cookie used only for DestroyDrawable requests. 779 type DestroyDrawableCookie struct { 780 *xgb.Cookie 781 } 782 783 // DestroyDrawable sends an unchecked request. 784 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // DestroyDrawableChecked sends a checked request. 797 // If an error occurs, it can be retrieved using DestroyDrawableCookie.Check() 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 // Check returns an error if one occurred for checked requests that are not expecting a reply. 810 // This cannot be called for requests expecting a reply, nor for unchecked requests. 811 func (cook DestroyDrawableCookie) Check() error { 812 return cook.Cookie.Check() 813 } 814 815 // Write request to wire for DestroyDrawable 816 // destroyDrawableRequest writes a DestroyDrawable request to a byte slice. 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 // request opcode 828 b += 1 829 830 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 831 b += 2 832 833 xgb.Put32(buf[b:], uint32(Drawable)) 834 b += 4 835 836 return buf 837 } 838 839 // GetBuffersCookie is a cookie used only for GetBuffers requests. 840 type GetBuffersCookie struct { 841 *xgb.Cookie 842 } 843 844 // GetBuffers sends a checked request. 845 // If an error occurs, it will be returned with the reply by calling GetBuffersCookie.Reply() 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 // GetBuffersUnchecked sends an unchecked request. 858 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // GetBuffersReply represents the data returned from a GetBuffers request. 871 type GetBuffersReply struct { 872 Sequence uint16 // sequence number of the request for this reply 873 Length uint32 // number of bytes in this reply 874 // padding: 1 bytes 875 Width uint32 876 Height uint32 877 Count uint32 878 // padding: 12 bytes 879 Buffers []DRI2Buffer // size: xgb.Pad((int(Count) * 20)) 880 } 881 882 // Reply blocks and returns the reply data for a GetBuffers request. 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 // getBuffersReply reads a byte slice into a GetBuffersReply value. 895 func getBuffersReply(buf []byte) *GetBuffersReply { 896 v := new(GetBuffersReply) 897 b := 1 // skip reply determinant 898 899 b += 1 // padding 900 901 v.Sequence = xgb.Get16(buf[b:]) 902 b += 2 903 904 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // padding 917 918 v.Buffers = make([]DRI2Buffer, v.Count) 919 b += DRI2BufferReadList(buf[b:], v.Buffers) 920 921 return v 922 } 923 924 // Write request to wire for GetBuffers 925 // getBuffersRequest writes a GetBuffers request to a byte slice. 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 // request opcode 937 b += 1 938 939 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // GetBuffersWithFormatCookie is a cookie used only for GetBuffersWithFormat requests. 957 type GetBuffersWithFormatCookie struct { 958 *xgb.Cookie 959 } 960 961 // GetBuffersWithFormat sends a checked request. 962 // If an error occurs, it will be returned with the reply by calling GetBuffersWithFormatCookie.Reply() 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 // GetBuffersWithFormatUnchecked sends an unchecked request. 975 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // GetBuffersWithFormatReply represents the data returned from a GetBuffersWithFormat request. 988 type GetBuffersWithFormatReply struct { 989 Sequence uint16 // sequence number of the request for this reply 990 Length uint32 // number of bytes in this reply 991 // padding: 1 bytes 992 Width uint32 993 Height uint32 994 Count uint32 995 // padding: 12 bytes 996 Buffers []DRI2Buffer // size: xgb.Pad((int(Count) * 20)) 997 } 998 999 // Reply blocks and returns the reply data for a GetBuffersWithFormat request. 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 // getBuffersWithFormatReply reads a byte slice into a GetBuffersWithFormatReply value. 1012 func getBuffersWithFormatReply(buf []byte) *GetBuffersWithFormatReply { 1013 v := new(GetBuffersWithFormatReply) 1014 b := 1 // skip reply determinant 1015 1016 b += 1 // padding 1017 1018 v.Sequence = xgb.Get16(buf[b:]) 1019 b += 2 1020 1021 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // padding 1034 1035 v.Buffers = make([]DRI2Buffer, v.Count) 1036 b += DRI2BufferReadList(buf[b:], v.Buffers) 1037 1038 return v 1039 } 1040 1041 // Write request to wire for GetBuffersWithFormat 1042 // getBuffersWithFormatRequest writes a GetBuffersWithFormat request to a byte slice. 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 // request opcode 1054 b += 1 1055 1056 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // GetMSCCookie is a cookie used only for GetMSC requests. 1071 type GetMSCCookie struct { 1072 *xgb.Cookie 1073 } 1074 1075 // GetMSC sends a checked request. 1076 // If an error occurs, it will be returned with the reply by calling GetMSCCookie.Reply() 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 // GetMSCUnchecked sends an unchecked request. 1089 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // GetMSCReply represents the data returned from a GetMSC request. 1102 type GetMSCReply struct { 1103 Sequence uint16 // sequence number of the request for this reply 1104 Length uint32 // number of bytes in this reply 1105 // padding: 1 bytes 1106 UstHi uint32 1107 UstLo uint32 1108 MscHi uint32 1109 MscLo uint32 1110 SbcHi uint32 1111 SbcLo uint32 1112 } 1113 1114 // Reply blocks and returns the reply data for a GetMSC request. 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 // getMSCReply reads a byte slice into a GetMSCReply value. 1127 func getMSCReply(buf []byte) *GetMSCReply { 1128 v := new(GetMSCReply) 1129 b := 1 // skip reply determinant 1130 1131 b += 1 // padding 1132 1133 v.Sequence = xgb.Get16(buf[b:]) 1134 b += 2 1135 1136 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // Write request to wire for GetMSC 1161 // getMSCRequest writes a GetMSC request to a byte slice. 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 // request opcode 1173 b += 1 1174 1175 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 1176 b += 2 1177 1178 xgb.Put32(buf[b:], uint32(Drawable)) 1179 b += 4 1180 1181 return buf 1182 } 1183 1184 // GetParamCookie is a cookie used only for GetParam requests. 1185 type GetParamCookie struct { 1186 *xgb.Cookie 1187 } 1188 1189 // GetParam sends a checked request. 1190 // If an error occurs, it will be returned with the reply by calling GetParamCookie.Reply() 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 // GetParamUnchecked sends an unchecked request. 1203 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // GetParamReply represents the data returned from a GetParam request. 1216 type GetParamReply struct { 1217 Sequence uint16 // sequence number of the request for this reply 1218 Length uint32 // number of bytes in this reply 1219 IsParamRecognized bool 1220 ValueHi uint32 1221 ValueLo uint32 1222 } 1223 1224 // Reply blocks and returns the reply data for a GetParam request. 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 // getParamReply reads a byte slice into a GetParamReply value. 1237 func getParamReply(buf []byte) *GetParamReply { 1238 v := new(GetParamReply) 1239 b := 1 // skip reply determinant 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:]) // 4-byte units 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 // Write request to wire for GetParam 1264 // getParamRequest writes a GetParam request to a byte slice. 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 // request opcode 1276 b += 1 1277 1278 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // QueryVersionCookie is a cookie used only for QueryVersion requests. 1291 type QueryVersionCookie struct { 1292 *xgb.Cookie 1293 } 1294 1295 // QueryVersion sends a checked request. 1296 // If an error occurs, it will be returned with the reply by calling QueryVersionCookie.Reply() 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 // QueryVersionUnchecked sends an unchecked request. 1309 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // QueryVersionReply represents the data returned from a QueryVersion request. 1322 type QueryVersionReply struct { 1323 Sequence uint16 // sequence number of the request for this reply 1324 Length uint32 // number of bytes in this reply 1325 // padding: 1 bytes 1326 MajorVersion uint32 1327 MinorVersion uint32 1328 } 1329 1330 // Reply blocks and returns the reply data for a QueryVersion request. 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 // queryVersionReply reads a byte slice into a QueryVersionReply value. 1343 func queryVersionReply(buf []byte) *QueryVersionReply { 1344 v := new(QueryVersionReply) 1345 b := 1 // skip reply determinant 1346 1347 b += 1 // padding 1348 1349 v.Sequence = xgb.Get16(buf[b:]) 1350 b += 2 1351 1352 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // Write request to wire for QueryVersion 1365 // queryVersionRequest writes a QueryVersion request to a byte slice. 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 // request opcode 1377 b += 1 1378 1379 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // SwapBuffersCookie is a cookie used only for SwapBuffers requests. 1392 type SwapBuffersCookie struct { 1393 *xgb.Cookie 1394 } 1395 1396 // SwapBuffers sends a checked request. 1397 // If an error occurs, it will be returned with the reply by calling SwapBuffersCookie.Reply() 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 // SwapBuffersUnchecked sends an unchecked request. 1410 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // SwapBuffersReply represents the data returned from a SwapBuffers request. 1423 type SwapBuffersReply struct { 1424 Sequence uint16 // sequence number of the request for this reply 1425 Length uint32 // number of bytes in this reply 1426 // padding: 1 bytes 1427 SwapHi uint32 1428 SwapLo uint32 1429 } 1430 1431 // Reply blocks and returns the reply data for a SwapBuffers request. 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 // swapBuffersReply reads a byte slice into a SwapBuffersReply value. 1444 func swapBuffersReply(buf []byte) *SwapBuffersReply { 1445 v := new(SwapBuffersReply) 1446 b := 1 // skip reply determinant 1447 1448 b += 1 // padding 1449 1450 v.Sequence = xgb.Get16(buf[b:]) 1451 b += 2 1452 1453 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // Write request to wire for SwapBuffers 1466 // swapBuffersRequest writes a SwapBuffers request to a byte slice. 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 // request opcode 1478 b += 1 1479 1480 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // SwapIntervalCookie is a cookie used only for SwapInterval requests. 1508 type SwapIntervalCookie struct { 1509 *xgb.Cookie 1510 } 1511 1512 // SwapInterval sends an unchecked request. 1513 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // SwapIntervalChecked sends a checked request. 1526 // If an error occurs, it can be retrieved using SwapIntervalCookie.Check() 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 // Check returns an error if one occurred for checked requests that are not expecting a reply. 1539 // This cannot be called for requests expecting a reply, nor for unchecked requests. 1540 func (cook SwapIntervalCookie) Check() error { 1541 return cook.Cookie.Check() 1542 } 1543 1544 // Write request to wire for SwapInterval 1545 // swapIntervalRequest writes a SwapInterval request to a byte slice. 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 // request opcode 1557 b += 1 1558 1559 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // WaitMSCCookie is a cookie used only for WaitMSC requests. 1572 type WaitMSCCookie struct { 1573 *xgb.Cookie 1574 } 1575 1576 // WaitMSC sends a checked request. 1577 // If an error occurs, it will be returned with the reply by calling WaitMSCCookie.Reply() 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 // WaitMSCUnchecked sends an unchecked request. 1590 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // WaitMSCReply represents the data returned from a WaitMSC request. 1603 type WaitMSCReply struct { 1604 Sequence uint16 // sequence number of the request for this reply 1605 Length uint32 // number of bytes in this reply 1606 // padding: 1 bytes 1607 UstHi uint32 1608 UstLo uint32 1609 MscHi uint32 1610 MscLo uint32 1611 SbcHi uint32 1612 SbcLo uint32 1613 } 1614 1615 // Reply blocks and returns the reply data for a WaitMSC request. 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 // waitMSCReply reads a byte slice into a WaitMSCReply value. 1628 func waitMSCReply(buf []byte) *WaitMSCReply { 1629 v := new(WaitMSCReply) 1630 b := 1 // skip reply determinant 1631 1632 b += 1 // padding 1633 1634 v.Sequence = xgb.Get16(buf[b:]) 1635 b += 2 1636 1637 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // Write request to wire for WaitMSC 1662 // waitMSCRequest writes a WaitMSC request to a byte slice. 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 // request opcode 1674 b += 1 1675 1676 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 // WaitSBCCookie is a cookie used only for WaitSBC requests. 1704 type WaitSBCCookie struct { 1705 *xgb.Cookie 1706 } 1707 1708 // WaitSBC sends a checked request. 1709 // If an error occurs, it will be returned with the reply by calling WaitSBCCookie.Reply() 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 // WaitSBCUnchecked sends an unchecked request. 1722 // If an error occurs, it can only be retrieved using xgb.WaitForEvent or xgb.PollForEvent. 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 // WaitSBCReply represents the data returned from a WaitSBC request. 1735 type WaitSBCReply struct { 1736 Sequence uint16 // sequence number of the request for this reply 1737 Length uint32 // number of bytes in this reply 1738 // padding: 1 bytes 1739 UstHi uint32 1740 UstLo uint32 1741 MscHi uint32 1742 MscLo uint32 1743 SbcHi uint32 1744 SbcLo uint32 1745 } 1746 1747 // Reply blocks and returns the reply data for a WaitSBC request. 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 // waitSBCReply reads a byte slice into a WaitSBCReply value. 1760 func waitSBCReply(buf []byte) *WaitSBCReply { 1761 v := new(WaitSBCReply) 1762 b := 1 // skip reply determinant 1763 1764 b += 1 // padding 1765 1766 v.Sequence = xgb.Get16(buf[b:]) 1767 b += 2 1768 1769 v.Length = xgb.Get32(buf[b:]) // 4-byte units 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 // Write request to wire for WaitSBC 1794 // waitSBCRequest writes a WaitSBC request to a byte slice. 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 // request opcode 1806 b += 1 1807 1808 xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units 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 }