blob: c2c1cd142e2c8b8864e57da87a9fa75afd9b16c6 [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.
23 */
24
25#include "mem.h"
Chia-I Wue9115ee2014-08-31 12:58:35 +080026#include "event.h"
Chia-I Wu759fa2e2014-08-30 18:44:47 +080027#include "obj.h"
28#include "query.h"
29#include "cmd_priv.h"
30
31static void gen6_MI_STORE_REGISTER_MEM(struct intel_cmd *cmd,
32 struct intel_bo *bo,
33 uint32_t offset,
34 uint32_t reg)
35{
36 const uint8_t cmd_len = 3;
37 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_REGISTER_MEM) |
38 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080039 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080040
Chia-I Wu2caf7492014-08-31 12:28:38 +080041 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080042 dw0 |= GEN6_MI_STORE_REGISTER_MEM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080043 reloc_flags |= INTEL_RELOC_GGTT;
44 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080045
46 cmd_batch_reserve(cmd, cmd_len);
47 cmd_batch_write(cmd, dw0);
48 cmd_batch_write(cmd, reg);
Chia-I Wu2caf7492014-08-31 12:28:38 +080049 cmd_batch_reloc(cmd, offset, bo, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080050}
51
52static void gen6_MI_STORE_DATA_IMM(struct intel_cmd *cmd,
53 struct intel_bo *bo,
54 uint32_t offset,
55 uint64_t val)
56{
57 const uint8_t cmd_len = 5;
58 uint32_t dw0 = GEN6_MI_CMD(MI_STORE_DATA_IMM) |
59 (cmd_len - 2);
Chia-I Wu2caf7492014-08-31 12:28:38 +080060 uint32_t reloc_flags = INTEL_RELOC_WRITE;
Chia-I Wu759fa2e2014-08-30 18:44:47 +080061
Chia-I Wu2caf7492014-08-31 12:28:38 +080062 if (cmd_gen(cmd) == INTEL_GEN(6)) {
Chia-I Wu759fa2e2014-08-30 18:44:47 +080063 dw0 |= GEN6_MI_STORE_DATA_IMM_DW0_USE_GGTT;
Chia-I Wu2caf7492014-08-31 12:28:38 +080064 reloc_flags |= INTEL_RELOC_GGTT;
65 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +080066
67 cmd_batch_reserve(cmd, cmd_len);
68 cmd_batch_write(cmd, dw0);
69 cmd_batch_write(cmd, 0);
Chia-I Wu2caf7492014-08-31 12:28:38 +080070 cmd_batch_reloc(cmd, offset, bo, reloc_flags);
Chia-I Wu759fa2e2014-08-30 18:44:47 +080071 cmd_batch_write(cmd, (uint32_t) val);
72 cmd_batch_write(cmd, (uint32_t) (val >> 32));
73}
74
75static void cmd_query_pipeline_statistics(struct intel_cmd *cmd,
76 struct intel_bo *bo,
77 XGL_GPU_SIZE offset)
78{
79 const uint32_t regs[] = {
80 GEN6_REG_PS_INVOCATION_COUNT,
81 GEN6_REG_CL_PRIMITIVES_COUNT,
82 GEN6_REG_CL_INVOCATION_COUNT,
83 GEN6_REG_VS_INVOCATION_COUNT,
84 GEN6_REG_GS_INVOCATION_COUNT,
85 GEN6_REG_GS_PRIMITIVES_COUNT,
Chia-I Wu8a927bd2014-08-31 00:06:36 +080086 /* well, we do not enable 3DSTATE_VF_STATISTICS yet */
Chia-I Wu759fa2e2014-08-30 18:44:47 +080087 GEN6_REG_IA_PRIMITIVES_COUNT,
88 GEN6_REG_IA_VERTICES_COUNT,
89 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN6_REG_HS_INVOCATION_COUNT : 0,
90 (cmd_gen(cmd) >= INTEL_GEN(7)) ? GEN6_REG_DS_INVOCATION_COUNT : 0,
91 0,
92 };
93 XGL_UINT i;
94
95 cmd_batch_flush(cmd, GEN6_PIPE_CONTROL_CS_STALL);
96
97 for (i = 0; i < ARRAY_SIZE(regs); i++) {
98 if (regs[i]) {
99 /* store lower 32 bits */
100 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset, regs[i]);
101 /* store higher 32 bits */
102 gen6_MI_STORE_REGISTER_MEM(cmd, bo, offset + 4, regs[i] + 4);
103 } else {
104 gen6_MI_STORE_DATA_IMM(cmd, bo, offset, 0);
105 }
Chia-I Wu8a927bd2014-08-31 00:06:36 +0800106
107 offset += sizeof(uint64_t);
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800108 }
109}
110
111XGL_VOID XGLAPI intelCmdBeginQuery(
112 XGL_CMD_BUFFER cmdBuffer,
113 XGL_QUERY_POOL queryPool,
114 XGL_UINT slot,
115 XGL_FLAGS flags)
116{
117 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
118 struct intel_query *query = intel_query(queryPool);
119 struct intel_bo *bo = query->obj.mem->bo;
120 const XGL_GPU_SIZE offset = query->slot_stride * slot;
121
122 switch (query->type) {
123 case XGL_QUERY_OCCLUSION:
124 cmd_batch_depth_count(cmd, bo, offset);
125 break;
126 case XGL_QUERY_PIPELINE_STATISTICS:
127 cmd_query_pipeline_statistics(cmd, bo, offset);
128 break;
129 default:
130 cmd->result = XGL_ERROR_UNKNOWN;
131 break;
132 }
133}
134
135XGL_VOID XGLAPI intelCmdEndQuery(
136 XGL_CMD_BUFFER cmdBuffer,
137 XGL_QUERY_POOL queryPool,
138 XGL_UINT slot)
139{
140 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
141 struct intel_query *query = intel_query(queryPool);
142 struct intel_bo *bo = query->obj.mem->bo;
143 const XGL_GPU_SIZE offset = query->slot_stride * slot;
144
145 switch (query->type) {
146 case XGL_QUERY_OCCLUSION:
147 cmd_batch_depth_count(cmd, bo, offset + sizeof(uint64_t));
148 break;
149 case XGL_QUERY_PIPELINE_STATISTICS:
150 cmd_query_pipeline_statistics(cmd, bo,
151 offset + sizeof(XGL_PIPELINE_STATISTICS_DATA));
152 break;
153 default:
154 cmd->result = XGL_ERROR_UNKNOWN;
155 break;
156 }
157}
158
159XGL_VOID XGLAPI intelCmdResetQueryPool(
160 XGL_CMD_BUFFER cmdBuffer,
161 XGL_QUERY_POOL queryPool,
162 XGL_UINT startQuery,
163 XGL_UINT queryCount)
164{
Chia-I Wue9115ee2014-08-31 12:58:35 +0800165 /* no-op */
166}
167
168XGL_VOID XGLAPI intelCmdSetEvent(
169 XGL_CMD_BUFFER cmdBuffer,
170 XGL_EVENT event_)
171{
172 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
173 struct intel_event *event = intel_event(event_);
174
175 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 1);
176}
177
178XGL_VOID XGLAPI intelCmdResetEvent(
179 XGL_CMD_BUFFER cmdBuffer,
180 XGL_EVENT event_)
181{
182 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
183 struct intel_event *event = intel_event(event_);
184
185 cmd_batch_immediate(cmd, event->obj.mem->bo, 0, 0);
186}
187
188XGL_VOID XGLAPI intelCmdWriteTimestamp(
189 XGL_CMD_BUFFER cmdBuffer,
190 XGL_TIMESTAMP_TYPE timestampType,
191 XGL_GPU_MEMORY destMem,
192 XGL_GPU_SIZE destOffset)
193{
194 struct intel_cmd *cmd = intel_cmd(cmdBuffer);
195 struct intel_mem *mem = intel_mem(destMem);
196
197 switch (timestampType) {
198 case XGL_TIMESTAMP_TOP:
199 /* XXX we are not supposed to use two commands... */
200 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset, GEN6_REG_TIMESTAMP);
201 gen6_MI_STORE_REGISTER_MEM(cmd, mem->bo, destOffset + 4, GEN6_REG_TIMESTAMP + 4);
202 break;
203 case XGL_TIMESTAMP_BOTTOM:
204 cmd_batch_timestamp(cmd, mem->bo, destOffset);
205 break;
206 default:
207 cmd->result = XGL_ERROR_INVALID_VALUE;
208 break;
209 }
Chia-I Wu759fa2e2014-08-30 18:44:47 +0800210}