Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(517)

Side by Side Diff: src/gpu/gl/GrGLGpu.cpp

Issue 1534123003: More framework support for TransferBuffers (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Address comments Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 8
9 #include "GrGLGpu.h" 9 #include "GrGLGpu.h"
10 #include "GrGLGLSL.h" 10 #include "GrGLGLSL.h"
(...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 return false; 612 return false;
613 } 613 }
614 614
615 this->setScratchTextureUnit(); 615 this->setScratchTextureUnit();
616 GL_CALL(BindTexture(glTex->target(), glTex->textureID())); 616 GL_CALL(BindTexture(glTex->target(), glTex->textureID()));
617 617
618 bool success = false; 618 bool success = false;
619 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) { 619 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) {
620 // We check that config == desc.fConfig in GrGLGpu::canWriteTexturePixel s() 620 // We check that config == desc.fConfig in GrGLGpu::canWriteTexturePixel s()
621 SkASSERT(config == glTex->desc().fConfig); 621 SkASSERT(config == glTex->desc().fConfig);
622 success = this->uploadCompressedTexData(glTex->desc(), glTex->target(), buffer, false, left, 622 success = this->uploadCompressedTexData(glTex->desc(), glTex->target(), buffer,
623 top, width, height); 623 kDefault_UploadType, left, top, width, height);
624 } else { 624 } else {
625 success = this->uploadTexData(glTex->desc(), glTex->target(), false, lef t, top, width, 625 success = this->uploadTexData(glTex->desc(), glTex->target(), kDefault_U ploadType,
626 height, config, buffer, rowBytes); 626 left, top, width, height, config, buffer, rowBytes);
627 } 627 }
628
629 if (success) {
630 glTex->texturePriv().dirtyMipMaps(true);
631 return true;
632 }
633
634 return false;
635 }
636
637 bool GrGLGpu::onTransferPixels(GrSurface* surface,
638 int left, int top, int width, int height,
639 GrPixelConfig config, GrTransferBuffer* buffer,
640 size_t offset, size_t rowBytes) {
641 GrGLTexture* glTex = static_cast<GrGLTexture*>(surface->asTexture());
642 if (!glTex) {
bsalomon 2016/01/05 14:01:17 If there is a simple way to share this preamble of
jvanverth1 2016/01/05 17:21:28 Done.
643 return false;
644 }
645
646 // OpenGL doesn't do sRGB <-> linear conversions when reading and writing pi xels.
647 if (GrPixelConfigIsSRGB(surface->config()) != GrPixelConfigIsSRGB(config)) {
648 return false;
649 }
650
651 // Transfer pixels is only implemented for TEXTURE_2D textures
652 if (GR_GL_TEXTURE_2D != glTex->target()) {
653 return false;
654 }
655
656 // For the moment, can't transfer compressed data
657 if (GrPixelConfigIsCompressed(glTex->desc().fConfig)) {
658 return false;
659 }
660
661 this->setScratchTextureUnit();
662 GL_CALL(BindTexture(glTex->target(), glTex->textureID()));
663
664 SkASSERT(!buffer->isMapped());
665 GrGLTransferBuffer* glBuffer = reinterpret_cast<GrGLTransferBuffer*>(buffer) ;
666 // bind the transfer buffer
667 SkASSERT(GR_GL_PIXEL_UNPACK_BUFFER == glBuffer->bufferType() ||
668 GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM == glBuffer->bufferType ());
669 GL_CALL(BindBuffer(glBuffer->bufferType(), glBuffer->bufferID()));
670
671 bool success = false;
672 success = this->uploadTexData(glTex->desc(), glTex->target(), kTransfer_Uplo adType,
673 left, top, width, height, config, buffer, rowB ytes);
628 674
629 if (success) { 675 if (success) {
630 glTex->texturePriv().dirtyMipMaps(true); 676 glTex->texturePriv().dirtyMipMaps(true);
631 return true; 677 return true;
632 } 678 }
633 679
634 return false; 680 return false;
635 } 681 }
636 682
637 // For GL_[UN]PACK_ALIGNMENT. 683 // For GL_[UN]PACK_ALIGNMENT.
(...skipping 21 matching lines...) Expand all
659 const GrGLInterface* interface) { 705 const GrGLInterface* interface) {
660 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) { 706 if (SkToBool(desc.fFlags & kCheckAllocation_GrSurfaceFlag)) {
661 return GR_GL_GET_ERROR(interface); 707 return GR_GL_GET_ERROR(interface);
662 } else { 708 } else {
663 return CHECK_ALLOC_ERROR(interface); 709 return CHECK_ALLOC_ERROR(interface);
664 } 710 }
665 } 711 }
666 712
667 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc, 713 bool GrGLGpu::uploadTexData(const GrSurfaceDesc& desc,
668 GrGLenum target, 714 GrGLenum target,
669 bool isNewTexture, 715 UploadType uploadType,
670 int left, int top, int width, int height, 716 int left, int top, int width, int height,
671 GrPixelConfig dataConfig, 717 GrPixelConfig dataConfig,
672 const void* data, 718 const void* dataOrOffset,
673 size_t rowBytes) { 719 size_t rowBytes) {
674 SkASSERT(data || isNewTexture); 720 SkASSERT(dataOrOffset || kNewTexture_UploadType == uploadType ||
721 kTransfer_UploadType == uploadType);
675 722
676 // If we're uploading compressed data then we should be using uploadCompress edTexData 723 // If we're uploading compressed data then we should be using uploadCompress edTexData
677 SkASSERT(!GrPixelConfigIsCompressed(dataConfig)); 724 SkASSERT(!GrPixelConfigIsCompressed(dataConfig));
678 725
679 SkASSERT(this->caps()->isConfigTexturable(desc.fConfig)); 726 SkASSERT(this->caps()->isConfigTexturable(desc.fConfig));
680 727
681 size_t bpp = GrBytesPerPixel(dataConfig); 728 size_t bpp = GrBytesPerPixel(dataConfig);
682 if (!GrSurfacePriv::AdjustWritePixelParams(desc.fWidth, desc.fHeight, bpp, & left, &top, 729 if (!GrSurfacePriv::AdjustWritePixelParams(desc.fWidth, desc.fHeight, bpp, & left, &top,
683 &width, &height, &data, &rowBytes )) { 730 &width, &height, &dataOrOffset, & rowBytes)) {
684 return false; 731 return false;
685 } 732 }
686 size_t trimRowBytes = width * bpp; 733 size_t trimRowBytes = width * bpp;
687 734
688 // in case we need a temporary, trimmed copy of the src pixels 735 // in case we need a temporary, trimmed copy of the src pixels
689 #if defined(GOOGLE3) 736 #if defined(GOOGLE3)
690 // Stack frame size is limited in GOOGLE3. 737 // Stack frame size is limited in GOOGLE3.
691 SkAutoSMalloc<64 * 128> tempStorage; 738 SkAutoSMalloc<64 * 128> tempStorage;
692 #else 739 #else
693 SkAutoSMalloc<128 * 128> tempStorage; 740 SkAutoSMalloc<128 * 128> tempStorage;
(...skipping 10 matching lines...) Expand all
704 751
705 /* 752 /*
706 * Check whether to allocate a temporary buffer for flipping y or 753 * Check whether to allocate a temporary buffer for flipping y or
707 * because our srcData has extra bytes past each row. If so, we need 754 * because our srcData has extra bytes past each row. If so, we need
708 * to trim those off here, since GL ES may not let us specify 755 * to trim those off here, since GL ES may not let us specify
709 * GL_UNPACK_ROW_LENGTH. 756 * GL_UNPACK_ROW_LENGTH.
710 */ 757 */
711 bool restoreGLRowLength = false; 758 bool restoreGLRowLength = false;
712 bool swFlipY = false; 759 bool swFlipY = false;
713 bool glFlipY = false; 760 bool glFlipY = false;
714 if (data) { 761 if (dataOrOffset) {
715 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) { 762 if (kBottomLeft_GrSurfaceOrigin == desc.fOrigin) {
716 if (this->glCaps().unpackFlipYSupport()) { 763 if (this->glCaps().unpackFlipYSupport()) {
717 glFlipY = true; 764 glFlipY = true;
718 } else { 765 } else {
719 swFlipY = true; 766 swFlipY = true;
720 } 767 }
721 } 768 }
722 if (this->glCaps().unpackRowLengthSupport() && !swFlipY) { 769 if (this->glCaps().unpackRowLengthSupport() && !swFlipY) {
723 // can't use this for flipping, only non-neg values allowed. :( 770 // can't use this for flipping, only non-neg values allowed. :(
724 if (rowBytes != trimRowBytes) { 771 if (rowBytes != trimRowBytes) {
725 GrGLint rowLength = static_cast<GrGLint>(rowBytes / bpp); 772 GrGLint rowLength = static_cast<GrGLint>(rowBytes / bpp);
726 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, rowLength)); 773 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, rowLength));
727 restoreGLRowLength = true; 774 restoreGLRowLength = true;
728 } 775 }
729 } else { 776 } else if (kTransfer_UploadType != uploadType) {
730 if (trimRowBytes != rowBytes || swFlipY) { 777 if (trimRowBytes != rowBytes || swFlipY) {
731 // copy data into our new storage, skipping the trailing bytes 778 // copy data into our new storage, skipping the trailing bytes
732 size_t trimSize = height * trimRowBytes; 779 size_t trimSize = height * trimRowBytes;
733 const char* src = (const char*)data; 780 const char* src = (const char*)dataOrOffset;
734 if (swFlipY) { 781 if (swFlipY) {
735 src += (height - 1) * rowBytes; 782 src += (height - 1) * rowBytes;
736 } 783 }
737 char* dst = (char*)tempStorage.reset(trimSize); 784 char* dst = (char*)tempStorage.reset(trimSize);
738 for (int y = 0; y < height; y++) { 785 for (int y = 0; y < height; y++) {
739 memcpy(dst, src, trimRowBytes); 786 memcpy(dst, src, trimRowBytes);
740 if (swFlipY) { 787 if (swFlipY) {
741 src -= rowBytes; 788 src -= rowBytes;
742 } else { 789 } else {
743 src += rowBytes; 790 src += rowBytes;
744 } 791 }
745 dst += trimRowBytes; 792 dst += trimRowBytes;
746 } 793 }
747 // now point data to our copied version 794 // now point data to our copied version
748 data = tempStorage.get(); 795 dataOrOffset = tempStorage.get();
749 } 796 }
797 } else {
798 return false;
750 } 799 }
751 if (glFlipY) { 800 if (glFlipY) {
752 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE)); 801 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_TRUE));
753 } 802 }
754 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) )); 803 GL_CALL(PixelStorei(GR_GL_UNPACK_ALIGNMENT, config_alignment(dataConfig) ));
755 } 804 }
756 bool succeeded = true; 805 bool succeeded = true;
757 if (isNewTexture) { 806 if (kNewTexture_UploadType == uploadType) {
758 if (data && !(0 == left && 0 == top && desc.fWidth == width && desc.fHei ght == height)) { 807 if (dataOrOffset &&
808 !(0 == left && 0 == top && desc.fWidth == width && desc.fHeight == h eight)) {
759 succeeded = false; 809 succeeded = false;
760 } else { 810 } else {
761 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); 811 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
762 GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFor mat, desc.fWidth, 812 GL_ALLOC_CALL(this->glInterface(), TexImage2D(target, 0, internalFor mat, desc.fWidth,
763 desc.fHeight, 0, exte rnalFormat, 813 desc.fHeight, 0, exte rnalFormat,
764 externalType, data)); 814 externalType, dataOrOf fset));
765 GrGLenum error = check_alloc_error(desc, this->glInterface()); 815 GrGLenum error = check_alloc_error(desc, this->glInterface());
766 if (error != GR_GL_NO_ERROR) { 816 if (error != GR_GL_NO_ERROR) {
767 succeeded = false; 817 succeeded = false;
768 } 818 }
769 } 819 }
770 } else { 820 } else {
771 if (swFlipY || glFlipY) { 821 if (swFlipY || glFlipY) {
772 top = desc.fHeight - (top + height); 822 top = desc.fHeight - (top + height);
773 } 823 }
774 GL_CALL(TexSubImage2D(target, 824 GL_CALL(TexSubImage2D(target,
775 0, // level 825 0, // level
776 left, top, 826 left, top,
777 width, height, 827 width, height,
778 externalFormat, externalType, data)); 828 externalFormat, externalType, dataOrOffset));
779 } 829 }
780 830
781 if (restoreGLRowLength) { 831 if (restoreGLRowLength) {
782 SkASSERT(this->glCaps().unpackRowLengthSupport()); 832 SkASSERT(this->glCaps().unpackRowLengthSupport());
783 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0)); 833 GL_CALL(PixelStorei(GR_GL_UNPACK_ROW_LENGTH, 0));
784 } 834 }
785 if (glFlipY) { 835 if (glFlipY) {
786 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE)); 836 GL_CALL(PixelStorei(GR_GL_UNPACK_FLIP_Y, GR_GL_FALSE));
787 } 837 }
788 return succeeded; 838 return succeeded;
789 } 839 }
790 840
791 // TODO: This function is using a lot of wonky semantics like, if width == -1 841 // TODO: This function is using a lot of wonky semantics like, if width == -1
792 // then set width = desc.fWdith ... blah. A better way to do it might be to 842 // then set width = desc.fWdith ... blah. A better way to do it might be to
793 // create a CompressedTexData struct that takes a desc/ptr and figures out 843 // create a CompressedTexData struct that takes a desc/ptr and figures out
794 // the proper upload semantics. Then users can construct this function how they 844 // the proper upload semantics. Then users can construct this function how they
795 // see fit if they want to go against the "standard" way to do it. 845 // see fit if they want to go against the "standard" way to do it.
796 bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc, 846 bool GrGLGpu::uploadCompressedTexData(const GrSurfaceDesc& desc,
797 GrGLenum target, 847 GrGLenum target,
798 const void* data, 848 const void* data,
799 bool isNewTexture, 849 UploadType uploadType,
800 int left, int top, int width, int height) { 850 int left, int top, int width, int height) {
801 SkASSERT(this->caps()->isConfigTexturable(desc.fConfig)); 851 SkASSERT(this->caps()->isConfigTexturable(desc.fConfig));
802 SkASSERT(data || isNewTexture); 852 SkASSERT(kTransfer_UploadType != uploadType &&
853 (data || kNewTexture_UploadType != uploadType));
803 854
804 // No support for software flip y, yet... 855 // No support for software flip y, yet...
805 SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin); 856 SkASSERT(kBottomLeft_GrSurfaceOrigin != desc.fOrigin);
806 857
807 if (-1 == width) { 858 if (-1 == width) {
808 width = desc.fWidth; 859 width = desc.fWidth;
809 } 860 }
810 #ifdef SK_DEBUG 861 #ifdef SK_DEBUG
811 else { 862 else {
812 SkASSERT(width <= desc.fWidth); 863 SkASSERT(width <= desc.fWidth);
(...skipping 10 matching lines...) Expand all
823 #endif 874 #endif
824 875
825 // Make sure that the width and height that we pass to OpenGL 876 // Make sure that the width and height that we pass to OpenGL
826 // is a multiple of the block size. 877 // is a multiple of the block size.
827 size_t dataSize = GrCompressedFormatDataSize(desc.fConfig, width, height); 878 size_t dataSize = GrCompressedFormatDataSize(desc.fConfig, width, height);
828 879
829 // We only need the internal format for compressed 2D textures. There is on 880 // We only need the internal format for compressed 2D textures. There is on
830 // sized vs base internal format distinction for compressed textures. 881 // sized vs base internal format distinction for compressed textures.
831 GrGLenum internalFormat =this->glCaps().configGLFormats(desc.fConfig).fSized InternalFormat; 882 GrGLenum internalFormat =this->glCaps().configGLFormats(desc.fConfig).fSized InternalFormat;
832 883
833 if (isNewTexture) { 884 if (kNewTexture_UploadType == uploadType) {
834 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); 885 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
835 GL_ALLOC_CALL(this->glInterface(), 886 GL_ALLOC_CALL(this->glInterface(),
836 CompressedTexImage2D(target, 887 CompressedTexImage2D(target,
837 0, // level 888 0, // level
838 internalFormat, 889 internalFormat,
839 width, height, 890 width, height,
840 0, // border 891 0, // border
841 SkToInt(dataSize), 892 SkToInt(dataSize),
842 data)); 893 data));
843 GrGLenum error = check_alloc_error(desc, this->glInterface()); 894 GrGLenum error = check_alloc_error(desc, this->glInterface());
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 initialTexParams.fMagFilter)); 1120 initialTexParams.fMagFilter));
1070 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1121 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1071 GR_GL_TEXTURE_MIN_FILTER, 1122 GR_GL_TEXTURE_MIN_FILTER,
1072 initialTexParams.fMinFilter)); 1123 initialTexParams.fMinFilter));
1073 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1124 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1074 GR_GL_TEXTURE_WRAP_S, 1125 GR_GL_TEXTURE_WRAP_S,
1075 initialTexParams.fWrapS)); 1126 initialTexParams.fWrapS));
1076 GL_CALL(TexParameteri(idDesc.fInfo.fTarget, 1127 GL_CALL(TexParameteri(idDesc.fInfo.fTarget,
1077 GR_GL_TEXTURE_WRAP_T, 1128 GR_GL_TEXTURE_WRAP_T,
1078 initialTexParams.fWrapT)); 1129 initialTexParams.fWrapT));
1079 if (!this->uploadTexData(desc, idDesc.fInfo.fTarget, true, 0, 0, 1130 if (!this->uploadTexData(desc, idDesc.fInfo.fTarget, kNewTexture_UploadType, 0, 0,
1080 desc.fWidth, desc.fHeight, 1131 desc.fWidth, desc.fHeight,
1081 desc.fConfig, srcData, rowBytes)) { 1132 desc.fConfig, srcData, rowBytes)) {
1082 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID)); 1133 GL_CALL(DeleteTextures(1, &idDesc.fInfo.fID));
1083 return return_null_texture(); 1134 return return_null_texture();
1084 } 1135 }
1085 1136
1086 GrGLTexture* tex; 1137 GrGLTexture* tex;
1087 if (renderTarget) { 1138 if (renderTarget) {
1088 // unbind the texture from the texture unit before binding it to the fra me buffer 1139 // unbind the texture from the texture unit before binding it to the fra me buffer
1089 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0)); 1140 GL_CALL(BindTexture(idDesc.fInfo.fTarget, 0));
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 GrGLTransferBuffer::Desc desc; 1482 GrGLTransferBuffer::Desc desc;
1432 bool toGpu = (kCpuToGpu_TransferType == xferType); 1483 bool toGpu = (kCpuToGpu_TransferType == xferType);
1433 desc.fUsage = toGpu ? GrGLBufferImpl::kStreamDraw_Usage : GrGLBufferImpl::kS treamRead_Usage; 1484 desc.fUsage = toGpu ? GrGLBufferImpl::kStreamDraw_Usage : GrGLBufferImpl::kS treamRead_Usage;
1434 1485
1435 desc.fSizeInBytes = size; 1486 desc.fSizeInBytes = size;
1436 desc.fID = 0; 1487 desc.fID = 0;
1437 GL_CALL(GenBuffers(1, &desc.fID)); 1488 GL_CALL(GenBuffers(1, &desc.fID));
1438 if (desc.fID) { 1489 if (desc.fID) {
1439 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface()); 1490 CLEAR_ERROR_BEFORE_ALLOC(this->glInterface());
1440 // make sure driver can allocate memory for this bmapuffer 1491 // make sure driver can allocate memory for this bmapuffer
1441 GrGLenum type; 1492 GrGLenum target;
1442 if (GrGLCaps::kChromium_TransferBufferType == xferBufferType) { 1493 if (GrGLCaps::kChromium_TransferBufferType == xferBufferType) {
1443 type = toGpu ? GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM 1494 target = toGpu ? GR_GL_PIXEL_UNPACK_TRANSFER_BUFFER_CHROMIUM
1444 : GR_GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM; 1495 : GR_GL_PIXEL_PACK_TRANSFER_BUFFER_CHROMIUM;
1445 } else { 1496 } else {
1446 SkASSERT(GrGLCaps::kPBO_TransferBufferType == xferBufferType); 1497 SkASSERT(GrGLCaps::kPBO_TransferBufferType == xferBufferType);
1447 type = toGpu ? GR_GL_PIXEL_UNPACK_BUFFER : GR_GL_PIXEL_PACK_BUFFER; 1498 target = toGpu ? GR_GL_PIXEL_UNPACK_BUFFER : GR_GL_PIXEL_PACK_BUFFER ;
1448 } 1499 }
1449 GL_ALLOC_CALL(this->glInterface(), 1500 GL_CALL(BindBuffer(target, desc.fID));
1450 BufferData(type, 1501 GL_ALLOC_CALL(this->glInterface(),
1502 BufferData(target,
1451 (GrGLsizeiptr) desc.fSizeInBytes, 1503 (GrGLsizeiptr) desc.fSizeInBytes,
1452 nullptr, // data ptr 1504 nullptr, // data ptr
1453 (toGpu ? GR_GL_STREAM_DRAW : GR_GL_STREAM_READ) )); 1505 (toGpu ? GR_GL_STREAM_DRAW : GR_GL_STREAM_READ) ));
1454 if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) { 1506 if (CHECK_ALLOC_ERROR(this->glInterface()) != GR_GL_NO_ERROR) {
1455 GL_CALL(DeleteBuffers(1, &desc.fID)); 1507 GL_CALL(DeleteBuffers(1, &desc.fID));
1456 return nullptr; 1508 return nullptr;
1457 } 1509 }
1458 GrTransferBuffer* transferBuffer = new GrGLTransferBuffer(this, desc, ty pe); 1510 GrTransferBuffer* transferBuffer = new GrGLTransferBuffer(this, desc, ta rget);
1459 return transferBuffer; 1511 return transferBuffer;
1460 } 1512 }
1461 1513
1462 return nullptr; 1514 return nullptr;
1463 } 1515 }
1464 1516
1465 void GrGLGpu::flushScissor(const GrScissorState& scissorState, 1517 void GrGLGpu::flushScissor(const GrScissorState& scissorState,
1466 const GrGLIRect& rtViewport, 1518 const GrGLIRect& rtViewport,
1467 GrSurfaceOrigin rtOrigin) { 1519 GrSurfaceOrigin rtOrigin) {
1468 if (scissorState.enabled()) { 1520 if (scissorState.enabled()) {
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
1648 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage)); 1700 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
1649 } 1701 }
1650 GL_CALL_RET(mapPtr, MapBuffer(type, readOnly ? GR_GL_READ_ONLY : GR_ GL_WRITE_ONLY)); 1702 GL_CALL_RET(mapPtr, MapBuffer(type, readOnly ? GR_GL_READ_ONLY : GR_ GL_WRITE_ONLY));
1651 break; 1703 break;
1652 case GrGLCaps::kMapBufferRange_MapBufferType: { 1704 case GrGLCaps::kMapBufferRange_MapBufferType: {
1653 this->bindBuffer(id, type); 1705 this->bindBuffer(id, type);
1654 // Make sure the GL buffer size agrees with fDesc before mapping. 1706 // Make sure the GL buffer size agrees with fDesc before mapping.
1655 if (currentSize != requestedSize) { 1707 if (currentSize != requestedSize) {
1656 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage)); 1708 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
1657 } 1709 }
1658 static const GrGLbitfield kWriteAccess = GR_GL_MAP_INVALIDATE_BUFFER _BIT | 1710 GrGLbitfield writeAccess = GR_GL_MAP_WRITE_BIT;
1659 GR_GL_MAP_WRITE_BIT; 1711 // TODO: allow the client to specify invalidation in the stream draw case
1712 if (GrGLBufferImpl::kStreamDraw_Usage != usage) {
1713 writeAccess |= GR_GL_MAP_INVALIDATE_BUFFER_BIT;
1714 }
1660 GL_CALL_RET(mapPtr, MapBufferRange(type, 0, requestedSize, readOnly ? 1715 GL_CALL_RET(mapPtr, MapBufferRange(type, 0, requestedSize, readOnly ?
1661 GR_GL_MAP _READ_BIT : 1716 GR_GL_MAP _READ_BIT :
1662 kWriteAcc ess)); 1717 writeAcce ss));
1663 break; 1718 break;
1664 } 1719 }
1665 case GrGLCaps::kChromium_MapBufferType: 1720 case GrGLCaps::kChromium_MapBufferType:
1666 this->bindBuffer(id, type); 1721 this->bindBuffer(id, type);
1667 // Make sure the GL buffer size agrees with fDesc before mapping. 1722 // Make sure the GL buffer size agrees with fDesc before mapping.
1668 if (currentSize != requestedSize) { 1723 if (currentSize != requestedSize) {
1669 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage)); 1724 GL_CALL(BufferData(type, requestedSize, nullptr, glUsage));
1670 } 1725 }
1671 GL_CALL_RET(mapPtr, MapBufferSubData(type, 0, requestedSize, readOnl y ? 1726 GL_CALL_RET(mapPtr, MapBufferSubData(type, 0, requestedSize, readOnl y ?
1672 GR_GL_R EAD_ONLY : 1727 GR_GL_R EAD_ONLY :
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after
3372 this->setVertexArrayID(gpu, 0); 3427 this->setVertexArrayID(gpu, 0);
3373 } 3428 }
3374 int attrCount = gpu->glCaps().maxVertexAttributes(); 3429 int attrCount = gpu->glCaps().maxVertexAttributes();
3375 if (fDefaultVertexArrayAttribState.count() != attrCount) { 3430 if (fDefaultVertexArrayAttribState.count() != attrCount) {
3376 fDefaultVertexArrayAttribState.resize(attrCount); 3431 fDefaultVertexArrayAttribState.resize(attrCount);
3377 } 3432 }
3378 attribState = &fDefaultVertexArrayAttribState; 3433 attribState = &fDefaultVertexArrayAttribState;
3379 } 3434 }
3380 return attribState; 3435 return attribState;
3381 } 3436 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698