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
173 const float height = mLayer->layer.getHeight();
208 Layer* LayerRenderer::createLayer(uint32_t width, uint32_t height, bool isOpaque) {
209 LAYER_RENDERER_LOGD("Requesting new render layer %dx%d", width, height);
219 Layer* layer = caches.layerCache.get(width, height);
220 if (!layer) {
221 ALOGW("Could not obtain a layer");
225 // We first obtain a layer before comparing against the max texture size
229 if (layer->getWidth() > maxTextureSize || layer->getHeight() > maxTextureSize) {
230 ALOGW("Layer exceeds max. dimensions supported by the GPU (%dx%d, max=%dx%d)",
233 // Creating a new layer always increment its refcount by 1, this allows
234 // us to destroy the layer object if one was created for us
235 Caches::getInstance().resourceCache.decrementRefcount(layer);
240 layer->setFbo(fbo);
241 layer->layer.set(0.0f, 0.0f, width, height);
242 layer->texCoords.set(0.0f, height / float(layer->getHeight()),
243 width / float(layer->getWidth()), 0.0f);
244 layer->setAlpha(255, SkXfermode::kSrcOver_Mode);
245 layer->setBlend(!isOpaque);
246 layer->setColorFilter(NULL);
247 layer->setDirty(true);
248 layer->region.clear();
253 glBindFramebuffer(GL_FRAMEBUFFER, layer->getFbo());
254 layer->bindTexture();
257 if (layer->isEmpty()) {
258 layer->setEmpty(false);
259 layer->allocateTexture();
263 ALOGE("Could not allocate texture for layer (fbo=%d %dx%d)", fbo, width, height);
265 caches.resourceCache.decrementRefcount(layer);
271 layer->getTexture(), 0);
275 return layer;
278 bool LayerRenderer::resizeLayer(Layer* layer, uint32_t width, uint32_t height) {
279 if (layer) {
280 LAYER_RENDERER_LOGD("Resizing layer fbo = %d to %dx%d", layer->getFbo(), width, height);
282 if (layer->resize(width, height)) {
283 layer->layer.set(0.0f, 0.0f, width, height);
284 layer->texCoords.set(0.0f, height / float(layer->getHeight()),
285 width / float(layer->getWidth()), 0.0f);
294 Layer* LayerRenderer::createTextureLayer(bool isOpaque) {
295 LAYER_RENDERER_LOGD("Creating new texture layer");
297 Layer* layer = new Layer(0, 0);
298 layer->setCacheable(false);
299 layer->setTextureLayer(true);
300 layer->setBlend(!isOpaque);
301 layer->setEmpty(true);
302 layer->setFbo(0);
303 layer->setAlpha(255, SkXfermode::kSrcOver_Mode);
304 layer->layer.set(0.0f, 0.0f, 0.0f, 0.0f);
305 layer->texCoords.set(0.0f, 1.0f, 1.0f, 0.0f);
306 layer->region.clear();
307 layer->setRenderTarget(GL_NONE); // see ::updateTextureLayer()
310 layer->generateTexture();
312 return layer;
315 void LayerRenderer::updateTextureLayer(Layer* layer, uint32_t width, uint32_t height,
317 if (layer) {
318 layer->setBlend(!isOpaque);
319 layer->setSize(width, height);
320 layer->layer.set(0.0f, 0.0f, width, height);
321 layer->region.set(width, height);
322 layer->regionRect.set(0.0f, 0.0f, width, height);
323 layer->getTexTransform().load(transform);
325 if (renderTarget != layer->getRenderTarget()) {
326 layer->setRenderTarget(renderTarget);
327 layer->bindTexture();
328 layer->setFilter(GL_NEAREST, false, true);
329 layer->setWrap(GL_CLAMP_TO_EDGE, false, true);
334 void LayerRenderer::destroyLayer(Layer* layer) {
335 if (layer) {
336 LAYER_RENDERER_LOGD("Recycling layer, %dx%d fbo = %d",
337 layer->getWidth(), layer->getHeight(), layer->getFbo());
339 if (!Caches::getInstance().layerCache.put(layer)) {
341 Caches::getInstance().resourceCache.decrementRefcount(layer);
347 layer->removeFbo();
348 layer->region.clear();
353 void LayerRenderer::destroyLayerDeferred(Layer* layer) {
354 if (layer) {
355 LAYER_RENDERER_LOGD("Deferring layer destruction, fbo = %d", layer->getFbo());
357 Caches::getInstance().deleteLayerDeferred(layer);
361 void LayerRenderer::flushLayer(Layer* layer) {
363 GLuint fbo = layer->getFbo();
364 if (layer && fbo) {
381 bool LayerRenderer::copyLayer(Layer* layer, SkBitmap* bitmap) {
383 if (layer && bitmap->width() <= caches.maxTextureSize &&
424 float alpha = layer->getAlpha();
425 SkXfermode::Mode mode = layer->getMode();
426 GLuint previousLayerFbo = layer->getFbo();
428 layer->setAlpha(255, SkXfermode::kSrc_Mode);
429 layer->setFbo(fbo);
458 LayerRenderer renderer(layer);
461 bitmap->width(), bitmap->height(), !layer->isBlend());
467 mat4 texTransform(layer->getTexTransform());
472 layer->getTexTransform().multiply(invert);
479 renderer.drawTextureLayer(layer, bounds);
487 layer->getTexTransform().load(texTransform);
494 ALOGD("GL error while copying layer into bitmap = 0x%x", error);
499 layer->setAlpha(alpha, mode);
500 layer->setFbo(previousLayerFbo);