blob: f99b1c50305b3fac9578ac6d14d069fc5183b598 [file] [log] [blame]
/*
* Copyright 2012 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef GrGLProcessor_DEFINED
#define GrGLProcessor_DEFINED
#include "GrGLProgramDataManager.h"
#include "GrProcessor.h"
#include "GrTextureAccess.h"
/** @file
This file contains specializations for OpenGL of the shader stages declared in
include/gpu/GrProcessor.h. Objects of type GrGLProcessor are responsible for emitting the
GLSL code that implements a GrProcessor and for uploading uniforms at draw time. If they don't
always emit the same GLSL code, they must have a function:
static inline void GenKey(const GrProcessor&, const GrGLSLCaps&, GrProcessorKeyBuilder*)
that is used to implement a program cache. When two GrProcessors produce the same key this means
that their GrGLProcessors would emit the same GLSL code.
The GrGLProcessor subclass must also have a constructor of the form:
ProcessorSubclass::ProcessorSubclass(const GrBackendProcessorFactory&, const GrProcessor&)
These objects are created by the factory object returned by the GrProcessor::getFactory().
*/
// TODO delete this and make TextureSampler its own thing
class GrGLProcessor {
public:
typedef GrGLProgramDataManager::UniformHandle UniformHandle;
/**
* Passed to GrGLProcessors so they can add transformed coordinates to their shader code.
*/
typedef GrShaderVar TransformedCoords;
typedef SkTArray<GrShaderVar> TransformedCoordsArray;
/**
* Passed to GrGLProcessors so they can add texture reads to their shader code.
*/
class TextureSampler {
public:
TextureSampler(UniformHandle uniform, const GrTextureAccess& access)
: fSamplerUniform(uniform)
, fConfigComponentMask(GrPixelConfigComponentMask(access.getTexture()->config())) {
SkASSERT(0 != fConfigComponentMask);
memcpy(fSwizzle, access.getSwizzle(), 5);
}
// bitfield of GrColorComponentFlags present in the texture's config.
uint32_t configComponentMask() const { return fConfigComponentMask; }
// this is .abcd
const char* swizzle() const { return fSwizzle; }
private:
UniformHandle fSamplerUniform;
uint32_t fConfigComponentMask;
char fSwizzle[5];
friend class GrGLShaderBuilder;
};
typedef SkTArray<TextureSampler> TextureSamplerArray;
};
#endif