| OLD | NEW |
| 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 #include "GrInOrderDrawBuffer.h" | 8 #include "GrInOrderDrawBuffer.h" |
| 9 | 9 |
| 10 #include "GrBufferAllocPool.h" | 10 #include "GrBufferAllocPool.h" |
| (...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 &poolState.fPoolStartIndex); | 698 &poolState.fPoolStartIndex); |
| 699 return SkToBool(*indices); | 699 return SkToBool(*indices); |
| 700 } | 700 } |
| 701 | 701 |
| 702 void GrInOrderDrawBuffer::releaseReservedVertexSpace() { | 702 void GrInOrderDrawBuffer::releaseReservedVertexSpace() { |
| 703 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 703 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 704 const GeometrySrcState& geoSrc = this->getGeomSrc(); | 704 const GeometrySrcState& geoSrc = this->getGeomSrc(); |
| 705 | 705 |
| 706 // If we get a release vertex space call then our current source should eith
er be reserved | 706 // If we get a release vertex space call then our current source should eith
er be reserved |
| 707 // or array (which we copied into reserved space). | 707 // or array (which we copied into reserved space). |
| 708 SkASSERT(kReserved_GeometrySrcType == geoSrc.fVertexSrc || | 708 SkASSERT(kReserved_GeometrySrcType == geoSrc.fVertexSrc); |
| 709 kArray_GeometrySrcType == geoSrc.fVertexSrc); | |
| 710 | 709 |
| 711 // When the caller reserved vertex buffer space we gave it back a pointer | 710 // When the caller reserved vertex buffer space we gave it back a pointer |
| 712 // provided by the vertex buffer pool. At each draw we tracked the largest | 711 // provided by the vertex buffer pool. At each draw we tracked the largest |
| 713 // offset into the pool's pointer that was referenced. Now we return to the | 712 // offset into the pool's pointer that was referenced. Now we return to the |
| 714 // pool any portion at the tail of the allocation that no draw referenced. | 713 // pool any portion at the tail of the allocation that no draw referenced. |
| 715 size_t reservedVertexBytes = geoSrc.fVertexSize * geoSrc.fVertexCount; | 714 size_t reservedVertexBytes = geoSrc.fVertexSize * geoSrc.fVertexCount; |
| 716 fVertexPool.putBack(reservedVertexBytes - | 715 fVertexPool.putBack(reservedVertexBytes - |
| 717 poolState.fUsedPoolVertexBytes); | 716 poolState.fUsedPoolVertexBytes); |
| 718 poolState.fUsedPoolVertexBytes = 0; | 717 poolState.fUsedPoolVertexBytes = 0; |
| 719 poolState.fPoolVertexBuffer = NULL; | 718 poolState.fPoolVertexBuffer = NULL; |
| 720 poolState.fPoolStartVertex = 0; | 719 poolState.fPoolStartVertex = 0; |
| 721 } | 720 } |
| 722 | 721 |
| 723 void GrInOrderDrawBuffer::releaseReservedIndexSpace() { | 722 void GrInOrderDrawBuffer::releaseReservedIndexSpace() { |
| 724 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 723 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 725 const GeometrySrcState& geoSrc = this->getGeomSrc(); | 724 const GeometrySrcState& geoSrc = this->getGeomSrc(); |
| 726 | 725 |
| 727 // If we get a release index space call then our current source should eithe
r be reserved | 726 // If we get a release index space call then our current source should eithe
r be reserved |
| 728 // or array (which we copied into reserved space). | 727 // or array (which we copied into reserved space). |
| 729 SkASSERT(kReserved_GeometrySrcType == geoSrc.fIndexSrc || | 728 SkASSERT(kReserved_GeometrySrcType == geoSrc.fIndexSrc); |
| 730 kArray_GeometrySrcType == geoSrc.fIndexSrc); | |
| 731 | 729 |
| 732 // Similar to releaseReservedVertexSpace we return any unused portion at | 730 // Similar to releaseReservedVertexSpace we return any unused portion at |
| 733 // the tail | 731 // the tail |
| 734 size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount; | 732 size_t reservedIndexBytes = sizeof(uint16_t) * geoSrc.fIndexCount; |
| 735 fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes); | 733 fIndexPool.putBack(reservedIndexBytes - poolState.fUsedPoolIndexBytes); |
| 736 poolState.fUsedPoolIndexBytes = 0; | 734 poolState.fUsedPoolIndexBytes = 0; |
| 737 poolState.fPoolIndexBuffer = NULL; | 735 poolState.fPoolIndexBuffer = NULL; |
| 738 poolState.fPoolStartIndex = 0; | 736 poolState.fPoolStartIndex = 0; |
| 739 } | 737 } |
| 740 | 738 |
| 741 void GrInOrderDrawBuffer::onSetVertexSourceToArray(const void* vertexArray, int
vertexCount) { | |
| 742 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | |
| 743 SkASSERT(0 == poolState.fUsedPoolVertexBytes); | |
| 744 #ifdef SK_DEBUG | |
| 745 bool success = | |
| 746 #endif | |
| 747 fVertexPool.appendVertices(this->getVertexSize(), | |
| 748 vertexCount, | |
| 749 vertexArray, | |
| 750 &poolState.fPoolVertexBuffer, | |
| 751 &poolState.fPoolStartVertex); | |
| 752 GR_DEBUGASSERT(success); | |
| 753 } | |
| 754 | |
| 755 void GrInOrderDrawBuffer::onSetIndexSourceToArray(const void* indexArray, | |
| 756 int indexCount) { | |
| 757 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | |
| 758 SkASSERT(0 == poolState.fUsedPoolIndexBytes); | |
| 759 #ifdef SK_DEBUG | |
| 760 bool success = | |
| 761 #endif | |
| 762 fIndexPool.appendIndices(indexCount, | |
| 763 indexArray, | |
| 764 &poolState.fPoolIndexBuffer, | |
| 765 &poolState.fPoolStartIndex); | |
| 766 GR_DEBUGASSERT(success); | |
| 767 } | |
| 768 | |
| 769 void GrInOrderDrawBuffer::releaseVertexArray() { | |
| 770 // When the client provides an array as the vertex source we handled it | |
| 771 // by copying their array into reserved space. | |
| 772 this->GrInOrderDrawBuffer::releaseReservedVertexSpace(); | |
| 773 } | |
| 774 | |
| 775 void GrInOrderDrawBuffer::releaseIndexArray() { | |
| 776 // When the client provides an array as the index source we handled it | |
| 777 // by copying their array into reserved space. | |
| 778 this->GrInOrderDrawBuffer::releaseReservedIndexSpace(); | |
| 779 } | |
| 780 | |
| 781 void GrInOrderDrawBuffer::geometrySourceWillPush() { | 739 void GrInOrderDrawBuffer::geometrySourceWillPush() { |
| 782 GeometryPoolState& poolState = fGeoPoolStateStack.push_back(); | 740 GeometryPoolState& poolState = fGeoPoolStateStack.push_back(); |
| 783 poolState.fUsedPoolVertexBytes = 0; | 741 poolState.fUsedPoolVertexBytes = 0; |
| 784 poolState.fUsedPoolIndexBytes = 0; | 742 poolState.fUsedPoolIndexBytes = 0; |
| 785 #ifdef SK_DEBUG | 743 #ifdef SK_DEBUG |
| 786 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; | 744 poolState.fPoolVertexBuffer = (GrVertexBuffer*)~0; |
| 787 poolState.fPoolStartVertex = ~0; | 745 poolState.fPoolStartVertex = ~0; |
| 788 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; | 746 poolState.fPoolIndexBuffer = (GrIndexBuffer*)~0; |
| 789 poolState.fPoolStartIndex = ~0; | 747 poolState.fPoolStartIndex = ~0; |
| 790 #endif | 748 #endif |
| 791 } | 749 } |
| 792 | 750 |
| 793 void GrInOrderDrawBuffer::geometrySourceWillPop(const GeometrySrcState& restored
State) { | 751 void GrInOrderDrawBuffer::geometrySourceWillPop(const GeometrySrcState& restored
State) { |
| 794 SkASSERT(fGeoPoolStateStack.count() > 1); | 752 SkASSERT(fGeoPoolStateStack.count() > 1); |
| 795 fGeoPoolStateStack.pop_back(); | 753 fGeoPoolStateStack.pop_back(); |
| 796 GeometryPoolState& poolState = fGeoPoolStateStack.back(); | 754 GeometryPoolState& poolState = fGeoPoolStateStack.back(); |
| 797 // we have to assume that any slack we had in our vertex/index data | 755 // we have to assume that any slack we had in our vertex/index data |
| 798 // is now unreleasable because data may have been appended later in the | 756 // is now unreleasable because data may have been appended later in the |
| 799 // pool. | 757 // pool. |
| 800 if (kReserved_GeometrySrcType == restoredState.fVertexSrc || | 758 if (kReserved_GeometrySrcType == restoredState.fVertexSrc) { |
| 801 kArray_GeometrySrcType == restoredState.fVertexSrc) { | |
| 802 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; | 759 poolState.fUsedPoolVertexBytes = restoredState.fVertexSize * restoredSta
te.fVertexCount; |
| 803 } | 760 } |
| 804 if (kReserved_GeometrySrcType == restoredState.fIndexSrc || | 761 if (kReserved_GeometrySrcType == restoredState.fIndexSrc) { |
| 805 kArray_GeometrySrcType == restoredState.fIndexSrc) { | |
| 806 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * | 762 poolState.fUsedPoolIndexBytes = sizeof(uint16_t) * |
| 807 restoredState.fIndexCount; | 763 restoredState.fIndexCount; |
| 808 } | 764 } |
| 809 } | 765 } |
| 810 | 766 |
| 811 void GrInOrderDrawBuffer::recordStateIfNecessary() { | 767 void GrInOrderDrawBuffer::recordStateIfNecessary() { |
| 812 if (!fLastState) { | 768 if (!fLastState) { |
| 813 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (this->get
DrawState())); | 769 SetState* ss = GrNEW_APPEND_TO_RECORDER(fCmdBuffer, SetState, (this->get
DrawState())); |
| 814 fLastState = &ss->fState; | 770 fLastState = &ss->fState; |
| 815 this->convertDrawStateToPendingExec(fLastState); | 771 this->convertDrawStateToPendingExec(fLastState); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 856 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); | 812 fCmdBuffer.back().fType = add_trace_bit(fCmdBuffer.back().fType); |
| 857 fGpuCmdMarkers.push_back(activeTraceMarkers); | 813 fGpuCmdMarkers.push_back(activeTraceMarkers); |
| 858 } | 814 } |
| 859 } | 815 } |
| 860 | 816 |
| 861 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { | 817 void GrInOrderDrawBuffer::clipWillBeSet(const GrClipData* newClipData) { |
| 862 INHERITED::clipWillBeSet(newClipData); | 818 INHERITED::clipWillBeSet(newClipData); |
| 863 fClipSet = true; | 819 fClipSet = true; |
| 864 fClipProxyState = kUnknown_ClipProxyState; | 820 fClipProxyState = kUnknown_ClipProxyState; |
| 865 } | 821 } |
| OLD | NEW |