1 /*
2 * Copyright (c) 2008-2024 Broadcom. All Rights Reserved.
3 * The term “Broadcom” refers to Broadcom Inc.
4 * and/or its subsidiaries.
5 * SPDX-License-Identifier: MIT
6 */
7
8 #include "util/u_debug.h"
9
10 #include "svga_resource.h"
11 #include "svga_resource_buffer.h"
12 #include "svga_resource_texture.h"
13 #include "svga_context.h"
14 #include "svga_screen.h"
15 #include "svga_format.h"
16
17
18 /**
19 * This is the primary driver entrypoint for allocating graphics memory
20 * (vertex/index/constant buffers, textures, etc)
21 */
22 static struct pipe_resource *
svga_resource_create(struct pipe_screen * screen,const struct pipe_resource * template)23 svga_resource_create(struct pipe_screen *screen,
24 const struct pipe_resource *template)
25 {
26 struct pipe_resource *r;
27
28 if (template->target == PIPE_BUFFER)
29 r = svga_buffer_create(screen, template);
30 else
31 r = svga_texture_create(screen, template);
32
33 if (!r) {
34 struct svga_screen *svgascreen = svga_screen(screen);
35 svgascreen->hud.num_failed_allocations++;
36 }
37
38 return r;
39 }
40
41
42 static struct pipe_resource *
svga_resource_from_handle(struct pipe_screen * screen,const struct pipe_resource * template,struct winsys_handle * whandle,unsigned usage)43 svga_resource_from_handle(struct pipe_screen * screen,
44 const struct pipe_resource *template,
45 struct winsys_handle *whandle,
46 unsigned usage)
47 {
48 if (template->target == PIPE_BUFFER)
49 return NULL;
50 else
51 return svga_texture_from_handle(screen, template, whandle);
52 }
53
54
55 /**
56 * Check if a resource (texture, buffer) of the given size
57 * and format can be created.
58 * \Return TRUE if OK, FALSE if too large.
59 */
60 static bool
svga_can_create_resource(struct pipe_screen * screen,const struct pipe_resource * res)61 svga_can_create_resource(struct pipe_screen *screen,
62 const struct pipe_resource *res)
63 {
64 struct svga_screen *svgascreen = svga_screen(screen);
65 struct svga_winsys_screen *sws = svgascreen->sws;
66 SVGA3dSurfaceFormat format;
67 SVGA3dSize base_level_size;
68 uint32 numMipLevels;
69 uint32 arraySize;
70 uint32 numSamples;
71
72 if (res->target == PIPE_BUFFER) {
73 format = SVGA3D_BUFFER;
74 base_level_size.width = res->width0;
75 base_level_size.height = 1;
76 base_level_size.depth = 1;
77 numMipLevels = 1;
78 arraySize = 1;
79 numSamples = 0;
80
81 } else {
82 if (res->target == PIPE_TEXTURE_CUBE)
83 assert(res->array_size == 6);
84
85 format = svga_translate_format(svgascreen, res->format, res->bind);
86 if (format == SVGA3D_FORMAT_INVALID)
87 return false;
88
89 base_level_size.width = res->width0;
90 base_level_size.height = res->height0;
91 base_level_size.depth = res->depth0;
92 numMipLevels = res->last_level + 1;
93 arraySize = res->array_size;
94 numSamples = res->nr_samples;
95 }
96
97 return sws->surface_can_create(sws, format, base_level_size,
98 arraySize, numMipLevels, numSamples);
99 }
100
101
102 void
svga_init_resource_functions(struct svga_context * svga)103 svga_init_resource_functions(struct svga_context *svga)
104 {
105 svga->pipe.buffer_map = svga_buffer_transfer_map;
106 svga->pipe.texture_map = svga_texture_transfer_map;
107 svga->pipe.transfer_flush_region = svga_buffer_transfer_flush_region;
108 svga->pipe.buffer_unmap = svga_buffer_transfer_unmap;
109 svga->pipe.texture_unmap = svga_texture_transfer_unmap;
110 svga->pipe.buffer_subdata = u_default_buffer_subdata;
111 svga->pipe.texture_subdata = u_default_texture_subdata;
112
113 if (svga_have_vgpu10(svga)) {
114 svga->pipe.generate_mipmap = svga_texture_generate_mipmap;
115 } else {
116 svga->pipe.generate_mipmap = NULL;
117 }
118 }
119
120 void
svga_init_screen_resource_functions(struct svga_screen * is)121 svga_init_screen_resource_functions(struct svga_screen *is)
122 {
123 is->screen.resource_create = svga_resource_create;
124 is->screen.resource_from_handle = svga_resource_from_handle;
125 is->screen.resource_get_handle = svga_resource_get_handle;
126 is->screen.resource_destroy = svga_resource_destroy;
127 is->screen.can_create_resource = svga_can_create_resource;
128 }
129