mirror of
https://github.com/tiagovignatti/intel-gpu-tools.git
synced 2025-06-22 15:26:21 +00:00
tools/null_state_gen: build cmd and state space separately
Instead of building batch directly to memory, build into cmd and state arrays. This representation allows us more flexibility in batch state expression and batch generation/relocation. As a bonus, we can also attach the line information that produced the batch data to help debugging. There is no change in the output states produced. This can be considered as a preparatory patch to help introduce gen8 golden state. Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
This commit is contained in:
parent
b77145dd48
commit
4a604dee60
@ -29,145 +29,248 @@
|
||||
**************************************************************************/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include "intel_batchbuffer.h"
|
||||
|
||||
int intel_batch_reset(struct intel_batchbuffer *batch,
|
||||
void *p,
|
||||
uint32_t size,
|
||||
uint32_t off)
|
||||
void bb_area_emit(struct bb_area *a, uint32_t dword, item_type type, const char *str)
|
||||
{
|
||||
batch->err = -EINVAL;
|
||||
batch->base = batch->base_ptr = p;
|
||||
batch->state_base = batch->state_ptr = p;
|
||||
struct bb_item *item;
|
||||
assert(a != NULL);
|
||||
assert(a->num_items < MAX_ITEMS);
|
||||
item = &a->item[a->num_items];
|
||||
|
||||
if (off >= size || ALIGN(off, 4) != off)
|
||||
return -EINVAL;
|
||||
item->data = dword;
|
||||
item->type = type;
|
||||
strncpy(item->str, str, MAX_STRLEN);
|
||||
item->str[MAX_STRLEN - 1] = 0;
|
||||
|
||||
batch->size = size;
|
||||
|
||||
batch->state_base = batch->state_ptr = &batch->base[off];
|
||||
|
||||
batch->num_relocs = 0;
|
||||
batch->err = 0;
|
||||
|
||||
return batch->err;
|
||||
a->num_items++;
|
||||
}
|
||||
|
||||
uint32_t intel_batch_state_used(struct intel_batchbuffer *batch)
|
||||
void bb_area_emit_offset(struct bb_area *a, unsigned offset, uint32_t dword, item_type type, const char *str)
|
||||
{
|
||||
return batch->state_ptr - batch->state_base;
|
||||
const unsigned i = offset / 4;
|
||||
struct bb_item *item;
|
||||
assert(a != NULL);
|
||||
assert(a->num_items < MAX_ITEMS);
|
||||
assert(i < a->num_items);
|
||||
item = &a->item[i];
|
||||
|
||||
item->data = dword;
|
||||
item->type = type;
|
||||
strncpy(item->str, str, MAX_STRLEN);
|
||||
item->str[MAX_STRLEN - 1] = 0;
|
||||
}
|
||||
|
||||
uint32_t intel_batch_state_offset(struct intel_batchbuffer *batch)
|
||||
static struct bb_item *bb_area_get(struct bb_area *a, unsigned i)
|
||||
{
|
||||
return batch->state_ptr - batch->base;
|
||||
assert (i < a->num_items);
|
||||
return &a->item[i];
|
||||
}
|
||||
|
||||
void *intel_batch_state_alloc(struct intel_batchbuffer *batch,
|
||||
uint32_t size,
|
||||
uint32_t align)
|
||||
static unsigned bb_area_items(struct bb_area *a)
|
||||
{
|
||||
uint32_t cur;
|
||||
uint32_t offset;
|
||||
return a->num_items;
|
||||
}
|
||||
|
||||
if (batch->err)
|
||||
static unsigned long bb_area_used(struct bb_area *a)
|
||||
{
|
||||
assert(a != NULL);
|
||||
assert(a->num_items <= MAX_ITEMS);
|
||||
|
||||
return a->num_items * 4;
|
||||
}
|
||||
|
||||
static unsigned long bb_area_room(struct bb_area *a)
|
||||
{
|
||||
assert (a != NULL);
|
||||
assert (a->num_items <= MAX_ITEMS);
|
||||
|
||||
return (MAX_ITEMS - a->num_items) * 4;
|
||||
}
|
||||
|
||||
struct intel_batchbuffer *intel_batchbuffer_create(void)
|
||||
{
|
||||
struct intel_batchbuffer *batch;
|
||||
|
||||
batch = calloc(1, sizeof(*batch));
|
||||
if (batch == NULL)
|
||||
return NULL;
|
||||
|
||||
cur = intel_batch_state_offset(batch);
|
||||
offset = ALIGN(cur, align);
|
||||
|
||||
if (offset + size > batch->size) {
|
||||
batch->err = -ENOSPC;
|
||||
batch->cmds = calloc(1, sizeof(struct bb_area));
|
||||
if (batch->cmds == NULL) {
|
||||
free(batch);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
batch->state_ptr = batch->base + offset + size;
|
||||
|
||||
memset(batch->base + cur, 0, size);
|
||||
|
||||
return batch->base + offset;
|
||||
}
|
||||
|
||||
int intel_batch_offset(struct intel_batchbuffer *batch, const void *ptr)
|
||||
{
|
||||
return (uint8_t *)ptr - batch->base;
|
||||
}
|
||||
|
||||
int intel_batch_state_copy(struct intel_batchbuffer *batch,
|
||||
const void *ptr,
|
||||
const uint32_t size,
|
||||
const uint32_t align)
|
||||
{
|
||||
void * const p = intel_batch_state_alloc(batch, size, align);
|
||||
|
||||
if (p == NULL)
|
||||
return -1;
|
||||
|
||||
return intel_batch_offset(batch, memcpy(p, ptr, size));
|
||||
}
|
||||
|
||||
uint32_t intel_batch_cmds_used(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return batch->base_ptr - batch->base;
|
||||
}
|
||||
|
||||
uint32_t intel_batch_total_used(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return batch->state_ptr - batch->base;
|
||||
}
|
||||
|
||||
static uint32_t intel_batch_space(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return batch->state_base - batch->base_ptr;
|
||||
}
|
||||
|
||||
int intel_batch_emit_dword(struct intel_batchbuffer *batch, uint32_t dword)
|
||||
{
|
||||
uint32_t offset;
|
||||
|
||||
if (batch->err)
|
||||
return -1;
|
||||
|
||||
if (intel_batch_space(batch) < 4) {
|
||||
batch->err = -ENOSPC;
|
||||
return -1;
|
||||
batch->state = calloc(1, sizeof(struct bb_area));
|
||||
if (batch->state == NULL) {
|
||||
free(batch->cmds);
|
||||
free(batch);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
offset = intel_batch_offset(batch, batch->base_ptr);
|
||||
batch->state_start_offset = -1;
|
||||
batch->cmds_end_offset = -1;
|
||||
|
||||
*(uint32_t *) (batch->base_ptr) = dword;
|
||||
batch->base_ptr += 4;
|
||||
return batch;
|
||||
}
|
||||
|
||||
static void bb_area_align(struct bb_area *a, unsigned align)
|
||||
{
|
||||
if (align == 0)
|
||||
return;
|
||||
|
||||
assert((align % 4) == 0);
|
||||
|
||||
while ((a->num_items * 4) % align != 0)
|
||||
bb_area_emit(a, 0, PAD, "align pad");
|
||||
}
|
||||
|
||||
static int reloc_exists(struct intel_batchbuffer *batch, uint32_t offset)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < batch->cmds->num_items; i++)
|
||||
if ((batch->cmds->item[i].type == RELOC ||
|
||||
batch->cmds->item[i].type == RELOC_STATE) &&
|
||||
i * 4 == offset)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int intel_batch_is_reloc(struct intel_batchbuffer *batch, unsigned i)
|
||||
{
|
||||
return reloc_exists(batch, i * 4);
|
||||
}
|
||||
|
||||
static void intel_batch_cmd_align(struct intel_batchbuffer *batch, unsigned align)
|
||||
{
|
||||
bb_area_align(batch->cmds, align);
|
||||
}
|
||||
|
||||
static void intel_batch_state_align(struct intel_batchbuffer *batch, unsigned align)
|
||||
{
|
||||
bb_area_align(batch->state, align);
|
||||
}
|
||||
|
||||
unsigned intel_batch_num_cmds(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return bb_area_items(batch->cmds);
|
||||
}
|
||||
|
||||
static unsigned intel_batch_num_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return bb_area_items(batch->state);
|
||||
}
|
||||
|
||||
struct bb_item *intel_batch_cmd_get(struct intel_batchbuffer *batch, unsigned i)
|
||||
{
|
||||
return bb_area_get(batch->cmds, i);
|
||||
}
|
||||
|
||||
struct bb_item *intel_batch_state_get(struct intel_batchbuffer *batch, unsigned i)
|
||||
{
|
||||
return bb_area_get(batch->state, i);
|
||||
}
|
||||
|
||||
uint32_t intel_batch_state_offset(struct intel_batchbuffer *batch, unsigned align)
|
||||
{
|
||||
intel_batch_state_align(batch, align);
|
||||
return bb_area_used(batch->state);
|
||||
}
|
||||
|
||||
uint32_t intel_batch_state_alloc(struct intel_batchbuffer *batch, unsigned bytes, unsigned align,
|
||||
const char *str)
|
||||
{
|
||||
unsigned offset;
|
||||
unsigned dwords = bytes/4;
|
||||
assert ((bytes % 4) == 0);
|
||||
assert (bb_area_room(batch->state) >= bytes);
|
||||
|
||||
offset = intel_batch_state_offset(batch, align);
|
||||
|
||||
while (dwords--)
|
||||
bb_area_emit(batch->state, 0, UNINITIALIZED, str);
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
int intel_batch_emit_reloc(struct intel_batchbuffer *batch,
|
||||
const uint32_t delta)
|
||||
uint32_t intel_batch_state_copy(struct intel_batchbuffer *batch,
|
||||
void *d, unsigned bytes,
|
||||
unsigned align,
|
||||
const char *str)
|
||||
{
|
||||
uint32_t offset;
|
||||
unsigned offset;
|
||||
unsigned i;
|
||||
unsigned dwords = bytes/4;
|
||||
assert (d);
|
||||
assert ((bytes % 4) == 0);
|
||||
assert (bb_area_room(batch->state) >= bytes);
|
||||
|
||||
if (batch->err)
|
||||
return -1;
|
||||
offset = intel_batch_state_offset(batch, align);
|
||||
|
||||
if (delta >= batch->size) {
|
||||
batch->err = -EINVAL;
|
||||
return -1;
|
||||
for (i = 0; i < dwords; i++) {
|
||||
char offsetinside[80];
|
||||
sprintf(offsetinside, "%s: 0x%x", str, i * 4);
|
||||
|
||||
uint32_t *s = (uint32_t *)(uint8_t *)d + i;
|
||||
bb_area_emit(batch->state, *s, STATE, offsetinside);
|
||||
}
|
||||
|
||||
offset = intel_batch_emit_dword(batch, delta);
|
||||
|
||||
if (batch->err)
|
||||
return -1;
|
||||
|
||||
if (batch->num_relocs >= MAX_RELOCS) {
|
||||
batch->err = -ENOSPC;
|
||||
return -1;
|
||||
}
|
||||
|
||||
batch->relocs[batch->num_relocs++] = offset;
|
||||
|
||||
return offset;
|
||||
}
|
||||
|
||||
void intel_batch_relocate_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
assert (batch->state_start_offset == -1);
|
||||
|
||||
batch->cmds_end_offset = bb_area_used(batch->cmds) - 4;
|
||||
|
||||
/* Hardcoded, could track max align done also */
|
||||
intel_batch_cmd_align(batch, 64);
|
||||
|
||||
batch->state_start_offset = bb_area_used(batch->cmds);
|
||||
|
||||
for (i = 0; i < bb_area_items(batch->state); i++) {
|
||||
const struct bb_item *s = bb_area_get(batch->state, i);
|
||||
|
||||
bb_area_emit(batch->cmds, s->data, s->type, s->str);
|
||||
}
|
||||
|
||||
for (i = 0; i < bb_area_items(batch->cmds); i++) {
|
||||
struct bb_item *s = bb_area_get(batch->cmds, i);
|
||||
|
||||
if (s->type == STATE_OFFSET || s->type == RELOC_STATE)
|
||||
s->data += batch->state_start_offset;
|
||||
}
|
||||
}
|
||||
|
||||
const char *intel_batch_type_as_str(const struct bb_item *item)
|
||||
{
|
||||
switch (item->type) {
|
||||
case UNINITIALIZED:
|
||||
return "UNINITIALIZED";
|
||||
case CMD:
|
||||
return "CMD";
|
||||
case STATE:
|
||||
return "STATE";
|
||||
case PAD:
|
||||
return "PAD";
|
||||
case RELOC:
|
||||
return "RELOC";
|
||||
case RELOC_STATE:
|
||||
return "RELOC_STATE";
|
||||
case STATE_OFFSET:
|
||||
return "STATE_OFFSET";
|
||||
}
|
||||
|
||||
return "UNKNOWN";
|
||||
}
|
||||
|
@ -34,58 +34,64 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#define MAX_RELOCS 64
|
||||
#define MAX_ITEMS 4096
|
||||
#define MAX_STRLEN 256
|
||||
|
||||
#define ALIGN(x, y) (((x) + (y)-1) & ~((y)-1))
|
||||
|
||||
struct intel_batchbuffer {
|
||||
int err;
|
||||
uint8_t *base;
|
||||
uint8_t *base_ptr;
|
||||
uint8_t *state_base;
|
||||
uint8_t *state_ptr;
|
||||
int size;
|
||||
typedef enum {
|
||||
UNINITIALIZED,
|
||||
CMD,
|
||||
STATE,
|
||||
RELOC,
|
||||
RELOC_STATE,
|
||||
STATE_OFFSET,
|
||||
PAD,
|
||||
} item_type;
|
||||
|
||||
uint32_t relocs[MAX_RELOCS];
|
||||
uint32_t num_relocs;
|
||||
struct bb_item {
|
||||
uint32_t data;
|
||||
item_type type;
|
||||
char str[MAX_STRLEN];
|
||||
};
|
||||
|
||||
#define OUT_BATCH(d) intel_batch_emit_dword(batch, d)
|
||||
#define OUT_RELOC(batch, read_domains, write_domain, delta) \
|
||||
intel_batch_emit_reloc(batch, delta)
|
||||
struct bb_area {
|
||||
struct bb_item item[MAX_ITEMS];
|
||||
unsigned long num_items;
|
||||
};
|
||||
|
||||
int intel_batch_reset(struct intel_batchbuffer *batch,
|
||||
void *p,
|
||||
uint32_t size, uint32_t split_off);
|
||||
struct intel_batchbuffer {
|
||||
struct bb_area *cmds;
|
||||
struct bb_area *state;
|
||||
unsigned long cmds_end_offset;
|
||||
unsigned long state_start_offset;
|
||||
};
|
||||
|
||||
uint32_t intel_batch_state_used(struct intel_batchbuffer *batch);
|
||||
struct intel_batchbuffer *intel_batchbuffer_create(void);
|
||||
|
||||
void *intel_batch_state_alloc(struct intel_batchbuffer *batch,
|
||||
uint32_t size,
|
||||
uint32_t align);
|
||||
#define OUT_BATCH(d) bb_area_emit(batch->cmds, d, CMD, #d)
|
||||
#define OUT_BATCH_STATE_OFFSET(d) bb_area_emit(batch->cmds, d, STATE_OFFSET, #d)
|
||||
#define OUT_RELOC(batch, read_domain, write_domain, d) bb_area_emit(batch->cmds, d, RELOC, #d)
|
||||
#define OUT_RELOC_STATE(batch, read_domain, write_domain, d) bb_area_emit(batch->cmds, d, RELOC_STATE, #d);
|
||||
#define OUT_STATE(d) bb_area_emit(batch->state, d, STATE, #d)
|
||||
#define OUT_STATE_OFFSET(offset) bb_area_emit(batch->state, offset, STATE_OFFSET, #offset)
|
||||
#define OUT_STATE_STRUCT(name, align) intel_batch_state_copy(batch, &name, sizeof(name), align, #name " " #align)
|
||||
|
||||
int intel_batch_offset(struct intel_batchbuffer *batch, const void *ptr);
|
||||
uint32_t intel_batch_state_copy(struct intel_batchbuffer *batch, void *d, unsigned bytes, unsigned align,
|
||||
const char *name);
|
||||
uint32_t intel_batch_state_alloc(struct intel_batchbuffer *batch, unsigned bytes, unsigned align,
|
||||
const char *name);
|
||||
|
||||
int intel_batch_state_copy(struct intel_batchbuffer *batch,
|
||||
const void *ptr,
|
||||
const uint32_t size,
|
||||
const uint32_t align);
|
||||
unsigned intel_batch_num_cmds(struct intel_batchbuffer *batch);
|
||||
|
||||
uint32_t intel_batch_cmds_used(struct intel_batchbuffer *batch);
|
||||
struct bb_item *intel_batch_cmd_get(struct intel_batchbuffer *batch, unsigned i);
|
||||
int intel_batch_is_reloc(struct intel_batchbuffer *batch, unsigned i);
|
||||
|
||||
int intel_batch_emit_dword(struct intel_batchbuffer *batch, uint32_t dword);
|
||||
void intel_batch_relocate_state(struct intel_batchbuffer *batch);
|
||||
|
||||
int intel_batch_emit_reloc(struct intel_batchbuffer *batch,
|
||||
const uint32_t delta);
|
||||
const char *intel_batch_type_as_str(const struct bb_item *item);
|
||||
|
||||
uint32_t intel_batch_total_used(struct intel_batchbuffer *batch);
|
||||
|
||||
static inline int intel_batch_error(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return batch->err;
|
||||
}
|
||||
|
||||
static inline uint32_t intel_batch_state_start(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return batch->state_base - batch->base;
|
||||
}
|
||||
void bb_area_emit(struct bb_area *a, uint32_t dword, item_type type, const char *str);
|
||||
void bb_area_emit_offset(struct bb_area *a, unsigned i, uint32_t dword, item_type type, const char *str);
|
||||
|
||||
#endif
|
||||
|
@ -11,6 +11,8 @@ extern int gen6_setup_null_render_state(struct intel_batchbuffer *batch);
|
||||
extern int gen7_setup_null_render_state(struct intel_batchbuffer *batch);
|
||||
extern int gen8_setup_null_render_state(struct intel_batchbuffer *batch);
|
||||
|
||||
static int debug = 0;
|
||||
|
||||
static void print_usage(char *s)
|
||||
{
|
||||
fprintf(stderr, "%s: <gen>\n"
|
||||
@ -18,17 +20,6 @@ static void print_usage(char *s)
|
||||
s);
|
||||
}
|
||||
|
||||
static int is_reloc(struct intel_batchbuffer *batch, uint32_t offset)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < batch->num_relocs; i++)
|
||||
if (batch->relocs[i] == offset)
|
||||
return 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int print_state(int gen, struct intel_batchbuffer *batch)
|
||||
{
|
||||
int i;
|
||||
@ -36,33 +27,37 @@ static int print_state(int gen, struct intel_batchbuffer *batch)
|
||||
printf("#include \"intel_renderstate.h\"\n\n");
|
||||
|
||||
printf("static const u32 gen%d_null_state_relocs[] = {\n", gen);
|
||||
for (i = 0; i < batch->num_relocs; i++) {
|
||||
printf("\t0x%08x,\n", batch->relocs[i]);
|
||||
for (i = 0; i < batch->cmds->num_items; i++) {
|
||||
if (intel_batch_is_reloc(batch, i))
|
||||
printf("\t0x%08x,\n", i * 4);
|
||||
}
|
||||
printf("\t%d,\n", -1);
|
||||
printf("};\n\n");
|
||||
|
||||
printf("static const u32 gen%d_null_state_batch[] = {\n", gen);
|
||||
for (i = 0; i < batch->size; i += 4) {
|
||||
const uint32_t *p = (void *)batch->base + i;
|
||||
printf("\t0x%08x,", *p);
|
||||
for (i = 0; i < intel_batch_num_cmds(batch); i++) {
|
||||
const struct bb_item *cmd = intel_batch_cmd_get(batch, i);
|
||||
printf("\t0x%08x,", cmd->data);
|
||||
|
||||
if (i == intel_batch_cmds_used(batch) - 4)
|
||||
if (debug)
|
||||
printf("\t /* 0x%08x %s '%s' */", i * 4,
|
||||
intel_batch_type_as_str(cmd), cmd->str);
|
||||
|
||||
if (i * 4 == batch->cmds_end_offset)
|
||||
printf("\t /* cmds end */");
|
||||
|
||||
if (i == intel_batch_state_start(batch))
|
||||
if (intel_batch_is_reloc(batch, i))
|
||||
printf("\t /* reloc */");
|
||||
|
||||
if (i * 4 == batch->state_start_offset)
|
||||
printf("\t /* state start */");
|
||||
|
||||
|
||||
if (i == intel_batch_state_start(batch) +
|
||||
intel_batch_state_used(batch) - 4)
|
||||
if (i == intel_batch_num_cmds(batch) - 1)
|
||||
printf("\t /* state end */");
|
||||
|
||||
if (is_reloc(batch, i))
|
||||
printf("\t /* reloc */");
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("};\n\nRO_RENDERSTATE(%d);\n", gen);
|
||||
|
||||
return 0;
|
||||
@ -70,23 +65,14 @@ static int print_state(int gen, struct intel_batchbuffer *batch)
|
||||
|
||||
static int do_generate(int gen)
|
||||
{
|
||||
int initial_size = 8192;
|
||||
struct intel_batchbuffer batch;
|
||||
void *p;
|
||||
struct intel_batchbuffer *batch;
|
||||
int ret = -EINVAL;
|
||||
uint32_t cmd_len, state_len, size;
|
||||
int (*null_state_gen)(struct intel_batchbuffer *batch) = NULL;
|
||||
|
||||
p = malloc(initial_size);
|
||||
if (p == NULL)
|
||||
batch = intel_batchbuffer_create();
|
||||
if (batch == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
assert(ALIGN(initial_size/2, STATE_ALIGN) == initial_size/2);
|
||||
|
||||
ret = intel_batch_reset(&batch, p, initial_size, initial_size/2);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
switch (gen) {
|
||||
case 6:
|
||||
null_state_gen = gen6_setup_null_render_state;
|
||||
@ -103,50 +89,26 @@ static int do_generate(int gen)
|
||||
|
||||
if (null_state_gen == NULL) {
|
||||
printf("no generator found for %d\n", gen);
|
||||
ret = -EINVAL;
|
||||
goto out;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = null_state_gen(&batch);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
null_state_gen(batch);
|
||||
intel_batch_relocate_state(batch);
|
||||
|
||||
cmd_len = intel_batch_cmds_used(&batch);
|
||||
state_len = intel_batch_state_used(&batch);
|
||||
ret = print_state(gen, batch);
|
||||
|
||||
size = cmd_len + state_len + ALIGN(cmd_len, STATE_ALIGN) - cmd_len;
|
||||
|
||||
ret = intel_batch_reset(&batch, p, size, ALIGN(cmd_len, STATE_ALIGN));
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = null_state_gen(&batch);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
assert(cmd_len == intel_batch_cmds_used(&batch));
|
||||
assert(state_len == intel_batch_state_used(&batch));
|
||||
assert(size == ret);
|
||||
|
||||
/* Batch buffer needs to end */
|
||||
assert(*(uint32_t *)(p + cmd_len - 4) == (0xA << 23));
|
||||
|
||||
ret = print_state(gen, &batch);
|
||||
out:
|
||||
free(p);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
if (argc != 2) {
|
||||
if (argc < 2) {
|
||||
print_usage(argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (argc > 2)
|
||||
debug = 1;
|
||||
|
||||
return do_generate(atoi(argv[1]));
|
||||
}
|
||||
|
@ -33,31 +33,23 @@ static const uint32_t ps_kernel_nomask_affine[][4] = {
|
||||
static uint32_t
|
||||
gen6_bind_buf_null(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_surface_state *ss;
|
||||
int ret;
|
||||
struct gen6_surface_state ss;
|
||||
memset(&ss, 0, sizeof(ss));
|
||||
|
||||
ss = intel_batch_state_alloc(batch, sizeof(*ss), 32);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
|
||||
memset(ss, 0, sizeof(*ss));
|
||||
|
||||
return intel_batch_offset(batch, ss);
|
||||
return OUT_STATE_STRUCT(ss, 32);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen6_bind_surfaces(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t *binding_table;
|
||||
unsigned offset;
|
||||
|
||||
binding_table = intel_batch_state_alloc(batch, 32, 32);
|
||||
if (binding_table == NULL)
|
||||
return -1;
|
||||
offset = intel_batch_state_alloc(batch, 32, 32, "bind surfaces");
|
||||
|
||||
binding_table[0] = gen6_bind_buf_null(batch);
|
||||
binding_table[1] = gen6_bind_buf_null(batch);
|
||||
bb_area_emit_offset(batch->state, offset, gen6_bind_buf_null(batch), STATE_OFFSET, "bind 1");
|
||||
bb_area_emit_offset(batch->state, offset + 4, gen6_bind_buf_null(batch), STATE_OFFSET, "bind 2");
|
||||
|
||||
return intel_batch_offset(batch, binding_table);
|
||||
return offset;
|
||||
}
|
||||
|
||||
static void
|
||||
@ -108,7 +100,7 @@ gen6_emit_viewports(struct intel_batchbuffer *batch, uint32_t cc_vp)
|
||||
(4 - 2));
|
||||
OUT_BATCH(0);
|
||||
OUT_BATCH(0);
|
||||
OUT_BATCH(cc_vp);
|
||||
OUT_BATCH_STATE_OFFSET(cc_vp);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -202,7 +194,7 @@ static void
|
||||
gen6_emit_cc(struct intel_batchbuffer *batch, uint32_t blend)
|
||||
{
|
||||
OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS | (4 - 2));
|
||||
OUT_BATCH(blend | 1);
|
||||
OUT_BATCH_STATE_OFFSET(blend | 1);
|
||||
OUT_BATCH(1024 | 1);
|
||||
OUT_BATCH(1024 | 1);
|
||||
}
|
||||
@ -215,7 +207,7 @@ gen6_emit_sampler(struct intel_batchbuffer *batch, uint32_t state)
|
||||
(4 - 2));
|
||||
OUT_BATCH(0); /* VS */
|
||||
OUT_BATCH(0); /* GS */
|
||||
OUT_BATCH(state);
|
||||
OUT_BATCH_STATE_OFFSET(state);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -249,7 +241,7 @@ static void
|
||||
gen6_emit_wm(struct intel_batchbuffer *batch, int kernel)
|
||||
{
|
||||
OUT_BATCH(GEN6_3DSTATE_WM | (9 - 2));
|
||||
OUT_BATCH(kernel);
|
||||
OUT_BATCH_STATE_OFFSET(kernel);
|
||||
OUT_BATCH(1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHIFT |
|
||||
2 << GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT);
|
||||
OUT_BATCH(0);
|
||||
@ -271,7 +263,7 @@ gen6_emit_binding_table(struct intel_batchbuffer *batch, uint32_t wm_table)
|
||||
(4 - 2));
|
||||
OUT_BATCH(0); /* vs */
|
||||
OUT_BATCH(0); /* gs */
|
||||
OUT_BATCH(wm_table);
|
||||
OUT_BATCH_STATE_OFFSET(wm_table);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -325,36 +317,32 @@ gen6_emit_vertex_elements(struct intel_batchbuffer *batch)
|
||||
static uint32_t
|
||||
gen6_create_cc_viewport(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_cc_viewport *vp;
|
||||
struct gen6_cc_viewport vp;
|
||||
|
||||
vp = intel_batch_state_alloc(batch, sizeof(*vp), 32);
|
||||
if (vp == NULL)
|
||||
return -1;
|
||||
memset(&vp, 0, sizeof(vp));
|
||||
|
||||
vp->min_depth = -1.e35;
|
||||
vp->max_depth = 1.e35;
|
||||
vp.min_depth = -1.e35;
|
||||
vp.max_depth = 1.e35;
|
||||
|
||||
return intel_batch_offset(batch, vp);
|
||||
return OUT_STATE_STRUCT(vp, 32);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen6_create_cc_blend(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_blend_state *blend;
|
||||
struct gen6_blend_state blend;
|
||||
|
||||
blend = intel_batch_state_alloc(batch, sizeof(*blend), 64);
|
||||
if (blend == NULL)
|
||||
return -1;
|
||||
memset(&blend, 0, sizeof(blend));
|
||||
|
||||
blend->blend0.dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
|
||||
blend->blend0.source_blend_factor = GEN6_BLENDFACTOR_ONE;
|
||||
blend->blend0.blend_func = GEN6_BLENDFUNCTION_ADD;
|
||||
blend->blend0.blend_enable = 1;
|
||||
blend.blend0.dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
|
||||
blend.blend0.source_blend_factor = GEN6_BLENDFACTOR_ONE;
|
||||
blend.blend0.blend_func = GEN6_BLENDFUNCTION_ADD;
|
||||
blend.blend0.blend_enable = 1;
|
||||
|
||||
blend->blend1.post_blend_clamp_enable = 1;
|
||||
blend->blend1.pre_blend_clamp_enable = 1;
|
||||
blend.blend1.post_blend_clamp_enable = 1;
|
||||
blend.blend1.pre_blend_clamp_enable = 1;
|
||||
|
||||
return intel_batch_offset(batch, blend);
|
||||
return OUT_STATE_STRUCT(blend, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -362,7 +350,7 @@ gen6_create_kernel(struct intel_batchbuffer *batch)
|
||||
{
|
||||
return intel_batch_state_copy(batch, ps_kernel_nomask_affine,
|
||||
sizeof(ps_kernel_nomask_affine),
|
||||
64);
|
||||
64, "ps_kernel");
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -370,70 +358,64 @@ gen6_create_sampler(struct intel_batchbuffer *batch,
|
||||
sampler_filter_t filter,
|
||||
sampler_extend_t extend)
|
||||
{
|
||||
struct gen6_sampler_state *ss;
|
||||
struct gen6_sampler_state ss;
|
||||
|
||||
ss = intel_batch_state_alloc(batch, sizeof(*ss), 32);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
memset(&ss, 0, sizeof(ss));
|
||||
|
||||
ss->ss0.lod_preclamp = 1; /* GL mode */
|
||||
ss.ss0.lod_preclamp = 1; /* GL mode */
|
||||
|
||||
/* We use the legacy mode to get the semantics specified by
|
||||
* the Render extension. */
|
||||
ss->ss0.border_color_mode = GEN6_BORDER_COLOR_MODE_LEGACY;
|
||||
ss.ss0.border_color_mode = GEN6_BORDER_COLOR_MODE_LEGACY;
|
||||
|
||||
switch (filter) {
|
||||
default:
|
||||
case SAMPLER_FILTER_NEAREST:
|
||||
ss->ss0.min_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss->ss0.mag_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss.ss0.min_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss.ss0.mag_filter = GEN6_MAPFILTER_NEAREST;
|
||||
break;
|
||||
case SAMPLER_FILTER_BILINEAR:
|
||||
ss->ss0.min_filter = GEN6_MAPFILTER_LINEAR;
|
||||
ss->ss0.mag_filter = GEN6_MAPFILTER_LINEAR;
|
||||
ss.ss0.min_filter = GEN6_MAPFILTER_LINEAR;
|
||||
ss.ss0.mag_filter = GEN6_MAPFILTER_LINEAR;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (extend) {
|
||||
default:
|
||||
case SAMPLER_EXTEND_NONE:
|
||||
ss->ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
ss->ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
ss->ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP_BORDER;
|
||||
break;
|
||||
case SAMPLER_EXTEND_REPEAT:
|
||||
ss->ss1.r_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
ss->ss1.s_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
ss->ss1.t_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_WRAP;
|
||||
break;
|
||||
case SAMPLER_EXTEND_PAD:
|
||||
ss->ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss->ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss->ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
break;
|
||||
case SAMPLER_EXTEND_REFLECT:
|
||||
ss->ss1.r_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
ss->ss1.s_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
ss->ss1.t_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
ss.ss1.r_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
ss.ss1.s_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
ss.ss1.t_wrap_mode = GEN6_TEXCOORDMODE_MIRROR;
|
||||
break;
|
||||
}
|
||||
|
||||
return intel_batch_offset(batch, ss);
|
||||
return OUT_STATE_STRUCT(ss, 32);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen6_create_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint16_t *v;
|
||||
|
||||
v = intel_batch_state_alloc(batch, 2 * sizeof(uint16_t), 8);
|
||||
if (v == NULL)
|
||||
return -1;
|
||||
uint16_t v[2];
|
||||
|
||||
v[0] = 0;
|
||||
v[1] = 0;
|
||||
|
||||
return intel_batch_offset(batch, v);
|
||||
return intel_batch_state_copy(batch, v, sizeof(v), 8, "vertex buffer");
|
||||
}
|
||||
|
||||
static void gen6_emit_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
@ -447,17 +429,15 @@ static void gen6_emit_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
0 << VB0_BUFFER_INDEX_SHIFT |
|
||||
VB0_NULL_VERTEX_BUFFER |
|
||||
0 << VB0_BUFFER_PITCH_SHIFT);
|
||||
OUT_RELOC(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_RELOC(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_BATCH(0);
|
||||
}
|
||||
|
||||
int gen6_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
void gen6_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t wm_state, wm_kernel, wm_table;
|
||||
uint32_t cc_vp, cc_blend, offset;
|
||||
uint32_t batch_end;
|
||||
int ret;
|
||||
uint32_t cc_vp, cc_blend;
|
||||
|
||||
wm_table = gen6_bind_surfaces(batch);
|
||||
wm_kernel = gen6_create_kernel(batch);
|
||||
@ -492,10 +472,4 @@ int gen6_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
gen6_emit_vertex_buffer(batch);
|
||||
|
||||
OUT_BATCH(MI_BATCH_BUFFER_END);
|
||||
|
||||
ret = intel_batch_error(batch);
|
||||
if (ret == 0)
|
||||
ret = intel_batch_total_used(batch);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -25,6 +25,7 @@
|
||||
#include "intel_batchbuffer.h"
|
||||
#include <lib/gen7_render.h>
|
||||
#include <lib/intel_reg.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static const uint32_t ps_kernel[][4] = {
|
||||
@ -41,22 +42,7 @@ static const uint32_t ps_kernel[][4] = {
|
||||
static uint32_t
|
||||
gen7_bind_buf_null(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t *ss;
|
||||
|
||||
ss = intel_batch_state_alloc(batch, 8 * sizeof(*ss), 32);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
|
||||
ss[0] = 0;
|
||||
ss[1] = 0;
|
||||
ss[2] = 0;
|
||||
ss[3] = 0;
|
||||
ss[4] = 0;
|
||||
ss[5] = 0;
|
||||
ss[6] = 0;
|
||||
ss[7] = 0;
|
||||
|
||||
return intel_batch_offset(batch, ss);
|
||||
return intel_batch_state_alloc(batch, 32, 32, "bind buf null");
|
||||
}
|
||||
|
||||
static void
|
||||
@ -99,26 +85,7 @@ gen7_create_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint16_t *v;
|
||||
|
||||
v = intel_batch_state_alloc(batch, 12*sizeof(*v), 8);
|
||||
if (v == NULL)
|
||||
return -1;
|
||||
|
||||
v[0] = 0;
|
||||
v[1] = 0;
|
||||
v[2] = 0;
|
||||
v[3] = 0;
|
||||
|
||||
v[4] = 0;
|
||||
v[5] = 0;
|
||||
v[6] = 0;
|
||||
v[7] = 0;
|
||||
|
||||
v[8] = 0;
|
||||
v[9] = 0;
|
||||
v[10] = 0;
|
||||
v[11] = 0;
|
||||
|
||||
return intel_batch_offset(batch, v);
|
||||
return intel_batch_state_alloc(batch, 12*sizeof(*v), 8, "vertex buffer");
|
||||
}
|
||||
|
||||
static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
@ -134,7 +101,7 @@ static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
GEN7_VB0_NULL_VERTEX_BUFFER |
|
||||
4*2 << GEN7_VB0_BUFFER_PITCH_SHIFT);
|
||||
|
||||
OUT_RELOC(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_BATCH(~0);
|
||||
OUT_BATCH(0);
|
||||
}
|
||||
@ -142,23 +109,21 @@ static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch)
|
||||
static uint32_t
|
||||
gen7_bind_surfaces(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t *binding_table;
|
||||
unsigned offset;
|
||||
|
||||
binding_table = intel_batch_state_alloc(batch, 8, 32);
|
||||
if (binding_table == NULL)
|
||||
return -1;
|
||||
offset = intel_batch_state_alloc(batch, 8, 32, "bind surfaces");
|
||||
|
||||
binding_table[0] = gen7_bind_buf_null(batch);
|
||||
binding_table[1] = gen7_bind_buf_null(batch);
|
||||
bb_area_emit_offset(batch->state, offset, gen7_bind_buf_null(batch), STATE_OFFSET, "bind 1");
|
||||
bb_area_emit_offset(batch->state, offset + 4, gen7_bind_buf_null(batch), STATE_OFFSET, "bind 2");
|
||||
|
||||
return intel_batch_offset(batch, binding_table);
|
||||
return offset;
|
||||
}
|
||||
|
||||
static void
|
||||
gen7_emit_binding_table(struct intel_batchbuffer *batch)
|
||||
{
|
||||
OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS | (2 - 2));
|
||||
OUT_BATCH(gen7_bind_surfaces(batch));
|
||||
OUT_BATCH_STATE_OFFSET(gen7_bind_surfaces(batch));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -174,19 +139,16 @@ gen7_emit_drawing_rectangle(struct intel_batchbuffer *batch)
|
||||
static uint32_t
|
||||
gen7_create_blend_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen7_blend_state *blend;
|
||||
struct gen7_blend_state blend;
|
||||
memset(&blend, 0, sizeof(blend));
|
||||
|
||||
blend = intel_batch_state_alloc(batch, sizeof(*blend), 64);
|
||||
if (blend == NULL)
|
||||
return -1;
|
||||
blend.blend0.dest_blend_factor = GEN7_BLENDFACTOR_ZERO;
|
||||
blend.blend0.source_blend_factor = GEN7_BLENDFACTOR_ONE;
|
||||
blend.blend0.blend_func = GEN7_BLENDFUNCTION_ADD;
|
||||
blend.blend1.post_blend_clamp_enable = 1;
|
||||
blend.blend1.pre_blend_clamp_enable = 1;
|
||||
|
||||
blend->blend0.dest_blend_factor = GEN7_BLENDFACTOR_ZERO;
|
||||
blend->blend0.source_blend_factor = GEN7_BLENDFACTOR_ONE;
|
||||
blend->blend0.blend_func = GEN7_BLENDFUNCTION_ADD;
|
||||
blend->blend1.post_blend_clamp_enable = 1;
|
||||
blend->blend1.pre_blend_clamp_enable = 1;
|
||||
|
||||
return intel_batch_offset(batch, blend);
|
||||
return OUT_STATE_STRUCT(blend, 64);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -208,54 +170,48 @@ gen7_emit_state_base_address(struct intel_batchbuffer *batch)
|
||||
static uint32_t
|
||||
gen7_create_cc_viewport(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen7_cc_viewport *vp;
|
||||
struct gen7_cc_viewport vp;
|
||||
memset(&vp, 0, sizeof(vp));
|
||||
|
||||
vp = intel_batch_state_alloc(batch, sizeof(*vp), 32);
|
||||
if (vp == NULL)
|
||||
return -1;
|
||||
vp.min_depth = -1.e35;
|
||||
vp.max_depth = 1.e35;
|
||||
|
||||
vp->min_depth = -1.e35;
|
||||
vp->max_depth = 1.e35;
|
||||
|
||||
return intel_batch_offset(batch, vp);
|
||||
return OUT_STATE_STRUCT(vp, 32);
|
||||
}
|
||||
|
||||
static void
|
||||
gen7_emit_cc(struct intel_batchbuffer *batch)
|
||||
{
|
||||
OUT_BATCH(GEN7_3DSTATE_BLEND_STATE_POINTERS | (2 - 2));
|
||||
OUT_BATCH(gen7_create_blend_state(batch));
|
||||
OUT_BATCH_STATE_OFFSET(gen7_create_blend_state(batch));
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC | (2 - 2));
|
||||
OUT_BATCH(gen7_create_cc_viewport(batch));
|
||||
OUT_BATCH_STATE_OFFSET(gen7_create_cc_viewport(batch));
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen7_create_sampler(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen7_sampler_state *ss;
|
||||
struct gen7_sampler_state ss;
|
||||
memset(&ss, 0, sizeof(ss));
|
||||
|
||||
ss = intel_batch_state_alloc(batch, sizeof(*ss), 32);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
ss.ss0.min_filter = GEN7_MAPFILTER_NEAREST;
|
||||
ss.ss0.mag_filter = GEN7_MAPFILTER_NEAREST;
|
||||
|
||||
ss->ss0.min_filter = GEN7_MAPFILTER_NEAREST;
|
||||
ss->ss0.mag_filter = GEN7_MAPFILTER_NEAREST;
|
||||
ss.ss3.r_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
ss.ss3.s_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
ss.ss3.t_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
|
||||
ss->ss3.r_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
ss->ss3.s_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
ss->ss3.t_wrap_mode = GEN7_TEXCOORDMODE_CLAMP;
|
||||
ss.ss3.non_normalized_coord = 1;
|
||||
|
||||
ss->ss3.non_normalized_coord = 1;
|
||||
|
||||
return intel_batch_offset(batch, ss);
|
||||
return OUT_STATE_STRUCT(ss, 32);
|
||||
}
|
||||
|
||||
static void
|
||||
gen7_emit_sampler(struct intel_batchbuffer *batch)
|
||||
{
|
||||
OUT_BATCH(GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS | (2 - 2));
|
||||
OUT_BATCH(gen7_create_sampler(batch));
|
||||
OUT_BATCH_STATE_OFFSET(gen7_create_sampler(batch));
|
||||
}
|
||||
|
||||
static void
|
||||
@ -406,8 +362,8 @@ gen7_emit_ps(struct intel_batchbuffer *batch)
|
||||
threads = 40 << IVB_PS_MAX_THREADS_SHIFT;
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_PS | (8 - 2));
|
||||
OUT_BATCH(intel_batch_state_copy(batch, ps_kernel,
|
||||
sizeof(ps_kernel), 64));
|
||||
OUT_BATCH_STATE_OFFSET(intel_batch_state_copy(batch, ps_kernel,
|
||||
sizeof(ps_kernel), 64, "ps kernel"));
|
||||
OUT_BATCH(1 << GEN7_PS_SAMPLER_COUNT_SHIFT |
|
||||
2 << GEN7_PS_BINDING_TABLE_ENTRY_COUNT_SHIFT);
|
||||
OUT_BATCH(0); /* scratch address */
|
||||
@ -458,7 +414,7 @@ gen7_emit_null_depth_buffer(struct intel_batchbuffer *batch)
|
||||
OUT_BATCH(0);
|
||||
}
|
||||
|
||||
int gen7_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
void gen7_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
int ret;
|
||||
|
||||
@ -496,10 +452,4 @@ int gen7_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
OUT_BATCH(0); /* index buffer offset, ignored */
|
||||
|
||||
OUT_BATCH(MI_BATCH_BUFFER_END);
|
||||
|
||||
ret = intel_batch_error(batch);
|
||||
if (ret == 0)
|
||||
ret = intel_batch_total_used(batch);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -39,32 +39,21 @@ static const uint32_t ps_kernel[][4] = {
|
||||
static uint32_t
|
||||
gen8_bind_buf_null(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen8_surface_state *ss;
|
||||
struct gen8_surface_state ss;
|
||||
memset(&ss, 0, sizeof(ss));
|
||||
|
||||
ss = intel_batch_state_alloc(batch, sizeof(*ss), 64);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
|
||||
memset(ss, 0, sizeof(*ss));
|
||||
|
||||
return intel_batch_offset(batch, ss);
|
||||
return OUT_STATE_STRUCT(ss, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen8_bind_surfaces(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t *binding_table, offset;
|
||||
unsigned offset;
|
||||
|
||||
binding_table = intel_batch_state_alloc(batch, 8, 32);
|
||||
if (binding_table == NULL)
|
||||
return -1;
|
||||
offset = intel_batch_state_alloc(batch, 8, 32, "bind surfaces");
|
||||
|
||||
offset = intel_batch_offset(batch, binding_table);
|
||||
|
||||
binding_table[0] =
|
||||
gen8_bind_buf_null(batch);
|
||||
binding_table[1] =
|
||||
gen8_bind_buf_null(batch);
|
||||
bb_area_emit_offset(batch->state, offset, gen8_bind_buf_null(batch), STATE_OFFSET, "bind 1");
|
||||
bb_area_emit_offset(batch->state, offset + 4, gen8_bind_buf_null(batch), STATE_OFFSET, "bind 2");
|
||||
|
||||
return offset;
|
||||
}
|
||||
@ -72,26 +61,20 @@ gen8_bind_surfaces(struct intel_batchbuffer *batch)
|
||||
/* Mostly copy+paste from gen6, except wrap modes moved */
|
||||
static uint32_t
|
||||
gen8_create_sampler(struct intel_batchbuffer *batch) {
|
||||
struct gen8_sampler_state *ss;
|
||||
uint32_t offset;
|
||||
struct gen8_sampler_state ss;
|
||||
memset(&ss, 0, sizeof(ss));
|
||||
|
||||
ss = intel_batch_state_alloc(batch, sizeof(*ss), 64);
|
||||
if (ss == NULL)
|
||||
return -1;
|
||||
|
||||
offset = intel_batch_offset(batch, ss);
|
||||
|
||||
ss->ss0.min_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss->ss0.mag_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss->ss3.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss->ss3.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss->ss3.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss0.min_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss.ss0.mag_filter = GEN6_MAPFILTER_NEAREST;
|
||||
ss.ss3.r_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss3.s_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
ss.ss3.t_wrap_mode = GEN6_TEXCOORDMODE_CLAMP;
|
||||
|
||||
/* I've experimented with non-normalized coordinates and using the LD
|
||||
* sampler fetch, but couldn't make it work. */
|
||||
ss->ss3.non_normalized_coord = 0;
|
||||
ss.ss3.non_normalized_coord = 0;
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(ss, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
@ -99,7 +82,7 @@ gen8_fill_ps(struct intel_batchbuffer *batch,
|
||||
const uint32_t kernel[][4],
|
||||
size_t size)
|
||||
{
|
||||
return intel_batch_state_copy(batch, kernel, size, 64);
|
||||
return intel_batch_state_copy(batch, kernel, size, 64, "ps kernel");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -115,13 +98,9 @@ gen8_fill_ps(struct intel_batchbuffer *batch,
|
||||
static uint32_t
|
||||
gen7_fill_vertex_buffer_data(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint16_t *start;
|
||||
uint16_t *v;
|
||||
|
||||
start = intel_batch_state_alloc(batch, 2 * sizeof(*start), 8);
|
||||
start[0] = 0;
|
||||
start[1] = 0;
|
||||
|
||||
return intel_batch_offset(batch, start);
|
||||
return intel_batch_state_alloc(batch, 2 * sizeof(*v), 8, "vertex buffer");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -194,7 +173,7 @@ static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch,
|
||||
GEN7_VB0_BUFFER_ADDR_MOD_EN | /* Address Modify Enable */
|
||||
VB0_NULL_VERTEX_BUFFER |
|
||||
0 << VB0_BUFFER_PITCH_SHIFT);
|
||||
OUT_RELOC(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_RELOC_STATE(batch, I915_GEM_DOMAIN_VERTEX, 0, offset);
|
||||
OUT_BATCH(0);
|
||||
OUT_BATCH(0);
|
||||
}
|
||||
@ -202,94 +181,68 @@ static void gen7_emit_vertex_buffer(struct intel_batchbuffer *batch,
|
||||
static uint32_t
|
||||
gen6_create_cc_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_color_calc_state *cc_state;
|
||||
uint32_t offset;
|
||||
struct gen6_color_calc_state cc_state;
|
||||
memset(&cc_state, 0, sizeof(cc_state));
|
||||
|
||||
cc_state = intel_batch_state_alloc(batch, sizeof(*cc_state), 64);
|
||||
if (cc_state == NULL)
|
||||
return -1;
|
||||
|
||||
offset = intel_batch_offset(batch, cc_state);
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(cc_state, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen8_create_blend_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen8_blend_state *blend;
|
||||
struct gen8_blend_state blend;
|
||||
int i;
|
||||
uint32_t offset;
|
||||
|
||||
blend = intel_batch_state_alloc(batch, sizeof(*blend), 64);
|
||||
if (blend == NULL)
|
||||
return -1;
|
||||
|
||||
offset = intel_batch_offset(batch, blend);
|
||||
memset(&blend, 0, sizeof(blend));
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
blend->bs[i].dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
|
||||
blend->bs[i].source_blend_factor = GEN6_BLENDFACTOR_ONE;
|
||||
blend->bs[i].color_blend_func = GEN6_BLENDFUNCTION_ADD;
|
||||
blend->bs[i].pre_blend_color_clamp = 1;
|
||||
blend->bs[i].color_buffer_blend = 0;
|
||||
blend.bs[i].dest_blend_factor = GEN6_BLENDFACTOR_ZERO;
|
||||
blend.bs[i].source_blend_factor = GEN6_BLENDFACTOR_ONE;
|
||||
blend.bs[i].color_blend_func = GEN6_BLENDFUNCTION_ADD;
|
||||
blend.bs[i].pre_blend_color_clamp = 1;
|
||||
blend.bs[i].color_buffer_blend = 0;
|
||||
}
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(blend, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen6_create_cc_viewport(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_cc_viewport *vp;
|
||||
uint32_t offset;
|
||||
struct gen6_cc_viewport vp;
|
||||
|
||||
vp = intel_batch_state_alloc(batch, sizeof(*vp), 32);
|
||||
if (vp == NULL)
|
||||
return -1;
|
||||
|
||||
offset = intel_batch_offset(batch, vp);
|
||||
memset(&vp, 0, sizeof(vp));
|
||||
|
||||
/* XXX I don't understand this */
|
||||
vp->min_depth = -1.e35;
|
||||
vp->max_depth = 1.e35;
|
||||
vp.min_depth = -1.e35;
|
||||
vp.max_depth = 1.e35;
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(vp, 32);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen7_create_sf_clip_viewport(struct intel_batchbuffer *batch) {
|
||||
/* XXX these are likely not needed */
|
||||
struct gen7_sf_clip_viewport *scv_state;
|
||||
uint32_t offset;
|
||||
struct gen7_sf_clip_viewport scv_state;
|
||||
|
||||
scv_state = intel_batch_state_alloc(batch, sizeof(*scv_state), 64);
|
||||
if (scv_state == NULL)
|
||||
return -1;
|
||||
memset(&scv_state, 0, sizeof(scv_state));
|
||||
|
||||
offset = intel_batch_offset(batch, scv_state);
|
||||
scv_state.guardband.xmin = 0;
|
||||
scv_state.guardband.xmax = 1.0f;
|
||||
scv_state.guardband.ymin = 0;
|
||||
scv_state.guardband.ymax = 1.0f;
|
||||
|
||||
scv_state->guardband.xmin = 0;
|
||||
scv_state->guardband.xmax = 1.0f;
|
||||
scv_state->guardband.ymin = 0;
|
||||
scv_state->guardband.ymax = 1.0f;
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(scv_state, 64);
|
||||
}
|
||||
|
||||
static uint32_t
|
||||
gen6_create_scissor_rect(struct intel_batchbuffer *batch)
|
||||
{
|
||||
struct gen6_scissor_rect *scissor;
|
||||
uint32_t offset;
|
||||
struct gen6_scissor_rect scissor;
|
||||
|
||||
scissor = intel_batch_state_alloc(batch, sizeof(*scissor), 64);
|
||||
if (scissor == NULL)
|
||||
return -1;
|
||||
memset(&scissor, 0, sizeof(scissor));
|
||||
|
||||
offset = intel_batch_offset(batch, scissor);
|
||||
|
||||
return offset;
|
||||
return OUT_STATE_STRUCT(scissor, 64);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -371,10 +324,10 @@ gen7_emit_urb(struct intel_batchbuffer *batch) {
|
||||
static void
|
||||
gen8_emit_cc(struct intel_batchbuffer *batch) {
|
||||
OUT_BATCH(GEN7_3DSTATE_BLEND_STATE_POINTERS);
|
||||
OUT_BATCH(cc.blend_state | 1);
|
||||
OUT_BATCH_STATE_OFFSET(cc.blend_state | 1);
|
||||
|
||||
OUT_BATCH(GEN6_3DSTATE_CC_STATE_POINTERS);
|
||||
OUT_BATCH(cc.cc_state | 1);
|
||||
OUT_BATCH_STATE_OFFSET(cc.cc_state | 1);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -596,7 +549,7 @@ gen8_emit_ps(struct intel_batchbuffer *batch, uint32_t kernel) {
|
||||
OUT_BATCH(0);
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_PS | (12-2));
|
||||
OUT_BATCH(kernel);
|
||||
OUT_BATCH_STATE_OFFSET(kernel);
|
||||
OUT_BATCH(0); /* kernel hi */
|
||||
OUT_BATCH(1 << GEN6_3DSTATE_WM_SAMPLER_COUNT_SHIFT |
|
||||
2 << GEN6_3DSTATE_WM_BINDING_TABLE_ENTRY_COUNT_SHIFT);
|
||||
@ -664,7 +617,7 @@ static void gen8_emit_vf_topology(struct intel_batchbuffer *batch)
|
||||
}
|
||||
|
||||
/* Vertex elements MUST be defined before this according to spec */
|
||||
static void gen8_emit_primitive(struct intel_batchbuffer *batch, uint32_t offset)
|
||||
static void gen8_emit_primitive(struct intel_batchbuffer *batch)
|
||||
{
|
||||
OUT_BATCH(GEN8_3DSTATE_VF_INSTANCING | (3 - 2));
|
||||
OUT_BATCH(0);
|
||||
@ -679,7 +632,7 @@ static void gen8_emit_primitive(struct intel_batchbuffer *batch, uint32_t offset
|
||||
OUT_BATCH(0); /* index buffer offset, ignored */
|
||||
}
|
||||
|
||||
int gen8_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
void gen8_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
{
|
||||
uint32_t ps_sampler_state, ps_kernel_off, ps_binding_table;
|
||||
uint32_t scissor_state;
|
||||
@ -709,9 +662,9 @@ int gen8_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
gen8_emit_state_base_address(batch);
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_CC);
|
||||
OUT_BATCH(viewport.cc_state);
|
||||
OUT_BATCH_STATE_OFFSET(viewport.cc_state);
|
||||
OUT_BATCH(GEN7_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP);
|
||||
OUT_BATCH(viewport.sf_clip_state);
|
||||
OUT_BATCH_STATE_OFFSET(viewport.sf_clip_state);
|
||||
|
||||
gen7_emit_urb(batch);
|
||||
|
||||
@ -732,15 +685,15 @@ int gen8_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
gen8_emit_sf(batch);
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_BINDING_TABLE_POINTERS_PS);
|
||||
OUT_BATCH(ps_binding_table);
|
||||
OUT_BATCH_STATE_OFFSET(ps_binding_table);
|
||||
|
||||
OUT_BATCH(GEN7_3DSTATE_SAMPLER_STATE_POINTERS_PS);
|
||||
OUT_BATCH(ps_sampler_state);
|
||||
OUT_BATCH_STATE_OFFSET(ps_sampler_state);
|
||||
|
||||
gen8_emit_ps(batch, ps_kernel_off);
|
||||
|
||||
OUT_BATCH(GEN6_3DSTATE_SCISSOR_STATE_POINTERS);
|
||||
OUT_BATCH(scissor_state);
|
||||
OUT_BATCH_STATE_OFFSET(scissor_state);
|
||||
|
||||
gen8_emit_depth(batch);
|
||||
|
||||
@ -752,13 +705,7 @@ int gen8_setup_null_render_state(struct intel_batchbuffer *batch)
|
||||
gen6_emit_vertex_elements(batch);
|
||||
|
||||
gen8_emit_vf_topology(batch);
|
||||
gen8_emit_primitive(batch, vertex_buffer);
|
||||
gen8_emit_primitive(batch);
|
||||
|
||||
OUT_BATCH(MI_BATCH_BUFFER_END);
|
||||
|
||||
ret = intel_batch_error(batch);
|
||||
if (ret == 0)
|
||||
ret = intel_batch_total_used(batch);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user