mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-21 22:20:14 +01:00
mesa: optimize set_varying_vp_inputs by precomputing the conditions
set_varying_vp_inputs is called every draw call, which checks _Maintain*Program. Let's move that checking out of there. This adds a new flag that determines whether set_varying_vp_inputs should do anything. All code that changes _Maintain*Program must now reinitialize the new flag. This is done by new function _mesa_reset_vertex_processing_mode. Reviewed-by: Zoltán Böszörményi <zboszor@gmail.com> Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8798>
This commit is contained in:
parent
4cea48437d
commit
99e25d183d
9 changed files with 33 additions and 14 deletions
|
|
@ -30,6 +30,7 @@
|
|||
#include "main/framebuffer.h"
|
||||
#include "main/extensions.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/state.h"
|
||||
#include "main/version.h"
|
||||
#include "main/vtxfmt.h"
|
||||
#include "intel_chipset.h"
|
||||
|
|
@ -255,6 +256,7 @@ i915CreateContext(int api,
|
|||
ctx->Const.Program[MESA_SHADER_FRAGMENT].MediumInt;
|
||||
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram = true;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
|
||||
/* FINISHME: Are there other options that should be enabled for software
|
||||
* FINISHME: vertex shaders?
|
||||
|
|
|
|||
|
|
@ -1127,6 +1127,7 @@ brwCreateContext(gl_api api,
|
|||
|
||||
ctx->VertexProgram._MaintainTnlProgram = true;
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram = true;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
|
||||
brw_draw_init( brw );
|
||||
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@
|
|||
#include "main/framebuffer.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/renderbuffer.h"
|
||||
#include "main/state.h"
|
||||
#include "main/teximage.h"
|
||||
#include "main/version.h"
|
||||
#include "main/vtxfmt.h"
|
||||
|
|
@ -920,6 +921,7 @@ XMesaContext XMesaCreateContext( XMesaVisual v, XMesaContext share_list )
|
|||
if (0) {
|
||||
mesaCtx->VertexProgram._MaintainTnlProgram = GL_TRUE;
|
||||
mesaCtx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
}
|
||||
|
||||
_mesa_enable_sw_extensions(mesaCtx);
|
||||
|
|
|
|||
|
|
@ -1247,6 +1247,7 @@ _mesa_initialize_context(struct gl_context *ctx,
|
|||
if (ctx->VertexProgram._MaintainTnlProgram) {
|
||||
/* this is required... */
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
}
|
||||
|
||||
/* Mesa core handles all the formats that mesa core knows about.
|
||||
|
|
@ -1287,6 +1288,7 @@ _mesa_initialize_context(struct gl_context *ctx,
|
|||
case API_OPENGLES2:
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
|
||||
ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2382,6 +2382,8 @@ struct gl_vertex_program_state
|
|||
|
||||
GLboolean _Overriden;
|
||||
|
||||
bool _VPModeOptimizesConstantAttribs;
|
||||
|
||||
/**
|
||||
* If we have a vertex program, a TNL program or no program at all.
|
||||
* Note that this value should be kept up to date all the time,
|
||||
|
|
|
|||
|
|
@ -571,19 +571,8 @@ _mesa_update_state( struct gl_context *ctx )
|
|||
static void
|
||||
set_varying_vp_inputs(struct gl_context *ctx, GLbitfield varying_inputs)
|
||||
{
|
||||
/*
|
||||
* The gl_context::varying_vp_inputs value is only used when in
|
||||
* VP_MODE_FF mode.
|
||||
*/
|
||||
if (VP_MODE_FF != ctx->VertexProgram._VPMode)
|
||||
return;
|
||||
|
||||
/* Only fixed-func generated programs ever uses varying_vp_inputs. */
|
||||
if (!ctx->VertexProgram._MaintainTnlProgram &&
|
||||
!ctx->FragmentProgram._MaintainTexEnvProgram)
|
||||
return;
|
||||
|
||||
if (ctx->varying_vp_inputs != varying_inputs) {
|
||||
if (ctx->VertexProgram._VPModeOptimizesConstantAttribs &&
|
||||
ctx->varying_vp_inputs != varying_inputs) {
|
||||
ctx->varying_vp_inputs = varying_inputs;
|
||||
ctx->NewState |= _NEW_VARYING_VP_INPUTS;
|
||||
}
|
||||
|
|
@ -622,6 +611,14 @@ set_vertex_processing_mode(struct gl_context *ctx, gl_vertex_processing_mode m)
|
|||
/* Finally memorize the value */
|
||||
ctx->VertexProgram._VPMode = m;
|
||||
|
||||
/* The gl_context::varying_vp_inputs value is only used when in
|
||||
* VP_MODE_FF mode and the fixed-func pipeline is emulated by shaders.
|
||||
*/
|
||||
ctx->VertexProgram._VPModeOptimizesConstantAttribs =
|
||||
m == VP_MODE_FF &&
|
||||
ctx->VertexProgram._MaintainTnlProgram &&
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram;
|
||||
|
||||
/* Since we only track the varying inputs while being in fixed function
|
||||
* vertex processing mode, we may need to recheck for the
|
||||
* _NEW_VARYING_VP_INPUTS bit.
|
||||
|
|
@ -649,6 +646,13 @@ _mesa_update_vertex_processing_mode(struct gl_context *ctx)
|
|||
}
|
||||
|
||||
|
||||
void
|
||||
_mesa_reset_vertex_processing_mode(struct gl_context *ctx)
|
||||
{
|
||||
ctx->VertexProgram._VPMode = -1; /* force the update */
|
||||
_mesa_update_vertex_processing_mode(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the _DrawVAO and the net enabled arrays.
|
||||
* The vao->_Enabled bitmask is transformed due to position/generic0
|
||||
|
|
|
|||
|
|
@ -54,6 +54,9 @@ _mesa_set_vp_override(struct gl_context *ctx, GLboolean flag);
|
|||
extern void
|
||||
_mesa_update_vertex_processing_mode(struct gl_context *ctx);
|
||||
|
||||
extern void
|
||||
_mesa_reset_vertex_processing_mode(struct gl_context *ctx);
|
||||
|
||||
|
||||
/**
|
||||
* Set the _DrawVAO and the net enabled arrays.
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@
|
|||
#include "main/hash.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/shaderobj.h"
|
||||
#include "main/state.h"
|
||||
#include "program.h"
|
||||
#include "prog_cache.h"
|
||||
#include "prog_parameter.h"
|
||||
|
|
@ -100,7 +101,7 @@ _mesa_init_program(struct gl_context *ctx)
|
|||
ctx->Shared->DefaultFragmentProgram);
|
||||
assert(ctx->FragmentProgram.Current);
|
||||
ctx->FragmentProgram.Cache = _mesa_new_program_cache();
|
||||
ctx->VertexProgram._VPMode = VP_MODE_FF;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
|
||||
/* XXX probably move this stuff */
|
||||
ctx->ATIFragmentShader.Enabled = GL_FALSE;
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@
|
|||
#include "main/glthread.h"
|
||||
#include "main/samplerobj.h"
|
||||
#include "main/shaderobj.h"
|
||||
#include "main/state.h"
|
||||
#include "main/version.h"
|
||||
#include "main/vtxfmt.h"
|
||||
#include "main/hash.h"
|
||||
|
|
@ -649,6 +650,7 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe,
|
|||
*/
|
||||
ctx->FragmentProgram._MaintainTexEnvProgram = GL_TRUE;
|
||||
ctx->VertexProgram._MaintainTnlProgram = GL_TRUE;
|
||||
_mesa_reset_vertex_processing_mode(ctx);
|
||||
|
||||
if (no_error)
|
||||
ctx->Const.ContextFlags |= GL_CONTEXT_FLAG_NO_ERROR_BIT_KHR;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue