i965: Move some genX infrastructure to genX_boilerplate.h.

This will let us make multiple genX_*.c files, without copy and pasting
all this boilerplate.

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
Kenneth Graunke 2017-11-16 22:37:02 -08:00
parent ecb708fada
commit aa139f0980
4 changed files with 174 additions and 128 deletions

View file

@ -115,42 +115,52 @@ i965_FILES = \
i965_gen4_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen45_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen5_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen6_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen7_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen75_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen8_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen9_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen10_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_gen11_FILES = \
genX_blorp_exec.c \
genX_boilerplate.h \
genX_state_upload.c
i965_oa_GENERATED_FILES = \

View file

@ -0,0 +1,160 @@
/*
* Copyright © 2018 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 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.
*/
#ifndef GENX_BOILERPLATE_H
#define GENX_BOILERPLATE_H
#include <assert.h>
#include "genxml/gen_macros.h"
#include "brw_context.h"
#include "intel_batchbuffer.h"
UNUSED static void *
emit_dwords(struct brw_context *brw, unsigned n)
{
intel_batchbuffer_begin(brw, n);
uint32_t *map = brw->batch.map_next;
brw->batch.map_next += n;
intel_batchbuffer_advance(brw);
return map;
}
struct brw_address {
struct brw_bo *bo;
unsigned reloc_flags;
uint32_t offset;
};
#define __gen_address_type struct brw_address
#define __gen_user_data struct brw_context
static uint64_t
__gen_combine_address(struct brw_context *brw, void *location,
struct brw_address address, uint32_t delta)
{
struct intel_batchbuffer *batch = &brw->batch;
uint32_t offset;
if (address.bo == NULL) {
return address.offset + delta;
} else {
if (GEN_GEN < 6 && brw_ptr_in_state_buffer(batch, location)) {
offset = (char *) location - (char *) brw->batch.state.map;
return brw_state_reloc(batch, offset, address.bo,
address.offset + delta,
address.reloc_flags);
}
assert(!brw_ptr_in_state_buffer(batch, location));
offset = (char *) location - (char *) brw->batch.batch.map;
return brw_batch_reloc(batch, offset, address.bo,
address.offset + delta,
address.reloc_flags);
}
}
UNUSED static struct brw_address
rw_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE,
};
}
UNUSED static struct brw_address
ro_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
};
}
UNUSED static struct brw_address
rw_32_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE | RELOC_32BIT,
};
}
UNUSED static struct brw_address
ro_32_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_32BIT,
};
}
UNUSED static struct brw_address
ggtt_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE | RELOC_NEEDS_GGTT,
};
}
#include "genxml/genX_pack.h"
#define _brw_cmd_length(cmd) cmd ## _length
#define _brw_cmd_length_bias(cmd) cmd ## _length_bias
#define _brw_cmd_header(cmd) cmd ## _header
#define _brw_cmd_pack(cmd) cmd ## _pack
#define brw_batch_emit(brw, cmd, name) \
for (struct cmd name = { _brw_cmd_header(cmd) }, \
*_dst = emit_dwords(brw, _brw_cmd_length(cmd)); \
__builtin_expect(_dst != NULL, 1); \
_brw_cmd_pack(cmd)(brw, (void *)_dst, &name), \
_dst = NULL)
#define brw_batch_emitn(brw, cmd, n, ...) ({ \
uint32_t *_dw = emit_dwords(brw, n); \
struct cmd template = { \
_brw_cmd_header(cmd), \
.DWordLength = n - _brw_cmd_length_bias(cmd), \
__VA_ARGS__ \
}; \
_brw_cmd_pack(cmd)(brw, _dw, &template); \
_dw + 1; /* Array starts at dw[1] */ \
})
#define brw_state_emit(brw, cmd, align, offset, name) \
for (struct cmd name = {}, \
*_dst = brw_state_batch(brw, _brw_cmd_length(cmd) * 4, \
align, offset); \
__builtin_expect(_dst != NULL, 1); \
_brw_cmd_pack(cmd)(brw, (void *)_dst, &name), \
_dst = NULL)
#endif

View file

