[Vm-dev] VM Maker: VMMaker.oscog-tpr.3018.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Aug 3 02:13:11 UTC 2021


tim Rowledge uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-tpr.3018.mcz

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

Name: VMMaker.oscog-tpr.3018
Author: tpr
Time: 2 August 2021, 7:11:46.43285 pm
UUID: c57c2e71-7aca-4fc8-a32a-887b9393dd3a
Ancestors: VMMaker.oscog-eem.3017

Merge Ben Avison's minor changes that help support the improvements he made for the ARM64 bitblt

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

Item was changed:
  ----- Method: BitBltSimulation>>copyBits:Fallback: (in category 'setup') -----
  copyBits: op Fallback: flags
  	"Recover from the fast path specialised code saying Help-I-cant-cope"
  	|done |
  	<static: false>
  	<returnTypeC: 'void'>
  	<inline: false>
  	<var: #op type: 'operation_t *'>
  	<var: #flags type:'unsigned int'>
  	self cppIf: #'ENABLE_FAST_BLT'
  		ifTrue:[
  			"recover values from the operation struct used by the fast ARM code"
  			self cCode:'
  	combinationRule = op->combinationRule;
  	noSource = op->noSource;
  	sourceBits = (sqInt) op->src.bits;
  	sourcePitch = op->src.pitch;
  	sourceDepth = op->src.depth;
  	sourceMSB = op->src.msb;
  	sx = op->src.x;
  	sy = op->src.y;
  	destBits = (sqInt) op->dest.bits;
  	destPitch = op->dest.pitch;
  	destDepth = op->dest.depth;
  	destMSB = op->dest.msb;
  	dx = op->dest.x;
  	dy = op->dest.y;
  	bbW = op->width;
  	bbH = op->height;
  	cmFlags = op->cmFlags;
  	cmShiftTable = (void *) op->cmShiftTable;
  	cmMaskTable = (void *) op->cmMaskTable;
  	cmMask = op->cmMask;
  	cmLookupTable = (void *) op->cmLookupTable;
  	noHalftone = op->noHalftone;
  	halftoneHeight = op->halftoneHeight;
  	halftoneBase = (sqInt) op->halftoneBase;
  	if (combinationRule == 30 || combinationRule == 31) {
  		sourceAlpha = op->opt.sourceAlpha;
  	}
  	if (combinationRule == 41) {
  		componentAlphaModeColor = op->opt.componentAlpha.componentAlphaModeColor;
  		componentAlphaModeAlpha = op->opt.componentAlpha.componentAlphaModeAlpha;
  		gammaLookupTable = (void *) op->opt.componentAlpha.gammaLookupTable;
  		ungammaLookupTable = (void *) op->opt.componentAlpha.ungammaLookupTable;
  	}'.
  	
  				destPPW := 32 / destDepth.
+ 				sourcePPW := 32 / sourceDepth.
  				cmBitsPerColor := 0.
  				cmMask = 16r1FF ifTrue: [cmBitsPerColor := 3].
  				cmMask = 16rFFF ifTrue: [cmBitsPerColor := 4].
  				cmMask = 16r7FFF ifTrue: [cmBitsPerColor := 5].
+ 				" In some places, sourceForm and destForm are compared in order to detect
+ 				 whether we're reading and writing the same image. However, these have
+ 				 not always been initialised by the time we get here, so substitute
+ 				 sourceBits and destBits if so. "
+ 				(sourceForm == 0 and: [destForm == 0])
+ 					ifTrue:
+ 						[sourceForm := sourceBits.
+ 						destForm := destBits].
  	
  				"Try a shortcut for stuff that should be run as quickly as possible"
  				done := self tryCopyingBitsQuickly.
  				done ifTrue:[^nil].
  
  				bitCount := 0.
  				"Choose and perform the actual copy loop."
  				self performCopyLoop]
  
  	
  
  
  !

Item was changed:
  ----- Method: BitBltSimulation>>rgbComponentAlpha:with: (in category 'combination rules') -----
  rgbComponentAlpha: sourceWord with: destinationWord
  	"
  	componentAlphaModeColor is the color,
  	sourceWord contains an alpha value for each component of RGB
  	each of which is encoded as0 meaning 0.0 and 255 meaning 1.0 .
  	the rule is...
  	
  	color = componentAlphaModeColor.
  	colorAlpha = componentAlphaModeAlpha.
  	mask = sourceWord.
  	dst.A =  colorAlpha + (1 - colorAlpha) * dst.A
        dst.R = color.R * mask.R * colorAlpha + (1 - (mask.R * colorAlpha)) * dst.R
        dst.G = color.G * mask.G * colorAlpha + (1 - (mask.G* colorAlpha)) * dst.G
        dst.B = color.B * mask.B * colorAlpha + (1 - (mask.B* colorAlpha)) * dst.B
  	"
  	<inline: false> "Do NOT inline this into optimized loops"
  	| alpha |
  		
  	alpha := sourceWord.
+ 		"This is not a valid optimisation because alpha == 0 can change the destination
+ 		 due to rounding errors in blending and/or in gamma lookup round-trip
+ 		alpha = 0 ifTrue:[^destinationWord]."
- 	alpha = 0 ifTrue:[^destinationWord].
  	^self partitionedRgbComponentAlpha: sourceWord dest: destinationWord nBits: destDepth nPartitions: destPPW.!



More information about the Vm-dev mailing list