diff --git a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m index cad165b4b..973f17f37 100755 --- a/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m +++ b/examples/SimpleVideoFilter/SimpleVideoFilter/SimpleVideoFilterViewController.m @@ -21,11 +21,13 @@ - (void)viewDidLoad { [super viewDidLoad]; - videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; - videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; +// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionFront]; -// videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; + videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1280x720 cameraPosition:AVCaptureDevicePositionBack]; // videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset1920x1080 cameraPosition:AVCaptureDevicePositionBack]; + + videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait; + filter = [[GPUImageSepiaFilter alloc] init]; // filter = [[GPUImageTiltShiftFilter alloc] init]; @@ -72,7 +74,7 @@ - (void)viewDidLoad // [videoCamera.inputCamera setTorchMode:AVCaptureTorchModeOn]; // [videoCamera.inputCamera unlockForConfiguration]; - double delayInSeconds = 10.0; + double delayInSeconds = 60.0; dispatch_time_t stopTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(stopTime, dispatch_get_main_queue(), ^(void){ @@ -123,6 +125,7 @@ - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceO break; } videoCamera.outputImageOrientation = orient; + } - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation diff --git a/framework/Source/GPUImage3x3ConvolutionFilter.m b/framework/Source/GPUImage3x3ConvolutionFilter.m index a212de217..94135170f 100755 --- a/framework/Source/GPUImage3x3ConvolutionFilter.m +++ b/framework/Source/GPUImage3x3ConvolutionFilter.m @@ -71,10 +71,8 @@ - (id)init; - (void)setConvolutionKernel:(GPUMatrix3x3)newValue; { _convolutionKernel = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniformMatrix3fv(convolutionMatrixUniform, 1, GL_FALSE, (GLfloat *)&_convolutionKernel); + [self setMatrix3f:(GLfloat *)&_convolutionKernel forUniform:convolutionMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImage3x3TextureSamplingFilter.m b/framework/Source/GPUImage3x3TextureSamplingFilter.m index 29177139c..0cda9388f 100644 --- a/framework/Source/GPUImage3x3TextureSamplingFilter.m +++ b/framework/Source/GPUImage3x3TextureSamplingFilter.m @@ -73,8 +73,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Enclose this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { glUniform1f(texelWidthUniform, _texelHeight); @@ -97,20 +97,15 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:filterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); -} + [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; +} @end diff --git a/framework/Source/GPUImageAlphaBlendFilter.m b/framework/Source/GPUImageAlphaBlendFilter.m index 270bd5721..5aba674a8 100755 --- a/framework/Source/GPUImageAlphaBlendFilter.m +++ b/framework/Source/GPUImageAlphaBlendFilter.m @@ -45,9 +45,7 @@ - (void)setMix:(CGFloat)newValue; { _mix = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(mixUniform, _mix); + [self setFloat:_mix forUniform:mixUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageBoxBlurFilter.m b/framework/Source/GPUImageBoxBlurFilter.m index dc8b7a1ab..6623f1916 100755 --- a/framework/Source/GPUImageBoxBlurFilter.m +++ b/framework/Source/GPUImageBoxBlurFilter.m @@ -84,12 +84,8 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(firstBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(secondBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageBrightnessFilter.m b/framework/Source/GPUImageBrightnessFilter.m index 21c626bb3..08eff6347 100755 --- a/framework/Source/GPUImageBrightnessFilter.m +++ b/framework/Source/GPUImageBrightnessFilter.m @@ -42,9 +42,7 @@ - (void)setBrightness:(CGFloat)newValue; { _brightness = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(brightnessUniform, _brightness); + [self setFloat:_brightness forUniform:brightnessUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageBuffer.m b/framework/Source/GPUImageBuffer.m index d616e0f0a..8c8447ccb 100644 --- a/framework/Source/GPUImageBuffer.m +++ b/framework/Source/GPUImageBuffer.m @@ -70,14 +70,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; glBindTexture(GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue]); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, [[bufferedTextures lastObject] intValue], 0); - - [filterProgram use]; - + glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageBulgeDistortionFilter.m b/framework/Source/GPUImageBulgeDistortionFilter.m index f6724806a..2bb2da86f 100755 --- a/framework/Source/GPUImageBulgeDistortionFilter.m +++ b/framework/Source/GPUImageBulgeDistortionFilter.m @@ -69,34 +69,23 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setScale:(CGFloat)newValue; { _scale = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageChromaKeyBlendFilter.m b/framework/Source/GPUImageChromaKeyBlendFilter.m index 2447ea69e..b86b278d0 100755 --- a/framework/Source/GPUImageChromaKeyBlendFilter.m +++ b/framework/Source/GPUImageChromaKeyBlendFilter.m @@ -67,28 +67,21 @@ - (void)setColorToReplaceRed:(GLfloat)redComponent green:(GLfloat)greenComponent colorToReplace[1] = greenComponent; colorToReplace[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(colorToReplaceUniform, 1, colorToReplace); + [self setVec3:colorToReplace forUniform:colorToReplaceUniform program:filterProgram]; } - (void)setThresholdSensitivity:(CGFloat)newValue; { _thresholdSensitivity = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdSensitivityUniform, _thresholdSensitivity); -} + [self setFloat:_thresholdSensitivity forUniform:thresholdSensitivityUniform program:filterProgram]; +} - (void)setSmoothing:(CGFloat)newValue; { _smoothing = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(smoothingUniform, _smoothing); + [self setFloat:_smoothing forUniform:smoothingUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageColorMatrixFilter.m b/framework/Source/GPUImageColorMatrixFilter.m index 2998f819e..c0d056212 100755 --- a/framework/Source/GPUImageColorMatrixFilter.m +++ b/framework/Source/GPUImageColorMatrixFilter.m @@ -53,18 +53,15 @@ - (id)init; - (void)setIntensity:(CGFloat)newIntensity; { _intensity = newIntensity; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(intensityUniform, _intensity); + + [self setFloat:_intensity forUniform:intensityUniform program:filterProgram]; } - (void)setColorMatrix:(GPUMatrix4x4)newColorMatrix; { _colorMatrix = newColorMatrix; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniformMatrix4fv(colorMatrixUniform, 1, GL_FALSE, (GLfloat *)&_colorMatrix); + [self setMatrix4f:(GLfloat *)&_colorMatrix forUniform:colorMatrixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageColorPackingFilter.m b/framework/Source/GPUImageColorPackingFilter.m index ca9e4389b..e67264e47 100644 --- a/framework/Source/GPUImageColorPackingFilter.m +++ b/framework/Source/GPUImageColorPackingFilter.m @@ -72,13 +72,11 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { texelWidth = 0.5 / inputTextureSize.width; texelHeight = 0.5 / inputTextureSize.height; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, texelWidth); glUniform1f(texelHeightUniform, texelHeight); - - NSLog(@"Texel width: %f, height: %f", texelWidth, texelHeight); } #pragma mark - diff --git a/framework/Source/GPUImageContrastFilter.m b/framework/Source/GPUImageContrastFilter.m index 355822097..ec58d74eb 100755 --- a/framework/Source/GPUImageContrastFilter.m +++ b/framework/Source/GPUImageContrastFilter.m @@ -42,9 +42,7 @@ - (void)setContrast:(CGFloat)newValue; { _contrast = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(contrastUniform, _contrast); + [self setFloat:_contrast forUniform:contrastUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageCrosshairGenerator.m b/framework/Source/GPUImageCrosshairGenerator.m index eaee1c161..2cf5a08f4 100644 --- a/framework/Source/GPUImageCrosshairGenerator.m +++ b/framework/Source/GPUImageCrosshairGenerator.m @@ -70,12 +70,10 @@ - (void)renderCrosshairsFromArray:(GLfloat *)crosshairCoordinates count:(NSUInte return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(0.0, 0.0, 0.0, 0.0); glClear(GL_COLOR_BUFFER_BIT); @@ -98,9 +96,7 @@ - (void)setCrosshairWidth:(CGFloat)newValue; { _crosshairWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(crosshairWidthUniform, _crosshairWidth); + [self setFloat:_crosshairWidth forUniform:crosshairWidthUniform program:filterProgram]; } - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @@ -110,9 +106,7 @@ - (void)setCrosshairColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent colorToReplace[1] = greenComponent; colorToReplace[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(crosshairColorUniform, 1, colorToReplace); + [self setVec3:colorToReplace forUniform:crosshairColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageCrosshatchFilter.m b/framework/Source/GPUImageCrosshatchFilter.m index 077404240..30fad5200 100755 --- a/framework/Source/GPUImageCrosshatchFilter.m +++ b/framework/Source/GPUImageCrosshatchFilter.m @@ -100,18 +100,14 @@ - (void)setCrossHatchSpacing:(CGFloat)newValue; _crossHatchSpacing = newValue; } - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(crossHatchSpacingUniform, _crossHatchSpacing); + [self setFloat:_crossHatchSpacing forUniform:crossHatchSpacingUniform program:filterProgram]; } - (void)setLineWidth:(CGFloat)newValue; { _lineWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(lineWidthUniform, _lineWidth); + [self setFloat:_lineWidth forUniform:lineWidthUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m index 6328a24fa..698d7b50a 100644 --- a/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m +++ b/framework/Source/GPUImageDirectionalNonMaximumSuppressionFilter.m @@ -66,8 +66,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this appropriately + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); } @@ -81,9 +81,7 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:filterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; @@ -91,27 +89,21 @@ - (void)setTexelHeight:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); + [self setFloat:_texelHeight forUniform:texelHeightUniform program:filterProgram]; } - (void)setLowerThreshold:(CGFloat)newValue; { _lowerThreshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(lowerThresholdUniform, _lowerThreshold); + [self setFloat:_lowerThreshold forUniform:lowerThresholdUniform program:filterProgram]; } - (void)setUpperThreshold:(CGFloat)newValue; { _upperThreshold = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(upperThresholdUniform, _upperThreshold); + + [self setFloat:_upperThreshold forUniform:upperThresholdUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageDissolveBlendFilter.m b/framework/Source/GPUImageDissolveBlendFilter.m index 1e2ee6c45..3af97701a 100755 --- a/framework/Source/GPUImageDissolveBlendFilter.m +++ b/framework/Source/GPUImageDissolveBlendFilter.m @@ -45,9 +45,7 @@ - (void)setMix:(CGFloat)newValue; { _mix = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(mixUniform, _mix); + [self setFloat:_mix forUniform:mixUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageEmbossFilter.m b/framework/Source/GPUImageEmbossFilter.m index 17d1d4fd2..6ba48cd4f 100755 --- a/framework/Source/GPUImageEmbossFilter.m +++ b/framework/Source/GPUImageEmbossFilter.m @@ -29,9 +29,6 @@ - (void)setIntensity:(CGFloat)newValue; _intensity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GPUMatrix3x3 newConvolutionMatrix; newConvolutionMatrix.one.one = _intensity * (-2.0); newConvolutionMatrix.one.two = -_intensity; diff --git a/framework/Source/GPUImageExposureFilter.m b/framework/Source/GPUImageExposureFilter.m index 6825412be..baffa18d2 100755 --- a/framework/Source/GPUImageExposureFilter.m +++ b/framework/Source/GPUImageExposureFilter.m @@ -42,9 +42,7 @@ - (void)setExposure:(CGFloat)newValue; { _exposure = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(exposureUniform, _exposure); + [self setFloat:_exposure forUniform:exposureUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageFalseColorFilter.m b/framework/Source/GPUImageFalseColorFilter.m index f34d73267..7d9a721df 100644 --- a/framework/Source/GPUImageFalseColorFilter.m +++ b/framework/Source/GPUImageFalseColorFilter.m @@ -68,9 +68,7 @@ - (void)setFirstColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blu filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(firstColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:firstColorUniform program:filterProgram]; } - (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent; @@ -80,9 +78,7 @@ - (void)setSecondColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent bl filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(secondColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:secondColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageFastBlurFilter.m b/framework/Source/GPUImageFastBlurFilter.m index 7d0653ea7..b3e3ee58a 100755 --- a/framework/Source/GPUImageFastBlurFilter.m +++ b/framework/Source/GPUImageFastBlurFilter.m @@ -140,12 +140,8 @@ - (void)setBlurSize:(CGFloat)newValue; { _blurSize = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(firstBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(secondBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:firstBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:secondBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageFilter.h b/framework/Source/GPUImageFilter.h index ec36da581..aa3109465 100755 --- a/framework/Source/GPUImageFilter.h +++ b/framework/Source/GPUImageFilter.h @@ -115,12 +115,22 @@ typedef struct GPUMatrix3x3 GPUMatrix3x3; /// @name Input parameters - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GLfloat)blueComponent alpha:(GLfloat)alphaComponent; -- (void)setInteger:(GLint)newInteger forUniform:(NSString *)uniformName; -- (void)setFloat:(GLfloat)newFloat forUniform:(NSString *)uniformName; -- (void)setSize:(CGSize)newSize forUniform:(NSString *)uniformName; -- (void)setPoint:(CGPoint)newPoint forUniform:(NSString *)uniformName; -- (void)setFloatVec3:(GLfloat *)newVec3 forUniform:(NSString *)uniformName; +- (void)setInteger:(GLint)newInteger forUniformName:(NSString *)uniformName; +- (void)setFloat:(GLfloat)newFloat forUniformName:(NSString *)uniformName; +- (void)setSize:(CGSize)newSize forUniformName:(NSString *)uniformName; +- (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; +- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; - (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; - (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName; +- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +- (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; + @end diff --git a/framework/Source/GPUImageFilter.m b/framework/Source/GPUImageFilter.m index 13133a2ad..e8f802746 100755 --- a/framework/Source/GPUImageFilter.m +++ b/framework/Source/GPUImageFilter.m @@ -55,6 +55,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad backgroundColorBlue = 0.0; backgroundColorAlpha = 0.0; + // REFACTOR: Wrap this in block to perform on image processing queue? [GPUImageOpenGLESContext useImageProcessingContext]; filterProgram = [[GLProgram alloc] initWithVertexShaderString:vertexShaderString fragmentShaderString:fragmentShaderString]; @@ -76,7 +77,7 @@ - (id)initWithVertexShaderFromString:(NSString *)vertexShaderString fragmentShad filterTextureCoordinateAttribute = [filterProgram attributeIndex:@"inputTextureCoordinate"]; filterInputTextureUniform = [filterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glEnableVertexAttribArray(filterPositionAttribute); glEnableVertexAttribArray(filterTextureCoordinateAttribute); @@ -449,11 +450,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); @@ -525,70 +524,123 @@ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponen backgroundColorAlpha = alphaComponent; } -- (void)setInteger:(GLint)newInteger forUniform:(NSString *)uniformName; +- (void)setInteger:(GLint)newInteger forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - - glUniform1i(uniformIndex, newInteger); + [self setInteger:newInteger forUniform:uniformIndex program:filterProgram]; } -- (void)setFloat:(GLfloat)newFloat forUniform:(NSString *)uniformName; +- (void)setFloat:(GLfloat)newFloat forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - - glUniform1f(uniformIndex, newFloat); + [self setFloat:newFloat forUniform:uniformIndex program:filterProgram]; } -- (void)setSize:(CGSize)newSize forUniform:(NSString *)uniformName; +- (void)setSize:(CGSize)newSize forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - GLfloat sizeUniform[2]; - sizeUniform[0] = newSize.width; - sizeUniform[1] = newSize.height; - - glUniform2fv(uniformIndex, 1, sizeUniform); + [self setSize:newSize forUniform:uniformIndex program:filterProgram]; } -- (void)setPoint:(CGPoint)newPoint forUniform:(NSString *)uniformName; +- (void)setPoint:(CGPoint)newPoint forUniformName:(NSString *)uniformName; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - GLfloat sizeUniform[2]; - sizeUniform[0] = newPoint.x; - sizeUniform[1] = newPoint.y; - - glUniform2fv(uniformIndex, 1, sizeUniform); + [self setPoint:newPoint forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatVec3:(GLfloat *)newVec3 forUniform:(NSString *)uniformName; +- (void)setFloatVec3:(GLfloat *)newVec3 forUniformName:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - [filterProgram use]; - - glUniform3fv(uniformIndex, 1, newVec3); + [self setVec3:newVec3 forUniform:uniformIndex program:filterProgram]; } - (void)setFloatVec4:(GLfloat *)newVec4 forUniform:(NSString *)uniformName; { GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - [filterProgram use]; - - glUniform4fv(uniformIndex, 1, newVec4); + [self setVec4:newVec4 forUniform:uniformIndex program:filterProgram]; } -- (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; +- (void)setFloatArray:(GLfloat *)array length:(GLsizei)count forUniform:(NSString*)uniformName +{ GLint uniformIndex = [filterProgram uniformIndex:uniformName]; - glUniform1fv(uniformIndex, count, array); + [self setFloatArray:array length:count forUniform:uniformIndex program:filterProgram]; +} + +- (void)setMatrix3f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix3fv(uniform, 1, GL_FALSE, matrix); +} + +- (void)setMatrix4f:(GLfloat *)matrix forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniformMatrix4fv(uniform, 1, GL_FALSE, matrix); +} + +- (void)setFloat:(GLfloat)floatValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1f(uniform, floatValue); +} + +- (void)setPoint:(CGPoint)pointValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + GLfloat positionArray[2]; + positionArray[0] = pointValue.x; + positionArray[1] = pointValue.y; + + glUniform2fv(uniform, 1, positionArray); +} + +- (void)setSize:(CGSize)sizeValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + GLfloat sizeArray[2]; + sizeArray[0] = sizeValue.width; + sizeArray[1] = sizeValue.height; + + glUniform2fv(uniform, 1, sizeArray); +} + +- (void)setVec3:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform3fv(uniform, 1, vectorValue); +} + +- (void)setVec4:(GLfloat *)vectorValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform4fv(uniform, 1, vectorValue); +} + +- (void)setFloatArray:(GLfloat *)arrayValue length:(GLsizei)arrayLength forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + + glUniform1fv(uniform, arrayLength, arrayValue); +} + +- (void)setInteger:(GLint)intValue forUniform:(GLint)uniform program:(GLProgram *)shaderProgram; +{ + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:shaderProgram]; + glUniform1i(uniform, intValue); } #pragma mark - diff --git a/framework/Source/GPUImageGammaFilter.m b/framework/Source/GPUImageGammaFilter.m index ec66074df..1e74ac123 100755 --- a/framework/Source/GPUImageGammaFilter.m +++ b/framework/Source/GPUImageGammaFilter.m @@ -42,9 +42,7 @@ - (void)setGamma:(CGFloat)newValue; { _gamma = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(gammaUniform, _gamma); + [self setFloat:_gamma forUniform:gammaUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageGaussianBlurFilter.m b/framework/Source/GPUImageGaussianBlurFilter.m index f941b5bab..860df5da3 100755 --- a/framework/Source/GPUImageGaussianBlurFilter.m +++ b/framework/Source/GPUImageGaussianBlurFilter.m @@ -95,12 +95,8 @@ - (id)init; - (void) setBlurSize:(CGFloat)blurSize { _blurSize = blurSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(horizontalBlurSizeUniform, _blurSize); - - [secondFilterProgram use]; - glUniform1f(verticalBlurSizeUniform, _blurSize); + [self setFloat:_blurSize forUniform:horizontalBlurSizeUniform program:filterProgram]; + [self setFloat:_blurSize forUniform:verticalBlurSizeUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m index d388efc4b..6eddc8c8e 100755 --- a/framework/Source/GPUImageGaussianSelectiveBlurFilter.m +++ b/framework/Source/GPUImageGaussianSelectiveBlurFilter.m @@ -75,7 +75,7 @@ - (void)setInputSize:(CGSize)newSize atIndex:(NSInteger)textureIndex; if ( (!CGSizeEqualToSize(oldInputSize, inputTextureSize)) && (!hasOverriddenAspectRatio) ) { _aspectRatio = (inputTextureSize.width / inputTextureSize.height); - [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; + [selectiveFocusFilter setFloat:_aspectRatio forUniformName:@"aspectRatio"]; } } @@ -95,26 +95,26 @@ - (CGFloat)blurSize; - (void)setExcludeCirclePoint:(CGPoint)newValue; { _excludeCirclePoint = newValue; - [selectiveFocusFilter setPoint:newValue forUniform:@"excludeCirclePoint"]; + [selectiveFocusFilter setPoint:newValue forUniformName:@"excludeCirclePoint"]; } - (void)setExcludeCircleRadius:(CGFloat)newValue; { _excludeCircleRadius = newValue; - [selectiveFocusFilter setFloat:newValue forUniform:@"excludeCircleRadius"]; + [selectiveFocusFilter setFloat:newValue forUniformName:@"excludeCircleRadius"]; } - (void)setExcludeBlurSize:(CGFloat)newValue; { _excludeBlurSize = newValue; - [selectiveFocusFilter setFloat:newValue forUniform:@"excludeBlurSize"]; + [selectiveFocusFilter setFloat:newValue forUniformName:@"excludeBlurSize"]; } - (void)setAspectRatio:(CGFloat)newValue; { hasOverriddenAspectRatio = YES; _aspectRatio = newValue; - [selectiveFocusFilter setFloat:_aspectRatio forUniform:@"aspectRatio"]; + [selectiveFocusFilter setFloat:_aspectRatio forUniformName:@"aspectRatio"]; } @end diff --git a/framework/Source/GPUImageHarrisCornerDetectionFilter.m b/framework/Source/GPUImageHarrisCornerDetectionFilter.m index a208d19a4..f56c4b4f3 100755 --- a/framework/Source/GPUImageHarrisCornerDetectionFilter.m +++ b/framework/Source/GPUImageHarrisCornerDetectionFilter.m @@ -267,13 +267,13 @@ - (CGFloat)blurSize; - (void)setSensitivity:(CGFloat)newValue; { _sensitivity = newValue; - [harrisCornerDetectionFilter setFloat:newValue forUniform:@"sensitivity"]; + [harrisCornerDetectionFilter setFloat:newValue forUniformName:@"sensitivity"]; } - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [simpleThresholdFilter setFloat:newValue forUniform:@"threshold"]; + [simpleThresholdFilter setFloat:newValue forUniformName:@"threshold"]; } @end diff --git a/framework/Source/GPUImageHazeFilter.m b/framework/Source/GPUImageHazeFilter.m index 716134c4c..525fb7978 100755 --- a/framework/Source/GPUImageHazeFilter.m +++ b/framework/Source/GPUImageHazeFilter.m @@ -60,18 +60,14 @@ - (void)setDistance:(CGFloat)newValue; { _distance = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(distanceUniform, _distance); + [self setFloat:_distance forUniform:distanceUniform program:filterProgram]; } - (void)setSlope:(CGFloat)newValue; { _slope = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(slopeUniform, _slope); + [self setFloat:_slope forUniform:slopeUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHighlightShadowFilter.m b/framework/Source/GPUImageHighlightShadowFilter.m index 6ebfd6c27..50cc3f2ea 100644 --- a/framework/Source/GPUImageHighlightShadowFilter.m +++ b/framework/Source/GPUImageHighlightShadowFilter.m @@ -53,19 +53,15 @@ - (id)init; - (void)setShadows:(CGFloat)newValue; { _shadows = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(shadowsUniform, _shadows); + + [self setFloat:_shadows forUniform:shadowsUniform program:filterProgram]; } - (void)setHighlights:(CGFloat)newValue; { _highlights = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(highlightsUniform, _highlights); + + [self setFloat:_highlights forUniform:highlightsUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHistogramFilter.m b/framework/Source/GPUImageHistogramFilter.m index 93f8ee628..1404c4a65 100755 --- a/framework/Source/GPUImageHistogramFilter.m +++ b/framework/Source/GPUImageHistogramFilter.m @@ -147,7 +147,9 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; secondFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - [secondFilterProgram use]; + // REFACTOR: Possibly wrap this in a block on the image processing block + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glEnableVertexAttribArray(secondFilterPositionAttribute); if (![thirdFilterProgram link]) @@ -162,9 +164,9 @@ - (id)initWithHistogramType:(GPUImageHistogramType)newHistogramType; NSAssert(NO, @"Filter shader link failed"); } - thirdFilterPositionAttribute = [secondFilterProgram attributeIndex:@"position"]; - - [thirdFilterProgram use]; + thirdFilterPositionAttribute = [thirdFilterProgram attributeIndex:@"position"]; + [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; + glEnableVertexAttribArray(thirdFilterPositionAttribute); }; break; } @@ -249,7 +251,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates [self setFilterFBO]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glClearColor(0.0, 0.0, 0.0, 1.0); glClear(GL_COLOR_BUFFER_BIT); @@ -263,12 +265,12 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (histogramType == kGPUImageHistogramRGB) { - [secondFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glVertexAttribPointer(secondFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); - [thirdFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:thirdFilterProgram]; glVertexAttribPointer(thirdFilterPositionAttribute, 4, GL_UNSIGNED_BYTE, 0, (_downsamplingFactor - 1) * 4, vertexSamplingCoordinates); glDrawArrays(GL_POINTS, 0, inputTextureSize.width * inputTextureSize.height / (CGFloat)_downsamplingFactor); diff --git a/framework/Source/GPUImageHistogramGenerator.m b/framework/Source/GPUImageHistogramGenerator.m index 50089b94b..6eb1a8199 100755 --- a/framework/Source/GPUImageHistogramGenerator.m +++ b/framework/Source/GPUImageHistogramGenerator.m @@ -63,9 +63,7 @@ - (void)setBackgroundColorRed:(GLfloat)redComponent green:(GLfloat)greenComponen backgroundColor[2] = blueComponent; backgroundColor[3] = alphaComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4fv(backgroundColorUniform, 1, backgroundColor); + [self setVec4:backgroundColor forUniform:backgroundColorUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageHueFilter.m b/framework/Source/GPUImageHueFilter.m index 6c3556275..218d66944 100644 --- a/framework/Source/GPUImageHueFilter.m +++ b/framework/Source/GPUImageHueFilter.m @@ -53,8 +53,10 @@ void main () @implementation GPUImageHueFilter @synthesize hue; --(id) init { - if(! (self = [super initWithFragmentShaderFromString:kGPUImageHueFragmentShaderString]) ){ +- (id)init +{ + if(! (self = [super initWithFragmentShaderFromString:kGPUImageHueFragmentShaderString]) ) + { return nil; } @@ -64,14 +66,11 @@ -(id) init { return self; } --(void) setHue:(CGFloat)newHue { +- (void)setHue:(CGFloat)newHue +{ // Convert degrees to radians for hue rotation - hue = fmodf(newHue, 360.0) * M_PI/180 ; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(hueAdjustUniform, hue); - + hue = fmodf(newHue, 360.0) * M_PI/180; + [self setFloat:hue forUniform:hueAdjustUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageJFAVoroniFilter.m b/framework/Source/GPUImageJFAVoroniFilter.m index e47e9a1a8..fdebb73d0 100644 --- a/framework/Source/GPUImageJFAVoroniFilter.m +++ b/framework/Source/GPUImageJFAVoroniFilter.m @@ -381,8 +381,7 @@ - (void)setOutputFBO; - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates:(const GLfloat *)textureCoordinates sourceTexture:(GLuint)sourceTexture; { // Run the first stage of the two-pass filter - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glUniform1f(sampleStepUniform, 0.5); glUniform2f(sizeUniform, _sizeInPixels.width, _sizeInPixels.height); @@ -393,8 +392,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates if (pass % 2 == 0) { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; float step = pow(2.0, numPasses - pass) / pow(2.0, numPasses); glUniform1f(sampleStepUniform, step); @@ -405,7 +403,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [filterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageKuwaharaFilter.m b/framework/Source/GPUImageKuwaharaFilter.m index 6506c7a60..14bbcbd47 100755 --- a/framework/Source/GPUImageKuwaharaFilter.m +++ b/framework/Source/GPUImageKuwaharaFilter.m @@ -104,9 +104,7 @@ - (void)setRadius:(GLuint)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1i(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageLuminanceThresholdFilter.m b/framework/Source/GPUImageLuminanceThresholdFilter.m index e4331769d..4f7509510 100755 --- a/framework/Source/GPUImageLuminanceThresholdFilter.m +++ b/framework/Source/GPUImageLuminanceThresholdFilter.m @@ -46,9 +46,7 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMonochromeFilter.m b/framework/Source/GPUImageMonochromeFilter.m index 648b7fb47..329fcd5ef 100644 --- a/framework/Source/GPUImageMonochromeFilter.m +++ b/framework/Source/GPUImageMonochromeFilter.m @@ -72,18 +72,14 @@ - (void)setColorRed:(GLfloat)redComponent green:(GLfloat)greenComponent blue:(GL filterColor[1] = greenComponent; filterColor[2] = blueComponent; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform3fv(filterColorUniform, 1, filterColor); + [self setVec3:filterColor forUniform:filterColorUniform program:filterProgram]; } - (void)setIntensity:(CGFloat)newValue; { _intensity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(intensityUniform, _intensity); + [self setFloat:_intensity forUniform:intensityUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageMosaicFilter.m b/framework/Source/GPUImageMosaicFilter.m index 3101a3cf2..9265461e2 100644 --- a/framework/Source/GPUImageMosaicFilter.m +++ b/framework/Source/GPUImageMosaicFilter.m @@ -75,17 +75,20 @@ - (id)init; return self; } --(void)setColorOn:(BOOL)yes { +- (void)setColorOn:(BOOL)yes +{ glUniform1i(colorOnUniform, yes); } --(void)setNumTiles:(float)numTiles { +- (void)setNumTiles:(float)numTiles +{ _numTiles = numTiles; - [self setFloat:_numTiles forUniform:@"numTiles"]; + [self setFloat:_numTiles forUniformName:@"numTiles"]; } --(void)setInputTileSize:(CGSize)inputTileSize { +- (void)setInputTileSize:(CGSize)inputTileSize +{ if (inputTileSize.width > 1.0) { _inputTileSize.width = 1.0; } @@ -102,15 +105,11 @@ -(void)setInputTileSize:(CGSize)inputTileSize { _inputTileSize = inputTileSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat inputTS[2]; - inputTS[0] = _inputTileSize.width; - inputTS[1] = _inputTileSize.height; - glUniform2fv(inputTileSizeUniform, 1, inputTS); + [self setSize:_inputTileSize forUniform:inputTileSizeUniform program:filterProgram]; } --(void)setDisplayTileSize:(CGSize)displayTileSize { +-(void)setDisplayTileSize:(CGSize)displayTileSize +{ if (displayTileSize.width > 1.0) { _displayTileSize.width = 1.0; } @@ -127,18 +126,11 @@ -(void)setDisplayTileSize:(CGSize)displayTileSize { _displayTileSize = displayTileSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat displayTS[2]; - displayTS[0] = _displayTileSize.width; - displayTS[1] = _displayTileSize.height; - glUniform2fv(displayTileSizeUniform, 1, displayTS); + [self setSize:_displayTileSize forUniform:displayTileSizeUniform program:filterProgram]; } - - --(void)setTileSet:(NSString *)tileSet { - +-(void)setTileSet:(NSString *)tileSet +{ UIImage *img = [UIImage imageNamed:tileSet]; pic = [[GPUImagePicture alloc] initWithImage:img smoothlyScaleOutput:YES]; [pic addTarget:self]; diff --git a/framework/Source/GPUImageMovieWriter.m b/framework/Source/GPUImageMovieWriter.m index 58a759b0a..a3fd39dc3 100755 --- a/framework/Source/GPUImageMovieWriter.m +++ b/framework/Source/GPUImageMovieWriter.m @@ -113,7 +113,9 @@ - (id)initWithMovieURL:(NSURL *)newMovieURL size:(CGSize)newSize fileType:(NSStr colorSwizzlingTextureCoordinateAttribute = [colorSwizzlingProgram attributeIndex:@"inputTextureCoordinate"]; colorSwizzlingInputTextureUniform = [colorSwizzlingProgram uniformIndex:@"inputImageTexture"]; - [colorSwizzlingProgram use]; + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; + glEnableVertexAttribArray(colorSwizzlingPositionAttribute); glEnableVertexAttribArray(colorSwizzlingTextureCoordinateAttribute); @@ -402,7 +404,7 @@ - (void)renderAtInternalSize; [GPUImageOpenGLESContext useImageProcessingContext]; [self setFilterFBO]; - [colorSwizzlingProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:colorSwizzlingProgram]; glClearColor(1.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageOpacityFilter.m b/framework/Source/GPUImageOpacityFilter.m index fa60f2552..401a2e672 100644 --- a/framework/Source/GPUImageOpacityFilter.m +++ b/framework/Source/GPUImageOpacityFilter.m @@ -42,10 +42,7 @@ - (void)setOpacity:(CGFloat)newValue; { _opacity = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(opacityUniform, _opacity); + [self setFloat:_opacity forUniform:opacityUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageOpenGLESContext.h b/framework/Source/GPUImageOpenGLESContext.h index b8d1cb3fe..4d4c27054 100755 --- a/framework/Source/GPUImageOpenGLESContext.h +++ b/framework/Source/GPUImageOpenGLESContext.h @@ -4,20 +4,22 @@ #import #import #import +#import "GLProgram.h" #define GPUImageRotationSwapsWidthAndHeight(rotation) ((rotation) == kGPUImageRotateLeft || (rotation) == kGPUImageRotateRight || (rotation) == kGPUImageRotateRightFlipVertical) typedef enum { kGPUImageNoRotation, kGPUImageRotateLeft, kGPUImageRotateRight, kGPUImageFlipVertical, kGPUImageFlipHorizonal, kGPUImageRotateRightFlipVertical, kGPUImageRotate180 } GPUImageRotationMode; @interface GPUImageOpenGLESContext : NSObject -{ - EAGLContext *_context; -} -@property(readonly, retain) EAGLContext *context; +@property(readonly, retain, nonatomic) EAGLContext *context; +@property(readonly, nonatomic) dispatch_queue_t contextQueue; +@property(readwrite, retain, nonatomic) GLProgram *currentShaderProgram; + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; ++ (dispatch_queue_t)sharedOpenGLESQueue; + (void)useImageProcessingContext; ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; + (GLint)maximumTextureSizeForThisDevice; + (GLint)maximumTextureUnitsForThisDevice; + (CGSize)sizeThatFitsWithinATextureForSize:(CGSize)inputSize; diff --git a/framework/Source/GPUImageOpenGLESContext.m b/framework/Source/GPUImageOpenGLESContext.m index b34e7413e..6a69f6d76 100755 --- a/framework/Source/GPUImageOpenGLESContext.m +++ b/framework/Source/GPUImageOpenGLESContext.m @@ -5,6 +5,7 @@ @implementation GPUImageOpenGLESContext @synthesize context = _context; +@synthesize currentShaderProgram = _currentShaderProgram; // Based on Colin Wheeler's example here: http://cocoasamurai.blogspot.com/2011/04/singletons-your-doing-them-wrong.html + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; @@ -18,6 +19,11 @@ + (GPUImageOpenGLESContext *)sharedImageProcessingOpenGLESContext; return sharedImageProcessingOpenGLESContext; } ++ (dispatch_queue_t)sharedOpenGLESQueue; +{ + return [[self sharedImageProcessingOpenGLESContext] contextQueue]; +} + + (void)useImageProcessingContext; { EAGLContext *imageProcessingContext = [[GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext] context]; @@ -27,6 +33,22 @@ + (void)useImageProcessingContext; } } ++ (void)setActiveShaderProgram:(GLProgram *)shaderProgram; +{ + GPUImageOpenGLESContext *sharedContext = [GPUImageOpenGLESContext sharedImageProcessingOpenGLESContext]; + EAGLContext *imageProcessingContext = [sharedContext context]; + if ([EAGLContext currentContext] != imageProcessingContext) + { + [EAGLContext setCurrentContext:imageProcessingContext]; + } + + if (sharedContext.currentShaderProgram != shaderProgram) + { + sharedContext.currentShaderProgram = shaderProgram; + [shaderProgram use]; + } +} + + (GLint)maximumTextureSizeForThisDevice; { GLint maxTextureSize; @@ -94,10 +116,11 @@ - (EAGLContext *)context; // Set up a few global settings for the image processing pipeline glDisable(GL_DEPTH_TEST); + + _contextQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.openGLESContextQueue", NULL); } return _context; } - @end diff --git a/framework/Source/GPUImageOutput.h b/framework/Source/GPUImageOutput.h index c65485870..b393f54d0 100755 --- a/framework/Source/GPUImageOutput.h +++ b/framework/Source/GPUImageOutput.h @@ -1,7 +1,6 @@ #import #import "GPUImageOpenGLESContext.h" -#import "GLProgram.h" void runOnMainQueueWithoutDeadlocking(void (^block)(void)); void report_memory(NSString *tag); diff --git a/framework/Source/GPUImagePerlinNoiseFilter.m b/framework/Source/GPUImagePerlinNoiseFilter.m index 02a35b756..5d1d51982 100644 --- a/framework/Source/GPUImagePerlinNoiseFilter.m +++ b/framework/Source/GPUImagePerlinNoiseFilter.m @@ -127,27 +127,21 @@ - (void)setScale:(float)scale { _scale = scale; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setColorStart:(GPUVector4)colorStart { _colorStart = colorStart; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4f(colorStartUniform, _colorStart.one, _colorStart.two, _colorStart.three, _colorStart.four); + [self setVec4:(GLfloat *)&_colorStart forUniform:colorStartUniform program:filterProgram]; } - (void)setColorFinish:(GPUVector4)colorFinish { _colorFinish = colorFinish; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform4f(colorFinishUniform, _colorFinish.one, _colorFinish.two, _colorFinish.three, _colorFinish.four); + + [self setVec4:(GLfloat *)&_colorFinish forUniform:colorFinishUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePinchDistortionFilter.m b/framework/Source/GPUImagePinchDistortionFilter.m index fcbd1b556..4f4a75fc9 100755 --- a/framework/Source/GPUImagePinchDistortionFilter.m +++ b/framework/Source/GPUImagePinchDistortionFilter.m @@ -68,34 +68,22 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setScale:(CGFloat)newValue; { _scale = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(scaleUniform, _scale); + + [self setFloat:_scale forUniform:scaleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePixellateFilter.m b/framework/Source/GPUImagePixellateFilter.m index c6d07d122..a7a77584f 100755 --- a/framework/Source/GPUImagePixellateFilter.m +++ b/framework/Source/GPUImagePixellateFilter.m @@ -92,18 +92,14 @@ - (void)setFractionalWidthOfAPixel:(CGFloat)newValue; _fractionalWidthOfAPixel = newValue; } - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(fractionalWidthOfAPixelUniform, _fractionalWidthOfAPixel); + [self setFloat:_fractionalWidthOfAPixel forUniform:fractionalWidthOfAPixelUniform program:filterProgram]; } - (void)setAspectRatio:(CGFloat)newValue; { _aspectRatio = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(aspectRatioUniform, _aspectRatio); + + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePolarPixellateFilter.m b/framework/Source/GPUImagePolarPixellateFilter.m index 1a64a8d34..390a7aa7f 100755 --- a/framework/Source/GPUImagePolarPixellateFilter.m +++ b/framework/Source/GPUImagePolarPixellateFilter.m @@ -77,30 +77,15 @@ - (void)setPixelSize:(CGSize)pixelSize { _pixelSize = pixelSize; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - GLfloat pixelS[2]; - pixelS[0] = _pixelSize.width; - pixelS[1] = _pixelSize.height; - glUniform2fv(pixelSizeUniform, 1, pixelS); + [self setSize:_pixelSize forUniform:pixelSizeUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - - @end diff --git a/framework/Source/GPUImagePolkaDotFilter.m b/framework/Source/GPUImagePolkaDotFilter.m index 42946ad27..bad7e1a30 100644 --- a/framework/Source/GPUImagePolkaDotFilter.m +++ b/framework/Source/GPUImagePolkaDotFilter.m @@ -49,9 +49,7 @@ - (void)setDotScaling:(CGFloat)newValue; { _dotScaling = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(dotScalingUniform, _dotScaling); + [self setFloat:_dotScaling forUniform:dotScalingUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImagePosterizeFilter.m b/framework/Source/GPUImagePosterizeFilter.m index 17bbec6cd..5a04105ea 100755 --- a/framework/Source/GPUImagePosterizeFilter.m +++ b/framework/Source/GPUImagePosterizeFilter.m @@ -42,9 +42,7 @@ - (void)setColorLevels:(NSUInteger)newValue; { _colorLevels = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(colorLevelsUniform, (GLfloat)_colorLevels); + [self setFloat:_colorLevels forUniform:colorLevelsUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageRGBFilter.m b/framework/Source/GPUImageRGBFilter.m index e71bb4aae..c981f8805 100755 --- a/framework/Source/GPUImageRGBFilter.m +++ b/framework/Source/GPUImageRGBFilter.m @@ -50,28 +50,21 @@ - (void)setRed:(CGFloat)newValue; { _red = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(redUniform, _red); + [self setFloat:_red forUniform:redUniform program:filterProgram]; } - (void)setGreen:(CGFloat)newValue; { _green = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(greenUniform, _green); -} + [self setFloat:_green forUniform:greenUniform program:filterProgram]; +} - (void)setBlue:(CGFloat)newValue; { _blue = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(blueUniform, _blue); + + [self setFloat:_blue forUniform:blueUniform program:filterProgram]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageRawDataOutput.m b/framework/Source/GPUImageRawDataOutput.m index 9ee1d05dc..6907e6970 100755 --- a/framework/Source/GPUImageRawDataOutput.m +++ b/framework/Source/GPUImageRawDataOutput.m @@ -82,7 +82,9 @@ - (id)initWithImageSize:(CGSize)newImageSize resultsInBGRAFormat:(BOOL)resultsIn dataTextureCoordinateAttribute = [dataProgram attributeIndex:@"inputTextureCoordinate"]; dataInputTextureUniform = [dataProgram uniformIndex:@"inputImageTexture"]; - [dataProgram use]; + // REFACTOR: Wrap this in a block for the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + glEnableVertexAttribArray(dataPositionAttribute); glEnableVertexAttribArray(dataTextureCoordinateAttribute); @@ -217,10 +219,8 @@ - (void)setFilterFBO; - (void)renderAtInternalSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [self setFilterFBO]; - - [dataProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:dataProgram]; + [self setFilterFBO]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageSaturationFilter.m b/framework/Source/GPUImageSaturationFilter.m index 87c0510c0..31929e7e3 100755 --- a/framework/Source/GPUImageSaturationFilter.m +++ b/framework/Source/GPUImageSaturationFilter.m @@ -48,9 +48,7 @@ - (void)setSaturation:(CGFloat)newValue; { _saturation = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(saturationUniform, _saturation); + [self setFloat:_saturation forUniform:saturationUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageSharpenFilter.m b/framework/Source/GPUImageSharpenFilter.m index 14a9fbc23..83399675b 100755 --- a/framework/Source/GPUImageSharpenFilter.m +++ b/framework/Source/GPUImageSharpenFilter.m @@ -88,8 +88,8 @@ - (id)init; - (void)setupFilterForSize:(CGSize)filterFrameSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) { @@ -110,9 +110,7 @@ - (void)setSharpness:(CGFloat)newValue; { _sharpness = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(sharpnessUniform, _sharpness); + [self setFloat:_sharpness forUniform:sharpnessUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageSobelEdgeDetectionFilter.m b/framework/Source/GPUImageSobelEdgeDetectionFilter.m index f0d906555..39aa3987e 100755 --- a/framework/Source/GPUImageSobelEdgeDetectionFilter.m +++ b/framework/Source/GPUImageSobelEdgeDetectionFilter.m @@ -83,8 +83,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; _texelWidth = 1.0 / filterFrameSize.width; _texelHeight = 1.0 / filterFrameSize.height; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; + // REFACTOR: Wrap this in block on image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glUniform1f(texelWidthUniform, _texelWidth); glUniform1f(texelHeightUniform, _texelHeight); } @@ -98,19 +98,15 @@ - (void)setTexelWidth:(CGFloat)newValue; hasOverriddenImageSizeFactor = YES; _texelWidth = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(texelWidthUniform, _texelWidth); + [self setFloat:_texelWidth forUniform:texelWidthUniform program:secondFilterProgram]; } - (void)setTexelHeight:(CGFloat)newValue; { hasOverriddenImageSizeFactor = YES; _texelHeight = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(texelHeightUniform, _texelHeight); + + [self setFloat:_texelHeight forUniform:texelHeightUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageSphereRefractionFilter.m b/framework/Source/GPUImageSphereRefractionFilter.m index 979f9263e..c4815fc58 100644 --- a/framework/Source/GPUImageSphereRefractionFilter.m +++ b/framework/Source/GPUImageSphereRefractionFilter.m @@ -100,43 +100,29 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - (void)setAspectRatio:(CGFloat)newValue; { _aspectRatio = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(aspectRatioUniform, _aspectRatio); + [self setFloat:_aspectRatio forUniform:aspectRatioUniform program:filterProgram]; } - (void)setRefractiveIndex:(CGFloat)newValue; { _refractiveIndex = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(refractiveIndexUniform, _refractiveIndex); + + [self setFloat:_refractiveIndex forUniform:refractiveIndexUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageStretchDistortionFilter.m b/framework/Source/GPUImageStretchDistortionFilter.m index ef96f0130..967e13811 100755 --- a/framework/Source/GPUImageStretchDistortionFilter.m +++ b/framework/Source/GPUImageStretchDistortionFilter.m @@ -64,17 +64,8 @@ - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } - @end diff --git a/framework/Source/GPUImageSwirlFilter.m b/framework/Source/GPUImageSwirlFilter.m index 1c1dce63f..6004a85b3 100755 --- a/framework/Source/GPUImageSwirlFilter.m +++ b/framework/Source/GPUImageSwirlFilter.m @@ -72,34 +72,22 @@ - (void)setRadius:(CGFloat)newValue; { _radius = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(radiusUniform, _radius); + [self setFloat:_radius forUniform:radiusUniform program:filterProgram]; } - (void)setAngle:(CGFloat)newValue; { _angle = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(angleUniform, _angle); + + [self setFloat:_angle forUniform:angleUniform program:filterProgram]; } - (void)setCenter:(CGPoint)newValue; { _center = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - CGPoint rotatedPoint = [self rotatedPoint:_center forRotation:inputRotation]; - - GLfloat centerPosition[2]; - centerPosition[0] = rotatedPoint.x; - centerPosition[1] = rotatedPoint.y; - - glUniform2fv(centerUniform, 1, centerPosition); + [self setPoint:rotatedPoint forUniform:centerUniform program:filterProgram]; } @end diff --git a/framework/Source/GPUImageThresholdEdgeDetection.m b/framework/Source/GPUImageThresholdEdgeDetection.m index 0de89abcd..d95f80022 100755 --- a/framework/Source/GPUImageThresholdEdgeDetection.m +++ b/framework/Source/GPUImageThresholdEdgeDetection.m @@ -70,9 +70,7 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [secondFilterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:secondFilterProgram]; } @end diff --git a/framework/Source/GPUImageTiltShiftFilter.m b/framework/Source/GPUImageTiltShiftFilter.m index 0e4f30258..7bfbe1688 100755 --- a/framework/Source/GPUImageTiltShiftFilter.m +++ b/framework/Source/GPUImageTiltShiftFilter.m @@ -82,19 +82,19 @@ - (CGFloat)blurSize; - (void)setTopFocusLevel:(CGFloat)newValue; { _topFocusLevel = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"topFocusLevel"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"topFocusLevel"]; } - (void)setBottomFocusLevel:(CGFloat)newValue; { _bottomFocusLevel = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"bottomFocusLevel"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"bottomFocusLevel"]; } - (void)setFocusFallOffRate:(CGFloat)newValue; { _focusFallOffRate = newValue; - [tiltShiftFilter setFloat:newValue forUniform:@"focusFallOffRate"]; + [tiltShiftFilter setFloat:newValue forUniformName:@"focusFallOffRate"]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageToneCurveFilter.m b/framework/Source/GPUImageToneCurveFilter.m index d41eaf55c..25a655322 100644 --- a/framework/Source/GPUImageToneCurveFilter.m +++ b/framework/Source/GPUImageToneCurveFilter.m @@ -422,11 +422,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageToonFilter.m b/framework/Source/GPUImageToonFilter.m index 1e34db745..88c032065 100755 --- a/framework/Source/GPUImageToonFilter.m +++ b/framework/Source/GPUImageToonFilter.m @@ -85,18 +85,14 @@ - (void)setThreshold:(CGFloat)newValue; { _threshold = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(thresholdUniform, _threshold); + [self setFloat:_threshold forUniform:thresholdUniform program:filterProgram]; } - (void)setQuantizationLevels:(CGFloat)newValue; { _quantizationLevels = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(quantizationLevelsUniform, _quantizationLevels); + [self setFloat:_quantizationLevels forUniform:quantizationLevelsUniform program:filterProgram]; } diff --git a/framework/Source/GPUImageTransformFilter.m b/framework/Source/GPUImageTransformFilter.m index f39ebd74d..02f0c922b 100755 --- a/framework/Source/GPUImageTransformFilter.m +++ b/framework/Source/GPUImageTransformFilter.m @@ -141,11 +141,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; { [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * filterFrameSize.height / filterFrameSize.width) top:(1.0 * filterFrameSize.height / filterFrameSize.width) near:-1.0 far:1.0]; // [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:(-1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) top:(1.0 * (GLfloat)backingHeight / (GLfloat)backingWidth) near:-2.0 far:2.0]; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + + [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } } @@ -165,15 +162,11 @@ - (CGAffineTransform)affineTransform; - (void)setTransform3D:(CATransform3D)newValue; { _transform3D = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - + GLfloat temporaryMatrix[16]; [self convert3DTransform:&_transform3D toMatrix:temporaryMatrix]; - - glUniformMatrix4fv(transformMatrixUniform, 1, GL_FALSE, temporaryMatrix); + [self setMatrix4f:temporaryMatrix forUniform:transformMatrixUniform program:filterProgram]; } - (void)setIgnoreAspectRatio:(BOOL)newValue; @@ -184,10 +177,7 @@ - (void)setIgnoreAspectRatio:(BOOL)newValue; { [self loadOrthoMatrix:orthographicMatrix left:-1.0 right:1.0 bottom:-1.0 top:1.0 near:-1.0 far:1.0]; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - - glUniformMatrix4fv(orthographicMatrixUniform, 1, GL_FALSE, orthographicMatrix); + [self setMatrix4f:orthographicMatrix forUniform:orthographicMatrixUniform program:filterProgram]; } else { diff --git a/framework/Source/GPUImageTwoInputFilter.m b/framework/Source/GPUImageTwoInputFilter.m index 096a86c6c..83bc74eca 100644 --- a/framework/Source/GPUImageTwoInputFilter.m +++ b/framework/Source/GPUImageTwoInputFilter.m @@ -76,11 +76,9 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates return; } - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; [self setFilterFBO]; - [filterProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassFilter.m b/framework/Source/GPUImageTwoPassFilter.m index 8c24a2cb4..687e418f3 100755 --- a/framework/Source/GPUImageTwoPassFilter.m +++ b/framework/Source/GPUImageTwoPassFilter.m @@ -33,7 +33,9 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade secondFilterInputTextureUniform = [secondFilterProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputImageTexture" for the fragment shader secondFilterInputTextureUniform2 = [secondFilterProgram uniformIndex:@"inputImageTexture2"]; // This does assume a name of "inputImageTexture2" for second input texture in the fragment shader - [secondFilterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; + glEnableVertexAttribArray(secondFilterPositionAttribute); glEnableVertexAttribArray(secondFilterTextureCoordinateAttribute); @@ -222,7 +224,7 @@ - (void)renderToTextureWithVertices:(const GLfloat *)vertices textureCoordinates // Run the second stage of the two-pass filter [self setSecondFilterFBO]; - [secondFilterProgram use]; + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); diff --git a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m index a81befbe3..1d87ae9b1 100644 --- a/framework/Source/GPUImageTwoPassTextureSamplingFilter.m +++ b/framework/Source/GPUImageTwoPassTextureSamplingFilter.m @@ -23,8 +23,8 @@ - (id)initWithFirstStageVertexShaderFromString:(NSString *)firstStageVertexShade - (void)setupFilterForSize:(CGSize)filterFrameSize; { - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:filterProgram]; // The first pass through the framebuffer may rotate the inbound image, so need to account for that by changing up the kernel ordering for that pass if (GPUImageRotationSwapsWidthAndHeight(inputRotation)) @@ -38,7 +38,8 @@ - (void)setupFilterForSize:(CGSize)filterFrameSize; glUniform1f(verticalPassTexelHeightOffsetUniform, 1.0 / filterFrameSize.height); } - [secondFilterProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:secondFilterProgram]; glUniform1f(horizontalPassTexelWidthOffsetUniform, 1.0 / filterFrameSize.width); glUniform1f(horizontalPassTexelHeightOffsetUniform, 0.0); } diff --git a/framework/Source/GPUImageUnsharpMaskFilter.m b/framework/Source/GPUImageUnsharpMaskFilter.m index d5331ee49..b1f2b618b 100755 --- a/framework/Source/GPUImageUnsharpMaskFilter.m +++ b/framework/Source/GPUImageUnsharpMaskFilter.m @@ -75,7 +75,7 @@ - (CGFloat)blurSize; - (void)setIntensity:(CGFloat)newValue; { _intensity = newValue; - [unsharpMaskFilter setFloat:newValue forUniform:@"intensity"]; + [unsharpMaskFilter setFloat:newValue forUniformName:@"intensity"]; } @end \ No newline at end of file diff --git a/framework/Source/GPUImageVideoCamera.h b/framework/Source/GPUImageVideoCamera.h index 13349f5ad..480f89ae2 100755 --- a/framework/Source/GPUImageVideoCamera.h +++ b/framework/Source/GPUImageVideoCamera.h @@ -34,10 +34,10 @@ } /// The AVCaptureSession used to capture from the camera -@property(readonly, retain) AVCaptureSession *captureSession; +@property(readonly, retain, nonatomic) AVCaptureSession *captureSession; -/// This enables capture session preset to be changed on the fly -@property (readwrite) NSString *captureSessionPreset; +/// This enables the capture session preset to be changed on the fly +@property (readwrite, nonatomic) NSString *captureSessionPreset; /// This sets the frame rate of the camera (iOS 5 and above only) /** @@ -57,7 +57,7 @@ /// This determines the rotation applied to the output image, based on the source material @property(readwrite, nonatomic) UIInterfaceOrientation outputImageOrientation; -@property(nonatomic,retain) id delegate; +@property(nonatomic, retain) id delegate; /// @name Initialization and teardown diff --git a/framework/Source/GPUImageVideoCamera.m b/framework/Source/GPUImageVideoCamera.m index fb1f39afc..791b361df 100755 --- a/framework/Source/GPUImageVideoCamera.m +++ b/framework/Source/GPUImageVideoCamera.m @@ -12,16 +12,16 @@ @interface GPUImageVideoCamera () AVCaptureAudioDataOutput *audioOutput; NSDate *startingCaptureTime; - NSString *_capturSessionPreset; NSInteger _frameRate; - dispatch_queue_t audioProcessingQueue; + dispatch_queue_t cameraProcessingQueue, audioProcessingQueue; } @end @implementation GPUImageVideoCamera +@synthesize captureSessionPreset = _captureSessionPreset; @synthesize captureSession = _captureSession; @synthesize inputCamera = _inputCamera; @synthesize runBenchmark = _runBenchmark; @@ -48,7 +48,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD return nil; } - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.processingQueue", NULL); + cameraProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.cameraProcessingQueue", NULL); + audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); _frameRate = 0; // This will not set frame rate unless this value gets set to 1 or above _runBenchmark = NO; @@ -104,9 +105,7 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD // dispatch_queue_t videoQueue = dispatch_queue_create("com.sunsetlakesoftware.colortracking.videoqueue", NULL); // [videoOutput setSampleBufferDelegate:self queue:videoQueue]; - //[videoOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; - //this should be on the same queue as the audio - [videoOutput setSampleBufferDelegate:self queue:audioProcessingQueue]; + [videoOutput setSampleBufferDelegate:self queue:cameraProcessingQueue]; if ([_captureSession canAddOutput:videoOutput]) { [_captureSession addOutput:videoOutput]; @@ -116,8 +115,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD NSLog(@"Couldn't add video output"); } - _capturSessionPreset = sessionPreset; - [_captureSession setSessionPreset:_capturSessionPreset]; + _captureSessionPreset = sessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; // This will let you get 60 FPS video from the 720p preset on an iPhone 4S, but only that device and that preset // AVCaptureConnection *conn = [videoOutput connectionWithMediaType:AVMediaTypeVideo]; @@ -137,7 +136,8 @@ - (id)initWithSessionPreset:(NSString *)sessionPreset cameraPosition:(AVCaptureD - (void)dealloc { [self stopCameraCapture]; - // [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [videoOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; + [audioOutput setSampleBufferDelegate:nil queue:dispatch_get_main_queue()]; [self removeInputsAndOutputs]; @@ -145,7 +145,12 @@ - (void)dealloc { CFRelease(coreVideoTextureCache); } - + + if (cameraProcessingQueue != NULL) + { + dispatch_release(cameraProcessingQueue); + } + if (audioProcessingQueue != NULL) { dispatch_release(audioProcessingQueue); @@ -275,17 +280,12 @@ - (void)setCaptureSessionPreset:(NSString *)captureSessionPreset; { [_captureSession beginConfiguration]; - _capturSessionPreset = captureSessionPreset; - [_captureSession setSessionPreset:_capturSessionPreset]; + _captureSessionPreset = captureSessionPreset; + [_captureSession setSessionPreset:_captureSessionPreset]; [_captureSession commitConfiguration]; } -- (NSString *)captureSessionPreset; -{ - return _capturSessionPreset; -} - - (void)setFrameRate:(NSInteger)frameRate; { _frameRate = frameRate; @@ -519,9 +519,6 @@ - (void)setAudioEncodingTarget:(GPUImageMovieWriter *)newValue; } audioOutput = [[AVCaptureAudioDataOutput alloc] init]; - audioProcessingQueue = dispatch_queue_create("com.sunsetlakesoftware.GPUImage.audioProcessingQueue", NULL); - - // [audioOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()]; if ([_captureSession canAddOutput:audioOutput]) { [_captureSession addOutput:audioOutput]; diff --git a/framework/Source/GPUImageView.m b/framework/Source/GPUImageView.m index 70dbefae6..e890462c5 100755 --- a/framework/Source/GPUImageView.m +++ b/framework/Source/GPUImageView.m @@ -113,7 +113,8 @@ - (void)commonInit; displayTextureCoordinateAttribute = [displayProgram attributeIndex:@"inputTextureCoordinate"]; displayInputTextureUniform = [displayProgram uniformIndex:@"inputImageTexture"]; // This does assume a name of "inputTexture" for the fragment shader - [displayProgram use]; + // REFACTOR: Wrap this in a block on the image processing queue + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; glEnableVertexAttribArray(displayPositionAttribute); glEnableVertexAttribArray(displayTextureCoordinateAttribute); @@ -342,11 +343,9 @@ + (const GLfloat *)textureCoordinatesForRotation:(GPUImageRotationMode)rotationM - (void)newFrameReadyAtTime:(CMTime)frameTime atIndex:(NSInteger)textureIndex; { - [GPUImageOpenGLESContext useImageProcessingContext]; + [GPUImageOpenGLESContext setActiveShaderProgram:displayProgram]; [self setDisplayFramebuffer]; - [displayProgram use]; - glClearColor(backgroundColorRed, backgroundColorGreen, backgroundColorBlue, backgroundColorAlpha); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); diff --git a/framework/Source/GPUImageVignetteFilter.m b/framework/Source/GPUImageVignetteFilter.m index 1b2a03680..4eb094528 100755 --- a/framework/Source/GPUImageVignetteFilter.m +++ b/framework/Source/GPUImageVignetteFilter.m @@ -49,18 +49,14 @@ - (void)setVignetteStart:(CGFloat)newValue; { _vignetteStart = newValue; - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(vignetteStartUniform, _vignetteStart); + [self setFloat:_vignetteStart forUniform:vignetteStartUniform program:filterProgram]; } - (void)setVignetteEnd:(CGFloat)newValue; { _vignetteEnd = newValue; - - [GPUImageOpenGLESContext useImageProcessingContext]; - [filterProgram use]; - glUniform1f(vignetteEndUniform, _vignetteEnd); + + [self setFloat:_vignetteEnd forUniform:vignetteEndUniform program:filterProgram]; } @end