summaryrefslogtreecommitdiff
path: root/Development/Xv2.mdwn
blob: 5d2b15313d636f5670fb92edfba4bc9ece3c39db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140


# Xv2

Xv2 is a hypothetical family of two updates to support video displaying that isn't Xv. 

* Render: Allow dest-only pictures, add YUV formats 
* Randr: Add overlay objects beside CRTCs: enable, disable, property mangling, mandatory formats supported and acceptable CRTC mask properties, as well as a 'current backing Picture' property. 
Drivers wrap Render context creation and set ShmPutImage/Composite to their former Xv paths.  Port properties become Randr overlay properties. 


## Rambling IRC braindump

I should clean this up and summarise, but right now it's here for posterity.  Also encompasses server development, future driver API, and future render API discussions. 


[[!format txt """
< ajax> exa is giving me vertigo
< daniels> maybe if we do fold the drivers into the server to start smashing up the api, people won't notice drm because it'll still be two steps.  win.
* daniels draws for the epsom salts.
< ajax> i think i'm just going to smash the api and tell people to cope
< ajax> doing shatter well essentially requires breaking the ScreenRec
< daniels> ajax: i was thinking more along the lines of actually creating an api first.
< ajax> daniels: madness.
< daniels> as opposed to, y'know, what we have now.
< ajax> yeah we should have one of those, shouldn't we.
< daniels> if we say in advance that 7.6 + 2.0 are going to be this big break and that master may not always be buildable due to active development, then i think we can more than get away with it.
< ajax> i've been hoping to slowly morph towards having something sensible, but i might be losing patience
< daniels> ajax: right, but morphing from here to there essentially requires creating an api, no?
< ajax> daniels: evolving, but yeah.  the advantage being that you don't have to hope you design it right up front
< ajax> which we are manifestly shit at
< ajax> HI MEMORY MANAGER HOW ARE YOU
< daniels> of course there are still renovations like the i2c api of shame, but most of it is going to be fbScreenInit + mangle masks + gamma init + picture init + randr init + create visuals list + OH GOD I DON'T CARE -> xorg_create_a_screen_for_the_love_of_god())
< jcristau> which one? :)
< daniels> ajax: oh god no.  it comes organically or it comes xkb.
< daniels> ajax: but i get the sense that a new api is mostly going to look like a new header file with a whole host of new functions which replace almost all the old functions (and then your mode + video + etc helpers)
< ajax> also, you're talking about driver api, and i'm talking about rendering api.  they're related but not identical.
< daniels> yes, that also.  that's not on my immediate hitlist though.
< daniels> what did you have in mind?
< daniels> (also, our input driver api is, surprisingly crap.  need to fix that, and lift a raft of stuff into the dix.)
< daniels> InputDriverRec + IDrvRec + maybe DeviceIntRec if you're lucky -> OH GOD NOT THE FACE
< ajax> we still expose basically the whole gc/picture/xvctx to the driver.  drivers shouldn't have to know about the protocol's semantics, we should be giving them a much smaller rendering task.
< daniels> \o/
< daniels> exa isn't tooo bad in that sense though.
< ajax> it's better but still not good
< ajax> the Picture is a disaster of a struct
< daniels> i don't know if you know, but in x terms, that's called a celebration.
< ajax> the _one_ thing that the core rendering model got right is that the chalkboard is not the chalk
< daniels> the what isn't the what?
< ajax> the GC isn't the Drawable
< ajax> but in the Picture they're bound together
< daniels> yeah, they did get the model right there.
< daniels> heh.  progress!
< daniels> hmm, i should fix up render-arg-reduction if we're breaking this api anyway, because seriously.
< daniels> gtkperf got something like 33% in some tests just from fb-internal arg reduction, not even the entire chain.
< ajax> render-argh-reduction
< daniels> (hi! my name is arm! please don't have 12 arguments for deeply-wrapped functions, because it makes me sad.)
< ajax> x86 doesn't like it either, for that matter
< ajax> we just hide it with l1
< daniels> sure, but the overall performance penalty isn't so bad.
< daniels> right.
< daniels> plus a hojillion more cycles per second.
< ajax> so yeah.  render and xv need proper contexts, and so does the Screen for getimage and possibly the implicit window rendering shit.
< ajax> which i'm considering tossing altogether and just forcing CompositeRedirectAutomatic
< ajax> (or equivalent semantics)
< ajax> i hate the window rendering rules so very hard
< daniels> meh, if you're doing that, just add YUV formats to Render and implement Xv as a wrapper for that.
< ajax> it's not clear how you keep the overlay fastpath for that
< daniels> plus, is there any reason _not_ to force automatic redirection? all the consumer-device kids are getting on compositing (including us), so that's the main argument gone ...
< ajax> depends how much memory pressure you're willing to accept, i guess
< daniels> ajax: overlay> how not?
< daniels> i guess you'd need a way to route to ports, but that gives us a one-extension xv.
< daniels> 'bind this render yuv texture to this overlay', which also lets you deassociate.  that's grabport and stopvideo in one, and putimage is nothing if not composite dst.
< daniels> dberkholz: oh?
< dberkholz> on one hand, we're assuming people are running distros by defaulting to black
< daniels> s/one-extension/one-request/
< daniels> okay, listports and port properties.  blah blah i'm not listening anymore.
< daniels> or, wait.  randr! aha.  every gpu gets some overlays, which can have an acceptable crtc mask.  so we punt the hard decisions to the client.  win.
< daniels> ajax: anyway, so.  render gets yuv picture support.  randr gets overlays at the same level as crtcs, and behave like them (enable/disable/props), but also have acceptable crtc & format masks.  you have one request to bind a picture to a port, and rendering is just composite.  sound okay?
< ajax> what do you composite _to_?
< ajax> i guess have an internal picture type that means "overlay port"?
< daniels> well, you've given render a GC, so at context creation time, you set Composite to your overlay path if it's an overlay.
< ajax> heh.  dest-only picture.  yeah, that sounds plausible
< marcheu> the major difference between xv and yuv render is the semantics. and we need it to optimize the upload
< ajax> you just don't expose that picture type to clients through render
< daniels> you even get to use the general fb code, because dst with no mask is easy.  if they want to alpha-blend on the client side, they can cop the slow path.
< ajax> marcheu: ShmPutImage not enough for you?
< ajax> daniels: i guess the one remaining bugbear is "magic encrypted content stream" as a picture format.  but that should be fine, just looks like another format.
< daniels> marcheu: i don't see how it's a problem if you have shm and you get a say in ctx creation? if it's on an overlay, wrap ->ShmPutImage and ->Composite and set them to your fastpaths.
< daniels> ajax: PICT_BULLSHIT32
< marcheu> ajax: getting the best performance is quite card-dependent
< daniels> ajax: specified as always passing through unmolested, and any attempt at manipulation fails.
< daniels> marcheu: ... and?
< daniels> marcheu: i just don't see how this is even remotely different from the Xv api.  you could even make it look exactly the same if you wanted.
< marcheu> well then you have to keep the xv api, basically
< daniels> ... why?
< ajax> yeah, i was anticipating leaving Xv in place as the only thing allowed to create dest-only pictures
< marcheu> because if you keep the semantics, you might as well keep the api
< daniels> marcheu: you _can_ keep the semantics.
< ajax> (well, not the only thing, but as an api compat thing it'd be desirable to keep)
< daniels> ajax: i don't see how it's too much different from render, where you already have to pay attention to the format, with the exception of some Pictures being dest-only.  i mean, the server implementation of Xv would surely be a tiny shim over render, so why do they have to be so different client-side?
< daniels> ajax: mm, you can do api compat forever by having libXv just call out to libXv2, though yeah, that doesn't solve this whole client<->server issue.
< ajax> i really can't break libXv
< ajax> though lord do i wish
< marcheu> daniels: I'm saying you have to basically keep the xv implementation driver-side anyway...
< daniels> sure, so that can just call out to the new code.  nothing saying that libXv has to implement XVIDEO.
< marcheu> yeah, but that's duplication
< daniels> marcheu: true for overlays, but it probably means a lot _less_ duplication for textured video.
< ajax> daniels: there's a small "hard problem" around making sure the XV object types exist in the protocol somewhere and can be passed around between clients, just in case someone did that.
< daniels> ajax: hmm?
< ajax> daniels: it's legal to get an XvPortID from one process and use it in another and expect them to be numerically identical
< ajax> it's crack but it's an XID
< ajax> libXv backending onto this new Render hotness would need to manage that somehow.  could be root window properties for all i care, but.
< daniels> atoms.
< daniels> do they share a space with xids?
< daniels> (i should know this.)
< ajax> not sure.  doesn't really matter that they be legal XIDs, just that the opaque value mean the same thing in all clients.
< daniels> okay, atom of (int gpuid, int portid)
< ajax> also, as a sloth argument, it's easier to compat it in the server than both: compat on client, rewrite in server
< daniels> sure, but i'm talking new driver api + new render api, not when i'm bored next week. :)
< daniels> i mean, if your argument is that it's a crap api, sure, but if your argument's that someone needs to do it, then i'll do it because i've written an xv implementation and looked into that code.
< ajax> i'm happy to see xv backended on to render, sure.  i just don't see a lot of value in moving xv api compat from the server to libXv.
< daniels> assuming that we care about the server codebase being both reasonably sized and mostly decrufted, slicing xv off can't be that bad an idea.
< daniels> and that bitrotting libraries is something no-one really cares about.
< ajax> i suppose i'm being paranoid about xv-on-the-wire mattering for someone
< ajax> but, like you said: xv compat in server would _not_ be a large chunk of code
< ajax> positing all the stuff mentioned above, it's like... thousand lines or so?  most of which is protocol banging?
< daniels> sure.
< ajax> (also, anyone doing xv on the wire is already a bit barmy, seriously just do mpeg frames, it's less work for both sides)
< ajax> i buy the decrufting argument, and --disable-xv for server should still work, but unlike a lot of the other bullshit we've deleted we're starting to approach things that people actually use
< daniels> meh, anything other than YUV in requires dealing with the DSP in the X server, and no.
< daniels> ajax: yeah.
< daniels> ajax: consider me talked over.
< ajax> also when i say "on the wire" i mean "between different machines"
< ajax> if client and server are same machine, fix the damn player
< ajax> if they're not the same machine, you're using more bandwidth than you ought to be
< ajax> hopefully in N years everyone will be using gstreamer and we can fix the bottom layer of it at will
< ajax> right, so this sounds like a plan then.
< daniels> indeed.
"""]]