[Vm-dev] VM Maker: VMMaker.oscog-eem.2204.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Apr 27 17:40:01 UTC 2017


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2204.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.2204
Author: eem
Time: 27 April 2017, 10:39:12.134178 am
UUID: e5085341-39c0-4efb-bcbd-3559c73ad82d
Ancestors: VMMaker.oscog-eem.2203

Include a primitive from the Terf version of the CroquetPlugin (thanks Josh).

=============== Diff against VMMaker.oscog-eem.2203 ===============

Item was added:
+ ----- Method: CroquetPlugin>>primitiveOptimizeVertexIndicesForCacheLocality (in category 'mesh processing') -----
+ primitiveOptimizeVertexIndicesForCacheLocality
+ 	"Given a list of integer indices for rendering a triangle-mesh in indexed-triangles mode, reorganize the indices in-place to provide better vertex cache locality.
+ 	We use Tom Forsyth's algorithm:
+ 		http://home.comcast.net/~tom_forsyth/papers/fast_vert_cache_opt.html
+ 	... and the MIT-licensed implementation by Michael Georgoulpoulos at:
+ 		http://code.google.com/p/vcacne/"
+ 	| indicesOop indices byteSize triCount result |
+ 	<export: true>
+ 	<inline: true>
+ 	<var: #indices type: 'void *'>
+ 
+ 	"Get the oop of the IntegerArray containing the indices."
+ 	(interpreterProxy methodArgumentCount = 1) ifFalse: [^interpreterProxy primitiveFail].
+ 	indicesOop := interpreterProxy stackObjectValue: 0.
+ 	interpreterProxy failed ifTrue: [^nil].
+ 	(interpreterProxy isWords: indicesOop) ifFalse: [^interpreterProxy primitiveFail].
+ 	
+ 	"Ensure that the number of indices is a multiple of 3."
+ 	byteSize := interpreterProxy byteSizeOf: indicesOop.
+ 	triCount := byteSize / 12.
+ 	(triCount * 12) = byteSize ifFalse: [^interpreterProxy primitiveFail].
+ 	
+ 	"Get an int* to the indices, and optimize 'em."
+ 	indices := interpreterProxy firstIndexableField: indicesOop.
+ 	self touch: indices.
+ 	interpreterProxy failed ifTrue: [^nil].
+ 	result := self cCode: 'optimizeVertexIndices((int*)indices, triCount)'.
+ 	result = 0 "success" ifFalse: [^interpreterProxy primitiveFail].
+ 	^interpreterProxy pop: 1!



More information about the Vm-dev mailing list