Home | History | Annotate | Download | only in hwui

Lines Matching refs:Layer

36 LayerRenderer::LayerRenderer(Layer* layer): mLayer(layer) {
48 LAYER_RENDERER_LOGD("Rendering into layer, fbo = %d", mLayer->getFbo());
52 const float width = mLayer->layer.getWidth();
53 const float height = mLayer->layer.getHeight();
89 LAYER_RENDERER_LOGD("Finished rendering into layer, fbo = %d", mLayer->getFbo());
104 // Layer support
164 const float height = mLayer->layer.getHeight();
187 Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) {
188 LAYER_RENDERER_LOGD("Requesting new render layer %dx%d", width, height);
198 Layer* layer = caches.layerCache.get(width, height);
199 if (!layer) {
200 ALOGW("Could not obtain a layer");
204 // We first obtain a layer before comparing against the max texture size
208 if (layer->getWidth() > maxTextureSize || layer->getHeight() > maxTextureSize) {
209 ALOGW("Layer exceeds max. dimensions supported by the GPU (%dx%d, max=%dx%d)",
212 // Creating a new layer always increment its refcount by 1, this allows
213 // us to destroy the layer object if one was created for us
214 Caches::getInstance().resourceCache.decrementRefcount(layer);
219 layer->setFbo(fbo);
220 layer->layer.set(0.0f, 0.0f, width, height);
221 layer->texCoords.set(0.0f, height / float(layer->getHeight()),
222 width / float(layer->getWidth()), 0.0f);
223 layer->setAlpha(255, SkXfermode::kSrcOver_Mode);
224 layer->setBlend(!isOpaque);
225 layer->setColorFilter(NULL);
226 layer->setDirty(true);
227 layer->region.clear();
232 glBindFramebuffer(GL_FRAMEBUFFER, layer->getFbo());
233 layer->bindTexture();
236 if (layer->isEmpty()) {
237 layer->setEmpty(false);
238 layer->allocateTexture();
242 ALOGE("Could not allocate texture for layer (fbo=%d %dx%d)", fbo, width, height);
244 caches.resourceCache.decrementRefcount(layer);
250 layer->getTexture(), 0);
254 return layer;
257 bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) {
258 if (layer) {
259 LAYER_RENDERER_LOGD("Resizing layer fbo = %d to %dx%d", layer->getFbo(), width, height);
261 if (layer->resize(width, height)) {
262 layer->layer.set(0.0f, 0.0f, width, height);
263 layer->texCoords.set(0.0f, height / float(layer->getHeight()),
264 width / float(layer->getWidth()), 0.0f);
273 Layer* LayerRenderer::createTextureLayer(bool isOpaque) {
274 LAYER_RENDERER_LOGD("Creating new texture layer");
276 Layer* layer = new Layer(0, 0);
277 layer->setCacheable(false);
278 layer->setTextureLayer(true);
279 layer->setBlend(!isOpaque);
280 layer->setEmpty(true);
281 layer->setFbo(0);
282 layer->setAlpha(255, SkXfermode::kSrcOver_Mode);
283 layer->layer.set(0.0f, 0.0f, 0.0f, 0.0f);
284 layer->texCoords.set(0.0f, 1.0f, 1.0f, 0.0f);
285 layer->region.clear();
286 layer->setRenderTarget(GL_NONE); // see ::updateTextureLayer()
289 layer->generateTexture();
291 return layer;
294 void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
296 if (layer) {
297 layer->setBlend(!isOpaque);
298 layer->setSize(width, height);
299 layer->layer.set(0.0f, 0.0f, width, height);
300 layer->region.set(width, height);
301 layer->regionRect.set(0.0f, 0.0f, width, height);
302 layer->getTexTransform().load(transform);
304 if (renderTarget != layer->getRenderTarget()) {
305 layer->setRenderTarget(renderTarget);
306 layer->bindTexture();
307 layer->setFilter(GL_NEAREST, false, true);
308 layer->setWrap(GL_CLAMP_TO_EDGE, false, true);
313 void LayerRenderer::destroyLayer(Layer* layer) {
314 if (layer) {
315 LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d",
316 layer->getWidth(), layer->getHeight(), layer->getFbo());
318 if (!Caches::getInstance().layerCache.put(layer)) {
320 Caches::getInstance().resourceCache.decrementRefcount(layer);
326 layer->removeFbo();
327 layer->region.clear();
332 void LayerRenderer::destroyLayerDeferred(Layer* layer) {
333 if (layer) {
334 LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo());
336 Caches::getInstance().deleteLayerDeferred(layer);
340 void LayerRenderer::flushLayer(Layer* layer) {
342 GLuint fbo = layer->getFbo();
343 if (layer && fbo) {
360 bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) {
362 if (layer && bitmap->width() <= caches.maxTextureSize &&
403 float alpha = layer->getAlpha();
404 SkXfermode::Mode mode = layer->getMode();
405 GLuint previousLayerFbo = layer->getFbo();
407 layer->setAlpha(255, SkXfermode::kSrc_Mode);
408 layer->setFbo(fbo);
437 LayerRenderer renderer(layer);
440 bitmap->width(), bitmap->height(), !layer->isBlend());
446 mat4 texTransform(layer->getTexTransform());
451 layer->getTexTransform().multiply(invert);
458 renderer.drawTextureLayer(layer, bounds);
466 layer->getTexTransform().load(texTransform);
473 ALOGD("GL error while copying layer into bitmap = 0x%x", error);
478 layer->setAlpha(alpha, mode);
479 layer->setFbo(previousLayerFbo);