16bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse/*
22fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Copyright © 2008 Nicolai Haehnle
32fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Copyright © 2008 Jérôme Glisse
42fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * All Rights Reserved.
56bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse *
62fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a
72fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * copy of this software and associated documentation files (the
82fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * "Software"), to deal in the Software without restriction, including
92fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * without limitation the rights to use, copy, modify, merge, publish,
102fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * distribute, sub license, and/or sell copies of the Software, and to
112fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * permit persons to whom the Software is furnished to do so, subject to
122fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * the following conditions:
136bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse *
142fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
152fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
162fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
172fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
186bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
196bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
202fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE.
212fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie *
222fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * The above copyright notice and this permission notice (including the
232fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * next paragraph) shall be included in all copies or substantial portions
242fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * of the Software.
252fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie */
262fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie/*
272fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie * Authors:
282fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie *      Aapo Tahkola <aet@rasterburn.org>
292fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie *      Nicolai Haehnle <prefect_@gmx.net>
302fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie *      Jérôme Glisse <glisse@freedesktop.org>
312fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie */
322fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#ifndef RADEON_CS_H
332fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_H
342fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
352fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include <stdint.h>
362fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include <string.h>
372fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "drm.h"
382fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "radeon_drm.h"
392fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#include "radeon_bo.h"
402fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
412fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs_reloc {
422fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    struct radeon_bo    *bo;
432fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    uint32_t            read_domain;
442fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    uint32_t            write_domain;
452fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    uint32_t            flags;
462fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie};
472fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
482fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
492fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_OK 0
502fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_OP_TO_BIG 1
512fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#define RADEON_CS_SPACE_FLUSH 2
522fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
532fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airliestruct radeon_cs {
54125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    uint32_t *packets;
55125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    unsigned cdw;
56125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    unsigned ndw;
572fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    unsigned                    section_ndw;
582fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie    unsigned                    section_cdw;
592fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie};
602fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie
61125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie#define MAX_SPACE_BOS (32)
628c43b79b21929e9e54e13e892f7787e222e73f39Pauli Nieminen
63125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airliestruct radeon_cs_manager;
6439970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie
65125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern struct radeon_cs *radeon_cs_create(struct radeon_cs_manager *csm,
666bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                          uint32_t ndw);
67125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie
68125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_begin(struct radeon_cs *cs,
696bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                           uint32_t ndw,
706bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                           const char *file,
716bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                           const char *func, int line);
72125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_end(struct radeon_cs *cs,
736bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                         const char *file,
746bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                         const char *func,
756bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                         int line);
76125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_emit(struct radeon_cs *cs);
77125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_destroy(struct radeon_cs *cs);
78125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_erase(struct radeon_cs *cs);
79125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_need_flush(struct radeon_cs *cs);
80125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern void radeon_cs_print(struct radeon_cs *cs, FILE *file);
81125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern void radeon_cs_set_limit(struct radeon_cs *cs, uint32_t domain, uint32_t limit);
82125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern void radeon_cs_space_set_flush(struct radeon_cs *cs, void (*fn)(void *), void *data);
83125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlieextern int radeon_cs_write_reloc(struct radeon_cs *cs,
846bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                 struct radeon_bo *bo,
856bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                 uint32_t read_domain,
866bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                 uint32_t write_domain,
876bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                 uint32_t flags);
88966c9907c040b4fe4b288b4a9d82598797aee743Pauli Nieminenextern uint32_t radeon_cs_get_id(struct radeon_cs *cs);
8939970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie/*
9039970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * add a persistent BO to the list
9139970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * a persistent BO is one that will be referenced across flushes,
9239970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * i.e. colorbuffer, textures etc.
9339970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * They get reset when a new "operation" happens, where an operation
9439970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * is a state emission with a color/textures etc followed by a bunch of vertices.
9539970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie */
9639970c67b77014caac9a4c3a33765ac7a312b54eDave Airlievoid radeon_cs_space_add_persistent_bo(struct radeon_cs *cs,
976bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                       struct radeon_bo *bo,
986bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                       uint32_t read_domains,
996bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                       uint32_t write_domain);
10039970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie
10139970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie/* reset the persistent BO list */
10239970c67b77014caac9a4c3a33765ac7a312b54eDave Airlievoid radeon_cs_space_reset_bos(struct radeon_cs *cs);
10339970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie
10439970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie/* do a space check with the current persistent BO list */
10539970c67b77014caac9a4c3a33765ac7a312b54eDave Airlieint radeon_cs_space_check(struct radeon_cs *cs);
10639970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie
10739970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie/* do a space check with the current persistent BO list and a temporary BO
10839970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * a temporary BO is like a DMA buffer, which  gets flushed with the
10939970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie * command buffer */
11039970c67b77014caac9a4c3a33765ac7a312b54eDave Airlieint radeon_cs_space_check_with_bo(struct radeon_cs *cs,
1116bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                  struct radeon_bo *bo,
1126bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                  uint32_t read_domains,
1136bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse                                  uint32_t write_domain);
11439970c67b77014caac9a4c3a33765ac7a312b54eDave Airlie
115125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airliestatic inline void radeon_cs_write_dword(struct radeon_cs *cs, uint32_t dword)
116125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie{
117125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    cs->packets[cs->cdw++] = dword;
118125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    if (cs->section_ndw) {
119125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie        cs->section_cdw++;
120125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    }
121125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie}
122125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie
123125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airliestatic inline void radeon_cs_write_qword(struct radeon_cs *cs, uint64_t qword)
124125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie{
125125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    memcpy(cs->packets + cs->cdw, &qword, sizeof(uint64_t));
126125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    cs->cdw += 2;
127125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    if (cs->section_ndw) {
128125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie        cs->section_cdw += 2;
129125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    }
130125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie}
131125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie
132125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airliestatic inline void radeon_cs_write_table(struct radeon_cs *cs,
133af98ccf4dd5dcb1b904ec32b9bd1521e6bf7dda5Marek Olšák                                         const void *data, uint32_t size)
134125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie{
135125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    memcpy(cs->packets + cs->cdw, data, size * 4);
136125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    cs->cdw += size;
137125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    if (cs->section_ndw) {
1386bf1ed2979ca56d3e8dd8938fc08e3810887ae8aJerome Glisse        cs->section_cdw += size;
139125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie    }
140125994ab30d4f0f126c62fa741ec62a52d69d7a8Dave Airlie}
1412fa2db138ba989bfa1a8cd9ab66d83fb7369249eDave Airlie#endif
142