@ -33,6 +33,8 @@
#include "main/macros.h"
#include "main/state.h"
#include "genX_boilerplate.h"
#include "brw_context.h"
#include "brw_draw.h"
#include "brw_multisample_state.h"
@ -56,100 +58,6 @@
#include "main/viewport.h"
#include "util/half_float.h"
UNUSED static void *
emit_dwords(struct brw_context *brw, unsigned n)
{
intel_batchbuffer_begin(brw, n);
uint32_t *map = brw->batch.map_next;
brw->batch.map_next += n;
intel_batchbuffer_advance(brw);
return map;
}
struct brw_address {
struct brw_bo *bo;
unsigned reloc_flags;
uint32_t offset;
};
#define __gen_address_type struct brw_address
#define __gen_user_data struct brw_context
static uint64_t
__gen_combine_address(struct brw_context *brw, void *location,
struct brw_address address, uint32_t delta)
{
struct intel_batchbuffer *batch = &brw->batch;
uint32_t offset;
if (address.bo == NULL) {
return address.offset + delta;
} else {
if (GEN_GEN < 6 && brw_ptr_in_state_buffer(batch, location)) {
offset = (char *) location - (char *) brw->batch.state.map;
return brw_state_reloc(batch, offset, address.bo,
address.offset + delta,
address.reloc_flags);
}
assert(!brw_ptr_in_state_buffer(batch, location));
offset = (char *) location - (char *) brw->batch.batch.map;
return brw_batch_reloc(batch, offset, address.bo,
address.offset + delta,
address.reloc_flags);
}
}
UNUSED static struct brw_address
rw_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE,
};
}
static struct brw_address
ro_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
};
}
static struct brw_address
rw_32_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE | RELOC_32BIT,
};
}
static struct brw_address
ro_32_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_32BIT,
};
}
UNUSED static struct brw_address
ggtt_bo(struct brw_bo *bo, uint32_t offset)
{
return (struct brw_address) {
.bo = bo,
.offset = offset,
.reloc_flags = RELOC_WRITE | RELOC_NEEDS_GGTT,
};
}
#if GEN_GEN == 4
static struct brw_address
KSP(struct brw_context *brw, uint32_t offset)
@ -164,39 +72,6 @@ KSP(UNUSED struct brw_context *brw, uint32_t offset)
}
#endif
#include "genxml/genX_pack.h"
#define _brw_cmd_length(cmd) cmd ## _length
#define _brw_cmd_length_bias(cmd) cmd ## _length_bias
#define _brw_cmd_header(cmd) cmd ## _header
#define _brw_cmd_pack(cmd) cmd ## _pack
#define brw_batch_emit(brw, cmd, name) \
for (struct cmd name = { _brw_cmd_header(cmd) }, \
*_dst = emit_dwords(brw, _brw_cmd_length(cmd)); \
__builtin_expect(_dst != NULL, 1); \
_brw_cmd_pack(cmd)(brw, (void *)_dst, &name), \
_dst = NULL)
#define brw_batch_emitn(brw, cmd, n, ...) ({ \
uint32_t *_dw = emit_dwords(brw, n); \
struct cmd template = { \
_brw_cmd_header(cmd), \
.DWordLength = n - _brw_cmd_length_bias(cmd), \
__VA_ARGS__ \
}; \
_brw_cmd_pack(cmd)(brw, _dw, &template); \
_dw + 1; /* Array starts at dw[1] */ \
})
#define brw_state_emit(brw, cmd, align, offset, name) \
for (struct cmd name = {}, \
*_dst = brw_state_batch(brw, _brw_cmd_length(cmd) * 4, \
align, offset); \
__builtin_expect(_dst != NULL, 1); \
_brw_cmd_pack(cmd)(brw, (void *)_dst, &name), \
_dst = NULL)
#if GEN_GEN >= 7
MAYBE_UNUSED static void
emit_lrm(struct brw_context *brw, uint32_t reg, struct brw_address addr)

View file

@ -137,7 +137,8 @@ i965_gen_libs = []
foreach v : ['40', '45', '50', '60', '70', '75', '80', '90', '100', '110']
i965_gen_libs += static_library(
'i965_gen@0@'.format(v),
['genX_blorp_exec.c', 'genX_state_upload.c', gen_xml_pack],
['genX_blorp_exec.c', 'genX_boilerplate.h', 'genX_state_upload.c',
gen_xml_pack],
include_directories : [inc_common, inc_intel, inc_dri_common],
c_args : [
c_vis_args, no_override_init_args, c_sse2_args,