i965: Get rid of gen7_cs_state.c
The only thing it was handling was push constants. We pull the actual constant upload code into gen6_constant_state.c and the atoms into genX_state_upload.c. Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
@@ -68,7 +68,6 @@ i965_FILES = \
|
|||||||
gen6_sampler_state.c \
|
gen6_sampler_state.c \
|
||||||
gen6_sol.c \
|
gen6_sol.c \
|
||||||
gen6_urb.c \
|
gen6_urb.c \
|
||||||
gen7_cs_state.c \
|
|
||||||
gen7_l3_state.c \
|
gen7_l3_state.c \
|
||||||
gen7_misc_state.c \
|
gen7_misc_state.c \
|
||||||
gen7_sol_state.c \
|
gen7_sol_state.c \
|
||||||
|
@@ -247,6 +247,11 @@ brw_upload_pull_constants(struct brw_context *brw,
|
|||||||
const struct gl_program *prog,
|
const struct gl_program *prog,
|
||||||
struct brw_stage_state *stage_state,
|
struct brw_stage_state *stage_state,
|
||||||
const struct brw_stage_prog_data *prog_data);
|
const struct brw_stage_prog_data *prog_data);
|
||||||
|
void
|
||||||
|
brw_upload_cs_push_constants(struct brw_context *brw,
|
||||||
|
const struct gl_program *prog,
|
||||||
|
const struct brw_cs_prog_data *cs_prog_data,
|
||||||
|
struct brw_stage_state *stage_state);
|
||||||
|
|
||||||
/* gen7_vs_state.c */
|
/* gen7_vs_state.c */
|
||||||
void
|
void
|
||||||
|
@@ -201,3 +201,77 @@ brw_upload_pull_constants(struct brw_context *brw,
|
|||||||
|
|
||||||
brw->ctx.NewDriverState |= brw_new_constbuf;
|
brw->ctx.NewDriverState |= brw_new_constbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a region containing the push constants for the CS on gen7+.
|
||||||
|
*
|
||||||
|
* Push constants are constant values (such as GLSL uniforms) that are
|
||||||
|
* pre-loaded into a shader stage's register space at thread spawn time.
|
||||||
|
*
|
||||||
|
* For other stages, see brw_curbe.c:brw_upload_constant_buffer for the
|
||||||
|
* equivalent gen4/5 code and gen6_vs_state.c:gen6_upload_push_constants for
|
||||||
|
* gen6+.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
brw_upload_cs_push_constants(struct brw_context *brw,
|
||||||
|
const struct gl_program *prog,
|
||||||
|
const struct brw_cs_prog_data *cs_prog_data,
|
||||||
|
struct brw_stage_state *stage_state)
|
||||||
|
{
|
||||||
|
struct gl_context *ctx = &brw->ctx;
|
||||||
|
const struct brw_stage_prog_data *prog_data =
|
||||||
|
(struct brw_stage_prog_data*) cs_prog_data;
|
||||||
|
|
||||||
|
/* Updates the ParamaterValues[i] pointers for all parameters of the
|
||||||
|
* basic type of PROGRAM_STATE_VAR.
|
||||||
|
*/
|
||||||
|
/* XXX: Should this happen somewhere before to get our state flag set? */
|
||||||
|
_mesa_load_state_parameters(ctx, prog->Parameters);
|
||||||
|
|
||||||
|
if (cs_prog_data->push.total.size == 0) {
|
||||||
|
stage_state->push_const_size = 0;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
gl_constant_value *param = (gl_constant_value*)
|
||||||
|
brw_state_batch(brw, ALIGN(cs_prog_data->push.total.size, 64),
|
||||||
|
64, &stage_state->push_const_offset);
|
||||||
|
assert(param);
|
||||||
|
|
||||||
|
STATIC_ASSERT(sizeof(gl_constant_value) == sizeof(float));
|
||||||
|
|
||||||
|
if (cs_prog_data->push.cross_thread.size > 0) {
|
||||||
|
gl_constant_value *param_copy = param;
|
||||||
|
assert(cs_prog_data->thread_local_id_index < 0 ||
|
||||||
|
cs_prog_data->thread_local_id_index >=
|
||||||
|
cs_prog_data->push.cross_thread.dwords);
|
||||||
|
for (unsigned i = 0;
|
||||||
|
i < cs_prog_data->push.cross_thread.dwords;
|
||||||
|
i++) {
|
||||||
|
param_copy[i] = *prog_data->param[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
gl_constant_value thread_id;
|
||||||
|
if (cs_prog_data->push.per_thread.size > 0) {
|
||||||
|
for (unsigned t = 0; t < cs_prog_data->threads; t++) {
|
||||||
|
unsigned dst =
|
||||||
|
8 * (cs_prog_data->push.per_thread.regs * t +
|
||||||
|
cs_prog_data->push.cross_thread.regs);
|
||||||
|
unsigned src = cs_prog_data->push.cross_thread.dwords;
|
||||||
|
for ( ; src < prog_data->nr_params; src++, dst++) {
|
||||||
|
if (src != cs_prog_data->thread_local_id_index)
|
||||||
|
param[dst] = *prog_data->param[src];
|
||||||
|
else {
|
||||||
|
thread_id.u = t * cs_prog_data->simd_size;
|
||||||
|
param[dst] = thread_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stage_state->push_const_size =
|
||||||
|
cs_prog_data->push.cross_thread.regs +
|
||||||
|
cs_prog_data->push.per_thread.regs;
|
||||||
|
}
|
||||||
|
@@ -1,173 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright © 2015 Intel Corporation
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
||||||
* copy of this software and associated documentation files (the "Software"),
|
|
||||||
* to deal in the Software without restriction, including without limitation
|
|
||||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
* and/or sell copies of the Software, and to permit persons to whom the
|
|
||||||
* Software is furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice (including the next
|
|
||||||
* paragraph) shall be included in all copies or substantial portions of the
|
|
||||||
* Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
||||||
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
||||||
* DEALINGS IN THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "util/ralloc.h"
|
|
||||||
#include "brw_context.h"
|
|
||||||
#include "brw_defines.h"
|
|
||||||
#include "brw_cs.h"
|
|
||||||
#include "brw_wm.h"
|
|
||||||
#include "intel_mipmap_tree.h"
|
|
||||||
#include "intel_batchbuffer.h"
|
|
||||||
#include "brw_state.h"
|
|
||||||
#include "program/prog_statevars.h"
|
|
||||||
#include "compiler/glsl/ir_uniform.h"
|
|
||||||
#include "main/shaderapi.h"
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a region containing the push constants for the CS on gen7+.
|
|
||||||
*
|
|
||||||
* Push constants are constant values (such as GLSL uniforms) that are
|
|
||||||
* pre-loaded into a shader stage's register space at thread spawn time.
|
|
||||||
*
|
|
||||||
* For other stages, see brw_curbe.c:brw_upload_constant_buffer for the
|
|
||||||
* equivalent gen4/5 code and gen6_vs_state.c:gen6_upload_push_constants for
|
|
||||||
* gen6+.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
brw_upload_cs_push_constants(struct brw_context *brw,
|
|
||||||
const struct gl_program *prog,
|
|
||||||
const struct brw_cs_prog_data *cs_prog_data,
|
|
||||||
struct brw_stage_state *stage_state)
|
|
||||||
{
|
|
||||||
struct gl_context *ctx = &brw->ctx;
|
|
||||||
const struct brw_stage_prog_data *prog_data =
|
|
||||||
(struct brw_stage_prog_data*) cs_prog_data;
|
|
||||||
|
|
||||||
/* Updates the ParamaterValues[i] pointers for all parameters of the
|
|
||||||
* basic type of PROGRAM_STATE_VAR.
|
|
||||||
*/
|
|
||||||
/* XXX: Should this happen somewhere before to get our state flag set? */
|
|
||||||
_mesa_load_state_parameters(ctx, prog->Parameters);
|
|
||||||
|
|
||||||
if (cs_prog_data->push.total.size == 0) {
|
|
||||||
stage_state->push_const_size = 0;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
gl_constant_value *param = (gl_constant_value*)
|
|
||||||
brw_state_batch(brw, ALIGN(cs_prog_data->push.total.size, 64),
|
|
||||||
64, &stage_state->push_const_offset);
|
|
||||||
assert(param);
|
|
||||||
|
|
||||||
STATIC_ASSERT(sizeof(gl_constant_value) == sizeof(float));
|
|
||||||
|
|
||||||
if (cs_prog_data->push.cross_thread.size > 0) {
|
|
||||||
gl_constant_value *param_copy = param;
|
|
||||||
assert(cs_prog_data->thread_local_id_index < 0 ||
|
|
||||||
cs_prog_data->thread_local_id_index >=
|
|
||||||
cs_prog_data->push.cross_thread.dwords);
|
|
||||||
for (unsigned i = 0;
|
|
||||||
i < cs_prog_data->push.cross_thread.dwords;
|
|
||||||
i++) {
|
|
||||||
param_copy[i] = *prog_data->param[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
gl_constant_value thread_id;
|
|
||||||
if (cs_prog_data->push.per_thread.size > 0) {
|
|
||||||
for (unsigned t = 0; t < cs_prog_data->threads; t++) {
|
|
||||||
unsigned dst =
|
|
||||||
8 * (cs_prog_data->push.per_thread.regs * t +
|
|
||||||
cs_prog_data->push.cross_thread.regs);
|
|
||||||
unsigned src = cs_prog_data->push.cross_thread.dwords;
|
|
||||||
for ( ; src < prog_data->nr_params; src++, dst++) {
|
|
||||||
if (src != cs_prog_data->thread_local_id_index)
|
|
||||||
param[dst] = *prog_data->param[src];
|
|
||||||
else {
|
|
||||||
thread_id.u = t * cs_prog_data->simd_size;
|
|
||||||
param[dst] = thread_id;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
stage_state->push_const_size =
|
|
||||||
cs_prog_data->push.cross_thread.regs +
|
|
||||||
cs_prog_data->push.per_thread.regs;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
gen7_upload_cs_push_constants(struct brw_context *brw)
|
|
||||||
{
|
|
||||||
struct brw_stage_state *stage_state = &brw->cs.base;
|
|
||||||
|
|
||||||
/* BRW_NEW_COMPUTE_PROGRAM */
|
|
||||||
const struct brw_program *cp =
|
|
||||||
(struct brw_program *) brw->programs[MESA_SHADER_COMPUTE];
|
|
||||||
|
|
||||||
if (cp) {
|
|
||||||
/* BRW_NEW_CS_PROG_DATA */
|
|
||||||
struct brw_cs_prog_data *cs_prog_data =
|
|
||||||
brw_cs_prog_data(brw->cs.base.prog_data);
|
|
||||||
|
|
||||||
_mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_COMPUTE);
|
|
||||||
brw_upload_cs_push_constants(brw, &cp->program, cs_prog_data,
|
|
||||||
stage_state);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct brw_tracked_state gen7_cs_push_constants = {
|
|
||||||
.dirty = {
|
|
||||||
.mesa = _NEW_PROGRAM_CONSTANTS,
|
|
||||||
.brw = BRW_NEW_BATCH |
|
|
||||||
BRW_NEW_BLORP |
|
|
||||||
BRW_NEW_COMPUTE_PROGRAM |
|
|
||||||
BRW_NEW_CS_PROG_DATA,
|
|
||||||
},
|
|
||||||
.emit = gen7_upload_cs_push_constants,
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a new CS constant buffer reflecting the current CS program's
|
|
||||||
* constants, if needed by the CS program.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
brw_upload_cs_pull_constants(struct brw_context *brw)
|
|
||||||
{
|
|
||||||
struct brw_stage_state *stage_state = &brw->cs.base;
|
|
||||||
|
|
||||||
/* BRW_NEW_COMPUTE_PROGRAM */
|
|
||||||
struct brw_program *cp =
|
|
||||||
(struct brw_program *) brw->programs[MESA_SHADER_COMPUTE];
|
|
||||||
|
|
||||||
/* BRW_NEW_CS_PROG_DATA */
|
|
||||||
const struct brw_stage_prog_data *prog_data = brw->cs.base.prog_data;
|
|
||||||
|
|
||||||
_mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_COMPUTE);
|
|
||||||
/* _NEW_PROGRAM_CONSTANTS */
|
|
||||||
brw_upload_pull_constants(brw, BRW_NEW_SURFACES, &cp->program,
|
|
||||||
stage_state, prog_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
const struct brw_tracked_state brw_cs_pull_constants = {
|
|
||||||
.dirty = {
|
|
||||||
.mesa = _NEW_PROGRAM_CONSTANTS,
|
|
||||||
.brw = BRW_NEW_BATCH |
|
|
||||||
BRW_NEW_BLORP |
|
|
||||||
BRW_NEW_COMPUTE_PROGRAM |
|
|
||||||
BRW_NEW_CS_PROG_DATA,
|
|
||||||
},
|
|
||||||
.emit = brw_upload_cs_pull_constants,
|
|
||||||
};
|
|
@@ -4096,6 +4096,70 @@ static const struct brw_tracked_state genX(tcs_push_constants) = {
|
|||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if GEN_GEN >= 7
|
#if GEN_GEN >= 7
|
||||||
|
static void
|
||||||
|
genX(upload_cs_push_constants)(struct brw_context *brw)
|
||||||
|
{
|
||||||
|
struct brw_stage_state *stage_state = &brw->cs.base;
|
||||||
|
|
||||||
|
/* BRW_NEW_COMPUTE_PROGRAM */
|
||||||
|
const struct brw_program *cp =
|
||||||
|
(struct brw_program *) brw->programs[MESA_SHADER_COMPUTE];
|
||||||
|
|
||||||
|
if (cp) {
|
||||||
|
/* BRW_NEW_CS_PROG_DATA */
|
||||||
|
struct brw_cs_prog_data *cs_prog_data =
|
||||||
|
brw_cs_prog_data(brw->cs.base.prog_data);
|
||||||
|
|
||||||
|
_mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_COMPUTE);
|
||||||
|
brw_upload_cs_push_constants(brw, &cp->program, cs_prog_data,
|
||||||
|
stage_state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct brw_tracked_state genX(cs_push_constants) = {
|
||||||
|
.dirty = {
|
||||||
|
.mesa = _NEW_PROGRAM_CONSTANTS,
|
||||||
|
.brw = BRW_NEW_BATCH |
|
||||||
|
BRW_NEW_BLORP |
|
||||||
|
BRW_NEW_COMPUTE_PROGRAM |
|
||||||
|
BRW_NEW_CS_PROG_DATA,
|
||||||
|
},
|
||||||
|
.emit = genX(upload_cs_push_constants),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a new CS constant buffer reflecting the current CS program's
|
||||||
|
* constants, if needed by the CS program.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
genX(upload_cs_pull_constants)(struct brw_context *brw)
|
||||||
|
{
|
||||||
|
struct brw_stage_state *stage_state = &brw->cs.base;
|
||||||
|
|
||||||
|
/* BRW_NEW_COMPUTE_PROGRAM */
|
||||||
|
struct brw_program *cp =
|
||||||
|
(struct brw_program *) brw->programs[MESA_SHADER_COMPUTE];
|
||||||
|
|
||||||
|
/* BRW_NEW_CS_PROG_DATA */
|
||||||
|
const struct brw_stage_prog_data *prog_data = brw->cs.base.prog_data;
|
||||||
|
|
||||||
|
_mesa_shader_write_subroutine_indices(&brw->ctx, MESA_SHADER_COMPUTE);
|
||||||
|
/* _NEW_PROGRAM_CONSTANTS */
|
||||||
|
brw_upload_pull_constants(brw, BRW_NEW_SURFACES, &cp->program,
|
||||||
|
stage_state, prog_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct brw_tracked_state genX(cs_pull_constants) = {
|
||||||
|
.dirty = {
|
||||||
|
.mesa = _NEW_PROGRAM_CONSTANTS,
|
||||||
|
.brw = BRW_NEW_BATCH |
|
||||||
|
BRW_NEW_BLORP |
|
||||||
|
BRW_NEW_COMPUTE_PROGRAM |
|
||||||
|
BRW_NEW_CS_PROG_DATA,
|
||||||
|
},
|
||||||
|
.emit = genX(upload_cs_pull_constants),
|
||||||
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
genX(upload_cs_state)(struct brw_context *brw)
|
genX(upload_cs_state)(struct brw_context *brw)
|
||||||
{
|
{
|
||||||
@@ -5597,8 +5661,8 @@ genX(init_atoms)(struct brw_context *brw)
|
|||||||
{
|
{
|
||||||
&gen7_l3_state,
|
&gen7_l3_state,
|
||||||
&brw_cs_image_surfaces,
|
&brw_cs_image_surfaces,
|
||||||
&gen7_cs_push_constants,
|
&genX(cs_push_constants),
|
||||||
&brw_cs_pull_constants,
|
&genX(cs_pull_constants),
|
||||||
&brw_cs_ubo_surfaces,
|
&brw_cs_ubo_surfaces,
|
||||||
&brw_cs_abo_surfaces,
|
&brw_cs_abo_surfaces,
|
||||||
&brw_cs_texture_surfaces,
|
&brw_cs_texture_surfaces,
|
||||||
|
@@ -88,7 +88,6 @@ files_i965 = files(
|
|||||||
'gen6_sampler_state.c',
|
'gen6_sampler_state.c',
|
||||||
'gen6_sol.c',
|
'gen6_sol.c',
|
||||||
'gen6_urb.c',
|
'gen6_urb.c',
|
||||||
'gen7_cs_state.c',
|
|
||||||
'gen7_l3_state.c',
|
'gen7_l3_state.c',
|
||||||
'gen7_misc_state.c',
|
'gen7_misc_state.c',
|
||||||
'gen7_sol_state.c',
|
'gen7_sol_state.c',
|
||||||
|
Reference in New Issue
Block a user