blob: 6cd63a0d0c9214b9df9ac896e7b552a22e9c7ab0 [file] [log] [blame]
Chia-I Wu759fa2e2014-08-30 18:44:47 +08001/*
2 * XGL
3 *
4 * Copyright (C) 2014 LunarG, Inc.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included
14 * in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
Chia-I Wu44e42362014-09-02 08:32:09 +080023 *
24 * Authors:
25 * Chia-I Wu <olv@lunarg.com>
Chia-I Wu759fa2e2014-08-30 18:44:47 +080026 */
27
28#include "mem.h"
Chia-I Wue9115ee2014-08-31 12:58:35 +080029#include "event.h"
Chia-I Wu759fa2e2014-08-30 18:44:47 +080030#include "obj.h"
31#include "query.h"
32#include "cmd_priv.h"
33
34static void gen6_MI_STORE_REGISTER_MEM(struct intel_cmd *cmd,
35 struct intel_bo *bo,
36 uint32_t offset,
37 uint32_t reg)
38{
39 const uint8_t cmd_len = 3;
40 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_REGISTER_MEM) |
41 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080042 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu72292b72014-09-09 10:48:33 +080043 uint32_t *dw;
44 XGL_UINT pos;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080045
Chia-I Wu2caf7492014-08-31 12:28:38 +080046 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080047 dw0 |= GEN6_MI_STORE_REGISTER_MEM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080048 reloc_flags |= INTEL_RELOC_GGTT;
49 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080050
Chia-I Wu72292b72014-09-09 10:48:33 +080051 pos = cmd_batch_pointer(cmd, cmd_len, &dw);
52 dw[0] = dw0;
53 dw[1] = reg;
54
55 cmd_reserve_reloc(cmd, 1);
56 cmd_batch_reloc(cmd, pos + 2, bo, offset, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080057}
58
59static void gen6_MI_STORE_DATA_IMM(struct intel_cmd *cmd,
60 struct intel_bo *bo,
61 uint32_t offset,
62 uint64_t val)
63{
64 const uint8_t cmd_len = 5;
65 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_DATA_IMM) |
66 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080067 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu72292b72014-09-09 10:48:33 +080068 uint32_t *dw;
69 XGL_UINT pos;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080070
Chia-I Wu2caf7492014-08-31 12:28:38 +080071 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080072 dw0 |= GEN6_MI_STORE_DATA_IMM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080073 reloc_flags |= INTEL_RELOC_GGTT;
74 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080075
Chia-I Wu72292b72014-09-09 10:48:33 +080076 pos = cmd_batch_pointer(cmd, cmd_len, &dw);
77 dw[0] = dw0;
78 dw[1] = 0;
79 dw[3] = (uint32_t) val;
80 dw[4] = (uint32_t) (val >> 32);
81
82 cmd_reserve_reloc(cmd, 1);
83 cmd_batch_reloc(cmd, pos + 2, bo, offset, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080084}
85
86static void cmd_query_pipeline_statistics(struct intel_cmd *cmd,
87 struct intel_bo *bo,
88 XGL_GPU_SIZE offset)
89{
90 const uint32_t regs[] = {
91 GEN6_REG_PS_INVOCATION_COUNT,
92 GEN6_REG_CL_PRIMITIVES_COUNT,
93 GEN6_REG_CL_INVOCATION_COUNT,
94 GEN6_REG_VS_INVOCATION_COUNT,
95 GEN6_REG_GS_INVOCATION_COUNT,
96 GEN6_REG_GS_PRIMITIVES_COUNT,
Chia-I Wu8a927bd2014-08-31 00:06:36 +080097 /* well, we do not enable 3DSTATE_VF_STATISTICS yet */
Chia-I Wu759fa2e2014-08-30 18:44:47 +080098 GEN6_REG_IA_PRIMITIVES_COUNT,
99 GEN6_REG_IA_VERTICES_COUNT,
Chia-I Wue6073342014-11-30 09:43:42 +0800100 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN7_REG_HS_INVOCATION_COUNT : 0,
101 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN7_REG_DS_INVOCATION_COUNT : 0,
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800102 0,
103 };
104 XGL_UINT i;
105
106 cmd_batch_flush(cmd, GEN6_PIPE_CONTROL_CS_STALL);
107
108 for (i = 0; i < ARRAY_SIZE(regs); i++) {
109 if (regs[i]) {
110 /* store lower 32 bits */
111 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset, regs[i]);
112 /* store higher 32 bits */
113 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset + 4, regs[i] + 4);
114 } else {
115 gen6_MI_STORE_DATA_IMM(cmd, bo, offset, 0);
116 }
Chia-I Wu8a927bd2014-08-31 00:06:36 +0800117
118 offset += sizeof(uint64_t);
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800119 }
120}
121
122XGL_VOID XGLAPI intelCmdBeginQuery(
123 XGL_CMD_BUFFER cmdBuffer,
124 XGL_QUERY_POOL queryPool,
125 XGL_UINT slot,
126 XGL_FLAGS flags)
127{
128 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
129 struct intel_query *query = intel_query(queryPool);
130 struct intel_bo *bo = query->obj.mem->bo;
131 const XGL_GPU_SIZE offset = query->slot_stride * slot;
132
133 switch (query->type) {
134 case XGL_QUERY_OCCLUSION:
135 cmd_batch_depth_count(cmd, bo, offset);
136 break;
137 case XGL_QUERY_PIPELINE_STATISTICS:
138 cmd_query_pipeline_statistics(cmd, bo, offset);
139 break;
140 default:
141 cmd->result = XGL_ERROR_UNKNOWN;
142 break;
143 }
144}
145
146XGL_VOID XGLAPI intelCmdEndQuery(
147 XGL_CMD_BUFFER cmdBuffer,
148 XGL_QUERY_POOL queryPool,
149 XGL_UINT slot)
150{
151 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
152 struct intel_query *query = intel_query(queryPool);
153 struct intel_bo *bo = query->obj.mem->bo;
154 const XGL_GPU_SIZE offset = query->slot_stride * slot;
155
156 switch (query->type) {
157 case XGL_QUERY_OCCLUSION:
158 cmd_batch_depth_count(cmd, bo, offset + sizeof(uint64_t));
159 break;
160 case XGL_QUERY_PIPELINE_STATISTICS:
161 cmd_query_pipeline_statistics(cmd, bo,
162 offset + sizeof(XGL_PIPELINE_STATISTICS_DATA));
163 break;
164 default:
165 cmd->result = XGL_ERROR_UNKNOWN;
166 break;
167 }
168}
169
170XGL_VOID XGLAPI intelCmdResetQueryPool(
171 XGL_CMD_BUFFER cmdBuffer,
172 XGL_QUERY_POOL queryPool,
173 XGL_UINT startQuery,
174 XGL_UINT queryCount)
175{
Chia-I Wue9115ee2014-08-31 12:58:35 +0800176 /* no-op */
177}
178
179XGL_VOID XGLAPI intelCmdSetEvent(
180 XGL_CMD_BUFFER cmdBuffer,
181 XGL_EVENT event_)
182{
183 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
184 struct intel_event *event = intel_event(event_);
185
186 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 1);
187}
188
189XGL_VOID XGLAPI intelCmdResetEvent(
190 XGL_CMD_BUFFER cmdBuffer,
191 XGL_EVENT event_)
192{
193 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
194 struct intel_event *event = intel_event(event_);
195
196 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 0);
197}
198
199XGL_VOID XGLAPI intelCmdWriteTimestamp(
200 XGL_CMD_BUFFER cmdBuffer,
201 XGL_TIMESTAMP_TYPE timestampType,
202 XGL_GPU_MEMORY destMem,
203 XGL_GPU_SIZE destOffset)
204{
205 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
206 struct intel_mem *mem = intel_mem(destMem);
207
208 switch (timestampType) {
209 case XGL_TIMESTAMP_TOP:
210 /* XXX we are not supposed to use two commands... */
211 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset, GEN6_REG_TIMESTAMP);
212 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset + 4, GEN6_REG_TIMESTAMP + 4);
213 break;
214 case XGL_TIMESTAMP_BOTTOM:
215 cmd_batch_timestamp(cmd, mem->bo, destOffset);
216 break;
217 default:
218 cmd->result = XGL_ERROR_INVALID_VALUE;
219 break;
220 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800221}