8f9151303d
Since _cogl_pipeline_update_blend_enable() can sometimes show up quite high in profiles; instead of calling _cogl_pipeline_update_blend_enable() whenever we change pipeline state that may affect blending we now just set a dirty flag and when we flush a pipeline we check this dirty flag and lazily calculate whether blender really needs to be enabled if it's set. Since it turns out we were too optimistic in assuming most GL drivers would recognize blending with ADD(src,0) is equivalent to disabling GL_BLEND we now check this case ourselves so we can always explicitly disable GL_BLEND if we know we don't need blending. This introduces the idea of an 'unknown_color_alpha' boolean to the pipeline flush code which is set whenever we can't guarantee that the color attribute is opaque. For example this is set whenever a user specifies a color attribute with 4 components when drawing a primitive. This boolean needs to be cached along with every pipeline because pipeline::real_blend_enabled depends on this and so we need to also call _cogl_pipeline_update_blend_enable() if the status of this changes. Incidentally with this patch we now no longer ever use _cogl_pipeline_set_blend_enable() internally. For now the internal api hasn't been removed though since we might want to consider re-purposing it as a public api since it will now not conflict with our own internal state tracking and could provide a more convenient way to disable blending than setting a blend string. Reviewed-by: Neil Roberts <neil@linux.intel.com> (cherry picked from commit ab2ae18f3207514c91fa6fd9f2d3f2ed93a86497)
134 lines
3.7 KiB
C
134 lines
3.7 KiB
C
/*
|
|
* Cogl
|
|
*
|
|
* An object oriented GL/GLES Abstraction/Utility Layer
|
|
*
|
|
* Copyright (C) 2010 Intel Corporation.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library. If not, see
|
|
* <http://www.gnu.org/licenses/>.
|
|
*
|
|
*
|
|
*
|
|
* Authors:
|
|
* Robert Bragg <robert@linux.intel.com>
|
|
*/
|
|
|
|
#ifndef __COGL_ATTRIBUTE_PRIVATE_H
|
|
#define __COGL_ATTRIBUTE_PRIVATE_H
|
|
|
|
#include "cogl-object-private.h"
|
|
#include "cogl-attribute.h"
|
|
#include "cogl-framebuffer.h"
|
|
#include "cogl-pipeline-private.h"
|
|
#include "cogl-boxed-value.h"
|
|
|
|
typedef enum
|
|
{
|
|
COGL_ATTRIBUTE_NAME_ID_POSITION_ARRAY,
|
|
COGL_ATTRIBUTE_NAME_ID_COLOR_ARRAY,
|
|
COGL_ATTRIBUTE_NAME_ID_TEXTURE_COORD_ARRAY,
|
|
COGL_ATTRIBUTE_NAME_ID_NORMAL_ARRAY,
|
|
COGL_ATTRIBUTE_NAME_ID_CUSTOM_ARRAY
|
|
} CoglAttributeNameID;
|
|
|
|
typedef struct _CoglAttributeNameState
|
|
{
|
|
char *name;
|
|
CoglAttributeNameID name_id;
|
|
int name_index;
|
|
CoglBool normalized_default;
|
|
int layer_number;
|
|
} CoglAttributeNameState;
|
|
|
|
struct _CoglAttribute
|
|
{
|
|
CoglObject _parent;
|
|
|
|
const CoglAttributeNameState *name_state;
|
|
CoglBool normalized;
|
|
|
|
CoglBool is_buffered;
|
|
|
|
union {
|
|
struct {
|
|
CoglAttributeBuffer *attribute_buffer;
|
|
size_t stride;
|
|
size_t offset;
|
|
int n_components;
|
|
CoglAttributeType type;
|
|
} buffered;
|
|
struct {
|
|
CoglContext *context;
|
|
CoglBoxedValue boxed;
|
|
} constant;
|
|
} d;
|
|
|
|
int immutable_ref;
|
|
};
|
|
|
|
typedef enum
|
|
{
|
|
COGL_DRAW_SKIP_JOURNAL_FLUSH = 1 << 0,
|
|
COGL_DRAW_SKIP_PIPELINE_VALIDATION = 1 << 1,
|
|
COGL_DRAW_SKIP_FRAMEBUFFER_FLUSH = 1 << 2,
|
|
COGL_DRAW_SKIP_LEGACY_STATE = 1 << 3,
|
|
/* By default the vertex attribute drawing code will assume that if
|
|
there is a color attribute array enabled then we can't determine
|
|
if the colors will be opaque so we need to enabling
|
|
blending. However when drawing from the journal we know what the
|
|
contents of the color array is so we can override this by passing
|
|
this flag. */
|
|
COGL_DRAW_COLOR_ATTRIBUTE_IS_OPAQUE = 1 << 4,
|
|
/* This forcibly disables the debug option to divert all drawing to
|
|
* wireframes */
|
|
COGL_DRAW_SKIP_DEBUG_WIREFRAME = 1 << 5
|
|
} CoglDrawFlags;
|
|
|
|
/* During CoglContext initialization we register the "cogl_color_in"
|
|
* attribute name so it gets a global name_index of 0. We need to know
|
|
* the name_index for "cogl_color_in" in
|
|
* _cogl_pipeline_flush_gl_state() */
|
|
#define COGL_ATTRIBUTE_COLOR_NAME_INDEX 0
|
|
|
|
CoglAttributeNameState *
|
|
_cogl_attribute_register_attribute_name (CoglContext *context,
|
|
const char *name);
|
|
|
|
CoglAttribute *
|
|
_cogl_attribute_immutable_ref (CoglAttribute *attribute);
|
|
|
|
void
|
|
_cogl_attribute_immutable_unref (CoglAttribute *attribute);
|
|
|
|
typedef struct
|
|
{
|
|
int unit;
|
|
CoglPipelineFlushOptions options;
|
|
uint32_t fallback_layers;
|
|
} CoglFlushLayerState;
|
|
|
|
void
|
|
_cogl_flush_attributes_state (CoglFramebuffer *framebuffer,
|
|
CoglPipeline *pipeline,
|
|
CoglDrawFlags flags,
|
|
CoglAttribute **attributes,
|
|
int n_attributes);
|
|
|
|
int
|
|
_cogl_attribute_get_n_components (CoglAttribute *attribute);
|
|
|
|
#endif /* __COGL_ATTRIBUTE_PRIVATE_H */
|
|
|